Changes of Revision 34

open5gs_2.4.9.202207300002.dsc -> open5gs_2.4.9.202207310002.dsc Changed
x
 
1
@@ -2,7 +2,7 @@
2
 Source: open5gs
3
 Binary: open5gs-common, open5gs-mme, open5gs-sgwc, open5gs-smf, open5gs-amf, open5gs-sgwu, open5gs-upf, open5gs-hss, open5gs-pcrf, open5gs-nrf, open5gs-ausf, open5gs-udm, open5gs-pcf, open5gs-nssf, open5gs-bsf, open5gs-udr, open5gs, open5gs-dbg
4
 Architecture: any
5
-Version: 2.4.9.202207300002
6
+Version: 2.4.9.202207310002
7
 Maintainer: Harald Welte <laforge@gnumonks.org>
8
 Uploaders: Sukchan Lee <acetcom@gmail.com>
9
 Homepage: https://open5gs.org
10
@@ -30,8 +30,8 @@
11
  open5gs-udr deb net optional arch=any
12
  open5gs-upf deb net optional arch=any
13
 Checksums-Sha1:
14
- 77980f28c4c7640edd516dd022dd79c4f0ebb158 11458864 open5gs_2.4.9.202207300002.tar.xz
15
+ a28d06d3784e02111024e83acffb24e88c535307 11458756 open5gs_2.4.9.202207310002.tar.xz
16
 Checksums-Sha256:
17
- 317b457fe0411a5bfa9972e290ddd1f3603cfbb4a88b3d4c10401112cba2b982 11458864 open5gs_2.4.9.202207300002.tar.xz
18
+ 8200de17d2f92b549d22b01a3e9e26dbe44d07bcc652c193d4b031d3f6832079 11458756 open5gs_2.4.9.202207310002.tar.xz
19
 Files:
20
- 4ac60ee46aaa55337b0836ffdab22247 11458864 open5gs_2.4.9.202207300002.tar.xz
21
+ 3e5f2bbe52529a7dc2756c92a7dfa591 11458756 open5gs_2.4.9.202207310002.tar.xz
22
open5gs_2.4.9.202207300002.tar.xz/debian/changelog -> open5gs_2.4.9.202207310002.tar.xz/debian/changelog Changed
12
 
1
@@ -1,8 +1,8 @@
2
-open5gs (2.4.9.202207300002) UNRELEASED; urgency=medium
3
+open5gs (2.4.9.202207310002) UNRELEASED; urgency=medium
4
 
5
   * Snapshot build
6
 
7
- -- Sukchan Lee <acetcom@gmail.com>  Sat, 30 Jul 2022 00:09:10 +0000
8
+ -- Sukchan Lee <acetcom@gmail.com>  Sun, 31 Jul 2022 00:09:06 +0000
9
 
10
 open5gs (2.4.9) unstable; urgency=medium
11
 
12
open5gs_2.4.9.202207300002.tar.xz/debian/control -> open5gs_2.4.9.202207310002.tar.xz/debian/control Changed
163
 
1
@@ -31,7 +31,7 @@
2
 Package: open5gs-common
3
 Architecture: any
4
 Multi-Arch: same
5
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
6
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
7
          ${misc:Depends}
8
 Description: 5G Core and EPC (Shared Files)
9
  Open5GS is a C-language implementation of 5G Core and EPC
10
@@ -43,7 +43,7 @@
11
 Package: open5gs-mme
12
 Architecture: any
13
 Multi-Arch: same
14
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
15
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
16
          ${misc:Depends},
17
          open5gs-common (= ${binary:Version})
18
 Description: MME (Mobility Management Entity)
19
@@ -58,7 +58,7 @@
20
 Package: open5gs-sgwc
21
 Architecture: any
22
 Multi-Arch: same
23
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
24
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
25
          ${misc:Depends},
26
          open5gs-common (= ${binary:Version})
27
 Description: SGW-C (Serving Gateway - Control Plane)
28
@@ -72,7 +72,7 @@
29
 Package: open5gs-smf
30
 Architecture: any
31
 Multi-Arch: same
32
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
33
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
34
          ${misc:Depends},
35
          open5gs-common (= ${binary:Version})
36
 Description: SMF (Session Management Function)
37
@@ -84,7 +84,7 @@
38
 Package: open5gs-amf
39
 Architecture: any
40
 Multi-Arch: same
41
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
42
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
43
          ${misc:Depends},
44
          open5gs-common (= ${binary:Version})
45
 Description: AMF (Access and Mobility Management Function)
46
@@ -96,7 +96,7 @@
47
 Package: open5gs-sgwu
48
 Architecture: any
49
 Multi-Arch: same
50
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
51
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
52
          ${misc:Depends},
53
          open5gs-common (= ${binary:Version})
54
 Description: SGW-U (Serving Gateway - User Plane)
55
@@ -110,7 +110,7 @@
56
 Package: open5gs-upf
57
 Architecture: any
58
 Multi-Arch: same
59
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
60
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
61
          ${misc:Depends},
62
          udev,
63
          open5gs-common (= ${binary:Version})
64
@@ -123,7 +123,7 @@
65
 Package: open5gs-hss
66
 Architecture: any
67
 Multi-Arch: same
68
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
69
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
70
          ${misc:Depends},
71
          mongodb-org | mongodb,
72
          open5gs-common (= ${binary:Version})
73
@@ -140,7 +140,7 @@
74
 Package: open5gs-pcrf
75
 Architecture: any
76
 Multi-Arch: same
77
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
78
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
79
          ${misc:Depends},
80
          mongodb-org | mongodb,
81
          open5gs-common (= ${binary:Version})
82
@@ -156,7 +156,7 @@
83
 Package: open5gs-nrf
84
 Architecture: any
85
 Multi-Arch: same
86
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
87
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
88
          ${misc:Depends},
89
          open5gs-common (= ${binary:Version})
90
 Description: NRF (Network Repository Function)
91
@@ -168,7 +168,7 @@
92
 Package: open5gs-ausf
93
 Architecture: any
94
 Multi-Arch: same
95
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
96
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
97
          ${misc:Depends},
98
          open5gs-common (= ${binary:Version})
99
 Description: AUSF (Authentication Server Function)
100
@@ -180,7 +180,7 @@
101
 Package: open5gs-udm
102
 Architecture: any
103
 Multi-Arch: same
104
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
105
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
106
          ${misc:Depends},
107
          open5gs-common (= ${binary:Version})
108
 Description: UDM (Unified Data Management)
109
@@ -192,7 +192,7 @@
110
 Package: open5gs-pcf
111
 Architecture: any
112
 Multi-Arch: same
113
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
114
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
115
          ${misc:Depends},
116
          open5gs-common (= ${binary:Version})
117
 Description: PCF (Policy Control Function)
118
@@ -204,7 +204,7 @@
119
 Package: open5gs-nssf
120
 Architecture: any
121
 Multi-Arch: same
122
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
123
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
124
          ${misc:Depends},
125
          open5gs-common (= ${binary:Version})
126
 Description: NSSF (Network Slice Selection Function)
127
@@ -216,7 +216,7 @@
128
 Package: open5gs-bsf
129
 Architecture: any
130
 Multi-Arch: same
131
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
132
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
133
          ${misc:Depends},
134
          open5gs-common (= ${binary:Version})
135
 Description: BSF (Binding Support Function)
136
@@ -228,7 +228,7 @@
137
 Package: open5gs-udr
138
 Architecture: any
139
 Multi-Arch: same
140
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${shlibs:Depends},
141
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${shlibs:Depends},
142
          ${misc:Depends},
143
          open5gs-common (= ${binary:Version})
144
 Description: UDR (Unified Data Repository)
145
@@ -240,7 +240,7 @@
146
 Package: open5gs
147
 Architecture: any
148
 Multi-Arch: same
149
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${misc:Depends},
150
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${misc:Depends},
151
          open5gs-common (= ${binary:Version}),
152
          open5gs-mme (= ${binary:Version}),
153
          open5gs-sgwc (= ${binary:Version}),
154
@@ -266,7 +266,7 @@
155
 Package: open5gs-dbg
156
 Architecture: any
157
 Multi-Arch: same
158
-Depends: osmocom-nightly (= 1.0.0.202207300002), ${misc:Depends},
159
+Depends: osmocom-nightly (= 1.0.0.202207310002), ${misc:Depends},
160
          open5gs (= ${binary:Version})
161
 Description: Debug symbols for Open5GS
162
  Open5GS is a C-language implementation of 5G Core and EPC
163
open5gs_2.4.9.202207300002.tar.xz/lib/diameter/s6a/dict.c -> open5gs_2.4.9.202207310002.tar.xz/lib/diameter/s6a/dict.c Changed
65
 
1
@@ -526,6 +526,63 @@
2
            PARSE_loc_rules( rules, cmd );
3
        }
4
 
5
+       /* Cancel-Location-Request (CLR) Command - 3GPP TS 29.272 #7.2.7 */
6
+       {
7
+           struct dict_object * cmd;
8
+           struct dict_cmd_data data = {
9
+               317,                                                        /* Code */
10
+               "Cancel-Location-Request",                                  /* Name */
11
+               CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR,     /* Fixed flags */
12
+               CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE                       /* Fixed flag values */
13
+           };
14
+           struct local_rules_definition rules =
15
+           {
16
+                {  {                      .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
17
+                {  {                      .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
18
+                {  {                      .avp_name = "Auth-Session-State" }, RULE_REQUIRED, -1, 1 },
19
+                {  {                      .avp_name = "Origin-Host" }, RULE_REQUIRED, -1, 1 },
20
+                {  {                      .avp_name = "Origin-Realm" }, RULE_REQUIRED, -1, 1 },
21
+                {  {                      .avp_name = "Destination-Host" }, RULE_OPTIONAL, -1, 1 },
22
+                {  {                      .avp_name = "Destination-Realm" }, RULE_REQUIRED, -1, 1 },
23
+                {  {                      .avp_name = "User-Name" }, RULE_REQUIRED, -1, 1 },
24
+                {  { .avp_vendor = 10415, .avp_name = "Supported-Features" }, RULE_OPTIONAL, -1, -1 },
25
+                {  { .avp_vendor = 10415, .avp_name = "Cancellation-Type" }, RULE_REQUIRED, -1, -1 },                
26
+                {  { .avp_vendor = 10415, .avp_name = "CLR-Flags" }, RULE_OPTIONAL, -1, 1 },
27
+                {  {                      .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
28
+                {  {                      .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
29
+           };
30
+
31
+           CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
32
+           PARSE_loc_rules( rules, cmd );
33
+       }
34
+
35
+       /* Cancel-Location-Answer (CLA) Command - 3GPP TS 29.272 #7.2.8 */
36
+       {
37
+           struct dict_object * cmd;
38
+           struct dict_cmd_data data = {
39
+               317,                                                    /* Code */
40
+               "Cancel-Location-Answer",                               /* Name */
41
+               CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE | CMD_FLAG_ERROR, /* Fixed flags */
42
+               CMD_FLAG_PROXIABLE                                      /* Fixed flag values */
43
+           };
44
+           struct local_rules_definition rules =
45
+           {
46
+                {  {                      .avp_name = "Session-Id" }, RULE_FIXED_HEAD, -1, 1 },
47
+                {  {                      .avp_name = "Vendor-Specific-Application-Id" }, RULE_OPTIONAL, -1, 1 },
48
+                {  {                      .avp_name = "Result-Code" }, RULE_OPTIONAL, -1, 1 },
49
+                {  {                      .avp_name = "Experimental-Result" }, RULE_OPTIONAL, -1, 1 },
50
+                {  {                      .avp_name = "Auth-Session-State" }, RULE_REQUIRED, -1, 1 },
51
+                {  {                      .avp_name = "Origin-Host" }, RULE_REQUIRED, -1, 1 },
52
+                {  {                      .avp_name = "Origin-Realm" }, RULE_REQUIRED, -1, 1 },
53
+                {  {                      .avp_name = "Failed-AVP" }, RULE_OPTIONAL, -1, -1 },
54
+                {  {                      .avp_name = "Proxy-Info" }, RULE_OPTIONAL, -1, -1 },
55
+                {  {                      .avp_name = "Route-Record" }, RULE_OPTIONAL, -1, -1 },
56
+           };
57
+
58
+           CHECK_dict_new( DICT_COMMAND, &data, s6a, &cmd);
59
+           PARSE_loc_rules( rules, cmd );
60
+       }
61
+
62
     }
63
 
64
     LOG_D( "Extension 'Dictionary definitions for DCCA 3GPP S6A' initialized");
65
open5gs_2.4.9.202207300002.tar.xz/lib/diameter/s6a/message.c -> open5gs_2.4.9.202207310002.tar.xz/lib/diameter/s6a/message.c Changed
29
 
1
@@ -30,9 +30,13 @@
2
 struct dict_object *ogs_diam_s6a_cmd_ula = NULL;
3
 struct dict_object *ogs_diam_s6a_cmd_pur = NULL;
4
 struct dict_object *ogs_diam_s6a_cmd_pua = NULL;
5
+struct dict_object *ogs_diam_s6a_cmd_clr = NULL;
6
+struct dict_object *ogs_diam_s6a_cmd_cla = NULL;
7
 
8
 struct dict_object *ogs_diam_s6a_ulr_flags = NULL;
9
 struct dict_object *ogs_diam_s6a_ula_flags = NULL;
10
+struct dict_object *ogs_diam_s6a_clr_flags = NULL;
11
+struct dict_object *ogs_diam_s6a_cancellation_type = NULL;
12
 struct dict_object *ogs_diam_s6a_subscription_data = NULL;
13
 struct dict_object *ogs_diam_s6a_req_eutran_auth_info = NULL;
14
 struct dict_object *ogs_diam_s6a_number_of_requested_vectors = NULL;
15
@@ -91,9 +95,13 @@
16
     CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Update-Location-Answer", &ogs_diam_s6a_cmd_ula);
17
     CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Purge-UE-Request", &ogs_diam_s6a_cmd_pur);
18
     CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Purge-UE-Answer", &ogs_diam_s6a_cmd_pua);
19
+    CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Cancel-Location-Request", &ogs_diam_s6a_cmd_clr);
20
+    CHECK_dict_search(DICT_COMMAND, CMD_BY_NAME, "Cancel-Location-Answer", &ogs_diam_s6a_cmd_cla);    
21
 
22
     CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "ULR-Flags", &ogs_diam_s6a_ulr_flags);
23
     CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "ULA-Flags", &ogs_diam_s6a_ula_flags);
24
+    CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "CLR-Flags", &ogs_diam_s6a_clr_flags);
25
+    CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Cancellation-Type", &ogs_diam_s6a_cancellation_type);
26
     CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "UE-SRVCC-Capability", &ogs_diam_s6a_ue_srvcc_capability);
27
 
28
     CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Requested-EUTRAN-Authentication-Info", &ogs_diam_s6a_req_eutran_auth_info);
29
open5gs_2.4.9.202207300002.tar.xz/lib/diameter/s6a/message.h -> open5gs_2.4.9.202207310002.tar.xz/lib/diameter/s6a/message.h Changed
41
 
1
@@ -76,9 +76,13 @@
2
 extern struct dict_object *ogs_diam_s6a_cmd_ula;
3
 extern struct dict_object *ogs_diam_s6a_cmd_pur;
4
 extern struct dict_object *ogs_diam_s6a_cmd_pua;
5
+extern struct dict_object *ogs_diam_s6a_cmd_clr;
6
+extern struct dict_object *ogs_diam_s6a_cmd_cla;
7
 
8
 extern struct dict_object *ogs_diam_s6a_ulr_flags;
9
 extern struct dict_object *ogs_diam_s6a_ula_flags;
10
+extern struct dict_object *ogs_diam_s6a_clr_flags;
11
+extern struct dict_object *ogs_diam_s6a_cancellation_type;
12
 extern struct dict_object *ogs_diam_s6a_subscription_data;
13
 extern struct dict_object *ogs_diam_s6a_req_eutran_auth_info;
14
 extern struct dict_object *ogs_diam_s6a_number_of_requested_vectors;
15
@@ -140,8 +144,15 @@
16
     ogs_subscription_data_t subscription_data;
17
 } ogs_diam_s6a_ula_message_t;
18
 
19
+typedef struct ogs_diam_s6a_clr_message_s {
20
+#define OGS_DIAM_S6A_CLR_FLAGS_S6A_S6D_INDICATOR            (1)
21
+#define OGS_DIAM_S6A_CLR_FLAGS_REATTACH_REQUIRED            (1 << 1)
22
+    uint32_t clr_flags;
23
+} ogs_diam_s6a_clr_message_t;
24
+
25
 typedef struct ogs_diam_s6a_message_s {
26
 #define OGS_DIAM_S6A_CMD_CODE_UPDATE_LOCATION               316
27
+#define OGS_DIAM_S6A_CMD_CODE_CANCEL_LOCATION               317
28
 #define OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION    318
29
     uint16_t                        cmd_code;
30
 
31
@@ -157,6 +168,9 @@
32
     uint32_t                        *err;
33
     uint32_t                        *exp_err;
34
 
35
+    bool                            during_attach;
36
+
37
+    ogs_diam_s6a_clr_message_t      clr_message;
38
     ogs_diam_s6a_aia_message_t      aia_message;
39
     ogs_diam_s6a_ula_message_t      ula_message;
40
 } ogs_diam_s6a_message_t;
41
open5gs_2.4.9.202207300002.tar.xz/lib/gtp/xact.h -> open5gs_2.4.9.202207310002.tar.xz/lib/gtp/xact.h Changed
15
 
1
@@ -100,9 +100,10 @@
2
 #define OGS_GTP_DELETE_SEND_DETACH_ACCEPT 2
3
 #define OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST 3
4
 #define OGS_GTP_DELETE_SEND_UE_CONTEXT_RELEASE_COMMAND 4
5
-#define OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST 5
6
-#define OGS_GTP_DELETE_UE_CONTEXT_REMOVE 6
7
-#define OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST 7
8
+#define OGS_GTP_DELETE_SEND_S1_REMOVE_AND_UNLINK 5
9
+#define OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST 6
10
+#define OGS_GTP_DELETE_UE_CONTEXT_REMOVE 7
11
+#define OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST 8
12
     int             delete_action;
13
 
14
 #define OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND     1
15
open5gs_2.4.9.202207300002.tar.xz/src/mme/emm-build.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/emm-build.c Changed
28
 
1
@@ -437,6 +437,26 @@
2
     return nas_eps_security_encode(mme_ue, &message);
3
 }
4
 
5
+ogs_pkbuf_t *emm_build_detach_request(mme_ue_t *mme_ue, uint8_t detach_type)
6
+{
7
+    ogs_nas_eps_message_t message;
8
+
9
+    ogs_assert(mme_ue);
10
+    ogs_assert(detach_type);
11
+
12
+    memset(&message, 0, sizeof(message));
13
+    message.h.security_header_type = 
14
+        OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
15
+    message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM;
16
+
17
+    message.emm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM;
18
+    message.emm.h.message_type = OGS_NAS_EPS_DETACH_REQUEST;
19
+
20
+    message.emm.detach_request_to_ue.detach_type.value = detach_type;
21
+
22
+    return nas_eps_security_encode(mme_ue, &message);
23
+}
24
+
25
 ogs_pkbuf_t *emm_build_detach_accept(mme_ue_t *mme_ue)
26
 {
27
     ogs_nas_eps_message_t message;
28
open5gs_2.4.9.202207300002.tar.xz/src/mme/emm-build.h -> open5gs_2.4.9.202207310002.tar.xz/src/mme/emm-build.h Changed
9
 
1
@@ -37,6 +37,7 @@
2
 ogs_pkbuf_t *emm_build_authentication_request(mme_ue_t *mme_ue);
3
 ogs_pkbuf_t *emm_build_authentication_reject(void);
4
 
5
+ogs_pkbuf_t *emm_build_detach_request(mme_ue_t *mme_ue, uint8_t detach_type);
6
 ogs_pkbuf_t *emm_build_detach_accept(mme_ue_t *mme_ue);
7
 
8
 ogs_pkbuf_t *emm_build_tau_accept(mme_ue_t *mme_ue);
9
open5gs_2.4.9.202207300002.tar.xz/src/mme/emm-handler.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/emm-handler.c Changed
10
 
1
@@ -403,8 +403,6 @@
2
     if (detach_request->detach_type.switch_off)
3
         ogs_debug("    Switch-Off");
4
 
5
-    ogs_info("    IMSI%s", mme_ue->imsi_bcd);
6
-
7
     return OGS_OK;
8
 }
9
 
10
open5gs_2.4.9.202207300002.tar.xz/src/mme/emm-sm.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/emm-sm.c Changed
79
 
1
@@ -530,8 +530,21 @@
2
             }
3
 
4
             if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
5
-                ogs_assert(OGS_OK ==
6
-                    sgsap_send_detach_indication(mme_ue));
7
+                ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue));
8
+            } else {
9
+                mme_send_delete_session_or_detach(mme_ue);
10
+            }
11
+
12
+            OGS_FSM_TRAN(s, &emm_state_de_registered);
13
+            break;
14
+
15
+        case OGS_NAS_EPS_DETACH_ACCEPT:
16
+            ogs_info("%s Detach accept", mme_ue->imsi_bcd);
17
+
18
+            CLEAR_MME_UE_TIMER(mme_ue->t3422);
19
+
20
+            if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
21
+                ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue));
22
             } else {
23
                 mme_send_delete_session_or_detach(mme_ue);
24
             }
25
@@ -587,18 +600,8 @@
26
                         mme_ue->imsi_bcd);
27
                 CLEAR_MME_UE_TIMER(mme_ue->t3413);
28
 
29
-                mme_send_after_paging(mme_ue, OGS_GTP2_CAUSE_UNABLE_TO_PAGE_UE);
30
-
31
-                if (CS_CALL_SERVICE_INDICATOR(mme_ue) ||
32
-                    SMS_SERVICE_INDICATOR(mme_ue)) {
33
-                    ogs_assert(OGS_OK ==
34
-                        sgsap_send_ue_unreachable(mme_ue,
35
-                            SGSAP_SGS_CAUSE_UE_UNREACHABLE));
36
-
37
-                }
38
-    
39
-                CLEAR_SERVICE_INDICATOR(mme_ue);
40
-
41
+                ogs_assert(MME_PAGING_ONGOING(mme_ue));
42
+                mme_send_after_paging(mme_ue, true);
43
             } else {
44
                 mme_ue->t3413.retry_count++;
45
                 /*
46
@@ -617,6 +620,7 @@
47
                         "Stop retransmission");
48
                 OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
49
             } else {
50
+                ogs_assert(mme_ue->t3470.pkbuf);
51
                 rv = nas_eps_send_identity_request(mme_ue);
52
                 if (rv == OGS_OK) {
53
                     mme_ue->t3470.retry_count++;
54
@@ -627,6 +631,24 @@
55
             }
56
             break;
57
 
58
+        case MME_TIMER_T3422:
59
+            if (mme_ue->t3422.retry_count >=
60
+                    mme_timer_cfg(MME_TIMER_T3422)->max_count) {
61
+                ogs_warn("Retransmission of Detach Request failed. "
62
+                        "Stop retransmission");
63
+                OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
64
+            } else {
65
+                ogs_assert(mme_ue->t3422.pkbuf);
66
+                rv = nas_eps_send_detach_request(mme_ue, 0);
67
+                if (rv == OGS_OK) {
68
+                    mme_ue->t3422.retry_count++;
69
+                } else {
70
+                    ogs_error("nas_eps_send_detach_request() failed");
71
+                    OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
72
+                }
73
+            }
74
+            break;            
75
+
76
         default:
77
             ogs_error("Unknown timer%s:%d",
78
                     mme_timer_get_name(e->timer_id), e->timer_id);
79
open5gs_2.4.9.202207300002.tar.xz/src/mme/mme-context.h -> open5gs_2.4.9.202207310002.tar.xz/src/mme/mme-context.h Changed
48
 
1
@@ -451,6 +451,34 @@
2
      (((__mME)->enb_ue == NULL) || (enb_ue_cycle((__mME)->enb_ue) == NULL)))
3
     enb_ue_t        *enb_ue;    /* S1 UE context */
4
 
5
+    struct {
6
+#define MME_CLEAR_PAGING_INFO(__mME) \
7
+    do { \
8
+        ogs_assert(__mME); \
9
+        (__mME)->paging.type = 0; \
10
+    } while(0)
11
+
12
+#define MME_STORE_PAGING_INFO(__mME, __tYPE, __dATA) \
13
+    do { \
14
+        ogs_assert(__mME); \
15
+        ogs_assert(__tYPE); \
16
+        (__mME)->paging.type = __tYPE; \
17
+        (__mME)->paging.data = __dATA; \
18
+    } while(0)
19
+
20
+#define MME_PAGING_ONGOING(__mME) ((__mME) && ((__mME)->paging.type))
21
+
22
+#define MME_PAGING_TYPE_DOWNLINK_DATA_NOTIFICATION 1
23
+#define MME_PAGING_TYPE_CREATE_BEARER 2
24
+#define MME_PAGING_TYPE_UPDATE_BEARER 3
25
+#define MME_PAGING_TYPE_DELETE_BEARER 4
26
+#define MME_PAGING_TYPE_CS_CALL_SERVICE 5
27
+#define MME_PAGING_TYPE_SMS_SERVICE 6
28
+#define MME_PAGING_TYPE_DETACH_TO_UE 7
29
+        int type;
30
+        void *data;
31
+    } paging;
32
+
33
     /* SGW UE context */
34
     sgw_ue_t        *sgw_ue;
35
 
36
@@ -684,9 +712,10 @@
37
     /* Related Context */
38
     mme_ue_t        *mme_ue;
39
     mme_sess_t      *sess;
40
+
41
     struct {
42
         ogs_gtp_xact_t  *xact;
43
-    } create, update, delete, notify, current;
44
+    } create, update, delete, notify;
45
 } mme_bearer_t;
46
 
47
 void mme_context_init(void);
48
open5gs_2.4.9.202207300002.tar.xz/src/mme/mme-fd-path.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/mme-fd-path.c Changed
179
 
1
@@ -20,6 +20,9 @@
2
 #include "mme-event.h"
3
 #include "mme-fd-path.h"
4
 
5
+/* handler for Cancel-Location-Request cb */
6
+static struct disp_hdl *hdl_s6a_clr = NULL;
7
+
8
 static struct session_handler *mme_s6a_reg = NULL;
9
 
10
 struct sess_state {
11
@@ -226,6 +229,7 @@
12
     s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t));
13
     ogs_assert(s6a_message);
14
     s6a_message->cmd_code = OGS_DIAM_S6A_CMD_CODE_AUTHENTICATION_INFORMATION;
15
+    s6a_message->during_attach = true;
16
     aia_message = &s6a_message->aia_message;
17
     ogs_assert(aia_message);
18
     e_utran_vector = &aia_message->e_utran_vector;
19
@@ -634,6 +638,7 @@
20
     s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t));
21
     ogs_assert(s6a_message);
22
     s6a_message->cmd_code = OGS_DIAM_S6A_CMD_CODE_UPDATE_LOCATION;
23
+    s6a_message->during_attach = true;
24
     ula_message = &s6a_message->ula_message;
25
     ogs_assert(ula_message);
26
     subscription_data = &ula_message->subscription_data;
27
@@ -1403,10 +1408,129 @@
28
     return;
29
 }
30
 
31
+/* Callback for incoming Cancel-Location-Request messages */
32
+static int mme_ogs_diam_s6a_clr_cb( struct msg **msg, struct avp *avp,
33
+        struct session *session, void *opaque, enum disp_action *act)
34
+{
35
+    int ret;
36
+    int error = 0;
37
+    
38
+    mme_event_t *e = NULL;
39
+    mme_ue_t *mme_ue = NULL;
40
+
41
+    struct msg *ans, *qry;
42
+    ogs_diam_s6a_clr_message_t *clr_message = NULL;    
43
+
44
+    struct avp_hdr *hdr;
45
+    union avp_value val;
46
+
47
+    char imsi_bcdOGS_MAX_IMSI_BCD_LEN+1;
48
+
49
+    uint32_t result_code = 0;
50
+
51
+    ogs_assert(msg);
52
+
53
+    ogs_diam_s6a_message_t *s6a_message = NULL;
54
+
55
+    ogs_debug("Cancel-Location-Request");
56
+
57
+    s6a_message = ogs_calloc(1, sizeof(ogs_diam_s6a_message_t));
58
+    ogs_assert(s6a_message);
59
+    s6a_message->cmd_code = OGS_DIAM_S6A_CMD_CODE_CANCEL_LOCATION;
60
+    clr_message = &s6a_message->clr_message;
61
+    ogs_assert(clr_message);    
62
+    
63
+
64
+    /* Create answer header */
65
+    qry = *msg;
66
+    ret = fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
67
+    ogs_assert(ret == 0);
68
+    ans = *msg;
69
+
70
+    ret = fd_msg_search_avp(qry, ogs_diam_user_name, &avp);
71
+    ogs_assert(ret == 0);
72
+    ret = fd_msg_avp_hdr(avp, &hdr);
73
+    ogs_assert(ret == 0);
74
+
75
+    ogs_cpystrn(imsi_bcd, (char*)hdr->avp_value->os.data,
76
+        ogs_min(hdr->avp_value->os.len, OGS_MAX_IMSI_BCD_LEN)+1);
77
+
78
+    mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd);
79
+
80
+    if (!mme_ue) {
81
+        ogs_error("Cancel Location for Unknown IMSI%s", imsi_bcd);
82
+        result_code = OGS_DIAM_S6A_ERROR_USER_UNKNOWN;
83
+        error++;
84
+    }
85
+
86
+    ret = fd_msg_search_avp(qry, ogs_diam_s6a_cancellation_type, &avp);
87
+    ogs_assert(ret == 0);
88
+    ret = fd_msg_avp_hdr(avp, &hdr);
89
+    ogs_assert(ret == 0);
90
+
91
+    /* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
92
+    ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
93
+    ogs_assert(ret == 0);
94
+
95
+    /* Set the Auth-Session-State AVP */
96
+    ret = fd_msg_avp_new(ogs_diam_auth_session_state, 0, &avp);
97
+    ogs_assert(ret == 0);
98
+    val.i32 = OGS_DIAM_AUTH_SESSION_NO_STATE_MAINTAINED;
99
+    ret = fd_msg_avp_setvalue(avp, &val);
100
+    ogs_assert(ret == 0);
101
+    ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
102
+    ogs_assert(ret == 0);
103
+
104
+    ret = fd_msg_search_avp(qry, ogs_diam_s6a_clr_flags, &avp);
105
+    ogs_assert(ret == 0);
106
+    if (avp) {
107
+        ret = fd_msg_avp_hdr(avp, &hdr);
108
+        ogs_assert(ret == 0);
109
+        clr_message->clr_flags = hdr->avp_value->i32;
110
+    }
111
+
112
+    /* Set Vendor-Specific-Application-Id AVP */
113
+    ret = ogs_diam_message_vendor_specific_appid_set(
114
+            ans, OGS_DIAM_S6A_APPLICATION_ID);
115
+    ogs_assert(ret == 0);
116
+
117
+    /* Send the answer */
118
+    ret = fd_msg_send(msg, NULL, NULL);
119
+    ogs_assert(ret == 0);
120
+
121
+    ogs_debug("Cancel-Location-Answer");
122
+
123
+    /* Add this value to the stats */
124
+    ogs_assert( pthread_mutex_lock(&ogs_diam_logger_self()->stats_lock) == 0);
125
+    ogs_diam_logger_self()->stats.nb_echoed++;
126
+    ogs_assert( pthread_mutex_unlock(&ogs_diam_logger_self()->stats_lock) == 0);
127
+
128
+    if (!error) {
129
+        int rv;
130
+        e = mme_event_new(MME_EVT_S6A_MESSAGE);
131
+        ogs_assert(e);
132
+        e->mme_ue = mme_ue;
133
+        e->s6a_message = s6a_message;
134
+        rv = ogs_queue_push(ogs_app()->queue, e);
135
+        if (rv != OGS_OK) {
136
+            ogs_error("ogs_queue_push() failed:%d", (int)rv);
137
+            ogs_free(s6a_message);
138
+            mme_event_free(e);
139
+        } else {
140
+            ogs_pollset_notify(ogs_app()->pollset);
141
+        }
142
+    } else {
143
+        ret = ogs_diam_message_experimental_rescode_set(ans, result_code);
144
+        ogs_assert(ret == 0);
145
+    }
146
+
147
+    return 0;
148
+}
149
 
150
 int mme_fd_init(void)
151
 {
152
     int ret;
153
+    struct disp_when data;
154
 
155
     ret = ogs_diam_init(FD_MODE_CLIENT,
156
                 mme_self()->diam_conf_path, mme_self()->diam_config);
157
@@ -1420,6 +1544,12 @@
158
    ret = fd_sess_handler_create(&mme_s6a_reg, &state_cleanup, NULL, NULL);
159
     ogs_assert(ret == 0);
160
 
161
+   /* Specific handler for Cancel-Location-Request */
162
+   data.command = ogs_diam_s6a_cmd_clr;
163
+   ret = fd_disp_register(mme_ogs_diam_s6a_clr_cb, DISP_HOW_CC, &data, NULL,
164
+                &hdl_s6a_clr);
165
+    ogs_assert(ret == 0);    
166
+
167
    /* Advertise the support for the application in the peer */
168
    ret = fd_disp_app_support(ogs_diam_s6a_application, ogs_diam_vendor, 1, 0);
169
     ogs_assert(ret == 0);
170
@@ -1437,5 +1567,8 @@
171
    ret = fd_sess_handler_destroy(&mme_s6a_reg, NULL);
172
     ogs_assert(ret == OGS_OK);
173
 
174
+    if (hdl_s6a_clr)
175
+       (void) fd_disp_unregister(&hdl_s6a_clr, NULL);
176
+
177
     ogs_diam_final();
178
 }
179
open5gs_2.4.9.202207300002.tar.xz/src/mme/mme-path.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/mme-path.c Changed
201
 
1
@@ -19,19 +19,43 @@
2
 
3
 #include "s1ap-path.h"
4
 #include "nas-path.h"
5
+#include "sgsap-path.h"
6
 #include "mme-gtp-path.h"
7
 #include "mme-path.h"
8
+#include "mme-sm.h"
9
 
10
 void mme_send_delete_session_or_detach(mme_ue_t *mme_ue)
11
 {
12
     ogs_assert(mme_ue);
13
 
14
-    if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
15
-        mme_gtp_send_delete_all_sessions(mme_ue,
16
-                OGS_GTP_DELETE_SEND_DETACH_ACCEPT);
17
-    } else {
18
-        ogs_assert(OGS_OK ==
19
-            nas_eps_send_detach_accept(mme_ue));
20
+    switch (mme_ue->nas_eps.type) {
21
+    case MME_EPS_TYPE_DETACH_REQUEST_FROM_UE:
22
+        if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
23
+            mme_gtp_send_delete_all_sessions(
24
+                    mme_ue, OGS_GTP_DELETE_SEND_DETACH_ACCEPT);
25
+        } else {
26
+            ogs_assert(OGS_OK == nas_eps_send_detach_accept(mme_ue));
27
+        }
28
+        break;
29
+    case MME_EPS_TYPE_DETACH_REQUEST_TO_UE:
30
+        if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
31
+            mme_gtp_send_delete_all_sessions(
32
+                    mme_ue, OGS_GTP_DELETE_SEND_S1_REMOVE_AND_UNLINK);
33
+        } else {
34
+            enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue);
35
+            if (enb_ue) {
36
+                ogs_assert(OGS_OK ==
37
+                    s1ap_send_ue_context_release_command(enb_ue,
38
+                        S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
39
+                        S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0));
40
+            } else {
41
+                ogs_warn("%s No S1 Context", mme_ue->imsi_bcd);
42
+            }
43
+        }
44
+        break;
45
+    default:
46
+        ogs_fatal("    Invalid OGS_NAS_EPS TYPE%d", mme_ue->nas_eps.type);
47
+        ogs_assert_if_reached();
48
     }
49
 }
50
 
51
@@ -75,72 +99,131 @@
52
     }
53
 }
54
 
55
-void mme_send_after_paging(mme_ue_t *mme_ue, uint8_t cause_value)
56
+void mme_send_after_paging(mme_ue_t *mme_ue, bool failed)
57
 {
58
-    mme_sess_t *sess = NULL;
59
     mme_bearer_t *bearer = NULL;
60
 
61
     ogs_assert(mme_ue);
62
 
63
-    ogs_list_for_each(&mme_ue->sess_list, sess) {
64
-        ogs_list_for_each(&sess->bearer_list, bearer) {
65
-            ogs_gtp_xact_t *xact = NULL;
66
-            uint8_t type;
67
-
68
-            xact = ogs_gtp_xact_cycle(bearer->current.xact);
69
-            if (xact) {
70
-                /*
71
-                 * It may conflict with GTP transaction already used.
72
-                 * To avoid this, check `xact->step` to see if
73
-                 * the transaction has already been committed.
74
-                 */
75
-                type = xact->seqxact->step-1.type;
76
-
77
-                switch (type) {
78
-                case OGS_GTP2_DOWNLINK_DATA_NOTIFICATION_TYPE:
79
-                    ogs_assert(OGS_OK ==
80
-                        mme_gtp_send_downlink_data_notification_ack(
81
-                            bearer, cause_value));
82
-                    break;
83
-                case OGS_GTP2_CREATE_BEARER_REQUEST_TYPE:
84
-                    if (cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
85
-                        ogs_assert(OGS_OK ==
86
-                        nas_eps_send_activate_dedicated_bearer_context_request(
87
-                                bearer));
88
-                    } else {
89
-                        ogs_assert(OGS_OK ==
90
-                            mme_gtp_send_create_bearer_response(
91
-                                bearer, cause_value));
92
-                    }
93
-                    break;
94
-                case OGS_GTP2_UPDATE_BEARER_REQUEST_TYPE:
95
-                    if (cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
96
-                        ogs_assert(OGS_OK ==
97
-                            nas_eps_send_modify_bearer_context_request(bearer,
98
-                                (xact->update_flags &
99
-                                    OGS_GTP_MODIFY_QOS_UPDATE) ? 1 : 0,
100
-                                (xact->update_flags &
101
-                                    OGS_GTP_MODIFY_TFT_UPDATE) ? 1 : 0));
102
-                    } else {
103
-                        ogs_assert(OGS_OK ==
104
-                            mme_gtp_send_update_bearer_response(
105
-                                bearer, cause_value));
106
-                    }
107
-                    break;
108
-                case OGS_GTP2_DELETE_BEARER_REQUEST_TYPE:
109
-                    if (cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
110
-                        ogs_assert(OGS_OK ==
111
-                        nas_eps_send_deactivate_bearer_context_request(bearer));
112
-                    } else {
113
-                        ogs_assert(OGS_OK ==
114
-                            mme_gtp_send_delete_bearer_response(
115
-                                bearer, cause_value));
116
-                    }
117
-                    break;
118
-                default:
119
-                    break;
120
-                }
121
+    switch (mme_ue->paging.type) {
122
+    case MME_PAGING_TYPE_DOWNLINK_DATA_NOTIFICATION:
123
+        bearer = mme_bearer_cycle(mme_ue->paging.data);
124
+        if (!bearer) {
125
+            ogs_error("No Bearer %d", mme_ue->paging.type);
126
+            goto cleanup;
127
+        }
128
+
129
+        if (failed == true) {
130
+            ogs_assert(OGS_OK ==
131
+                mme_gtp_send_downlink_data_notification_ack(
132
+                    bearer, OGS_GTP2_CAUSE_UNABLE_TO_PAGE_UE));
133
+        } else {
134
+            ogs_assert(OGS_OK ==
135
+                mme_gtp_send_downlink_data_notification_ack(
136
+                    bearer, OGS_GTP2_CAUSE_REQUEST_ACCEPTED));
137
+        }
138
+        break;
139
+    case MME_PAGING_TYPE_CREATE_BEARER:
140
+        bearer = mme_bearer_cycle(mme_ue->paging.data);
141
+        if (!bearer) {
142
+            ogs_error("No Bearer %d", mme_ue->paging.type);
143
+            goto cleanup;
144
+        }
145
+
146
+        if (failed == true) {
147
+            ogs_assert(OGS_OK ==
148
+                mme_gtp_send_create_bearer_response(
149
+                    bearer, OGS_GTP2_CAUSE_UNABLE_TO_PAGE_UE));
150
+        } else {
151
+            ogs_assert(OGS_OK ==
152
+                nas_eps_send_activate_dedicated_bearer_context_request(bearer));
153
+        }
154
+        break;
155
+    case MME_PAGING_TYPE_UPDATE_BEARER:
156
+        bearer = mme_bearer_cycle(mme_ue->paging.data);
157
+        if (!bearer) {
158
+            ogs_error("No Bearer %d", mme_ue->paging.type);
159
+            goto cleanup;
160
+        }
161
+
162
+        if (failed == true) {
163
+            ogs_assert(OGS_OK ==
164
+                mme_gtp_send_update_bearer_response(
165
+                    bearer, OGS_GTP2_CAUSE_UNABLE_TO_PAGE_UE));
166
+        } else {
167
+            ogs_gtp_xact_t *xact = ogs_gtp_xact_cycle(bearer->update.xact);
168
+            if (!xact) {
169
+                ogs_error("No GTP xact");
170
+                goto cleanup;
171
             }
172
+
173
+            ogs_assert(OGS_OK ==
174
+                nas_eps_send_modify_bearer_context_request(bearer,
175
+                    (xact->update_flags &
176
+                        OGS_GTP_MODIFY_QOS_UPDATE) ? 1 : 0,
177
+                    (xact->update_flags &
178
+                        OGS_GTP_MODIFY_TFT_UPDATE) ? 1 : 0));
179
+        }
180
+        break;
181
+    case MME_PAGING_TYPE_DELETE_BEARER:
182
+        bearer = mme_bearer_cycle(mme_ue->paging.data);
183
+        if (!bearer) {
184
+            ogs_error("No Bearer %d", mme_ue->paging.type);
185
+            goto cleanup;
186
+        }
187
+
188
+        if (failed == true) {
189
+            ogs_assert(OGS_OK ==
190
+                mme_gtp_send_delete_bearer_response(
191
+                    bearer, OGS_GTP2_CAUSE_UNABLE_TO_PAGE_UE));
192
+        } else {
193
+            ogs_assert(OGS_OK ==
194
+                nas_eps_send_deactivate_bearer_context_request(bearer));
195
+        }
196
+        break;
197
+    case MME_PAGING_TYPE_CS_CALL_SERVICE:
198
+        if (failed == true) {
199
+            ogs_assert(OGS_OK ==
200
+                sgsap_send_service_request(
201
open5gs_2.4.9.202207300002.tar.xz/src/mme/mme-path.h -> open5gs_2.4.9.202207310002.tar.xz/src/mme/mme-path.h Changed
10
 
1
@@ -30,7 +30,7 @@
2
 void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue);
3
 void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue);
4
 
5
-void mme_send_after_paging(mme_ue_t *mme_ue, uint8_t cause_value);
6
+void mme_send_after_paging(mme_ue_t *mme_ue, bool failed);
7
 
8
 #ifdef __cplusplus
9
 }
10
open5gs_2.4.9.202207300002.tar.xz/src/mme/mme-s11-handler.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/mme-s11-handler.c Changed
85
 
1
@@ -603,6 +603,20 @@
2
                 ogs_error("ENB-S1 Context has already been removed");
3
         }
4
 
5
+    } else if (action == OGS_GTP_DELETE_SEND_S1_REMOVE_AND_UNLINK) {
6
+        if (mme_sess_count(mme_ue) == 1) /* Last Session */ {
7
+            enb_ue_t *enb_ue = NULL;
8
+
9
+            enb_ue = enb_ue_cycle(mme_ue->enb_ue);
10
+            if (enb_ue) {
11
+                ogs_assert(OGS_OK ==
12
+                    s1ap_send_ue_context_release_command(enb_ue,
13
+                        S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
14
+                        S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0));
15
+            } else
16
+                ogs_error("ENB-S1 Context has already been removed");
17
+        }
18
+
19
     } else if (action == OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST) {
20
         if (mme_sess_count(mme_ue) == 1) /* Last Session */ {
21
             rv = nas_eps_send_emm_to_esm(mme_ue,
22
@@ -803,7 +817,6 @@
23
      * If GTP-xact Holding timer is expired,
24
      * OLD bearer->xact memory will be automatically removed.
25
      */
26
-    bearer->current.xact = xact;
27
     bearer->create.xact = xact;
28
 
29
     /* Before Activate DEDICATED bearer, check DEFAULT bearer status */
30
@@ -812,6 +825,8 @@
31
 
32
     if (OGS_FSM_CHECK(&default_bearer->sm, esm_state_active)) {
33
         if (ECM_IDLE(mme_ue)) {
34
+            MME_STORE_PAGING_INFO(mme_ue,
35
+                    MME_PAGING_TYPE_CREATE_BEARER, bearer);
36
             ogs_assert(OGS_OK == s1ap_send_paging(mme_ue, S1AP_CNDomain_ps));
37
         } else {
38
             ogs_assert(OGS_OK ==
39
@@ -904,7 +919,6 @@
40
      * If GTP-xact Holding timer is expired,
41
      * OLD bearer->xact memory will be automatically removed.
42
      */
43
-    bearer->current.xact = xact;
44
     bearer->update.xact = xact;
45
 
46
     if (req->bearer_contexts.bearer_level_qos.presence == 1) {
47
@@ -936,6 +950,8 @@
48
     if (req->bearer_contexts.bearer_level_qos.presence == 1 ||
49
         req->bearer_contexts.tft.presence == 1) {
50
         if (ECM_IDLE(mme_ue)) {
51
+            MME_STORE_PAGING_INFO(mme_ue,
52
+                    MME_PAGING_TYPE_UPDATE_BEARER, bearer);
53
             ogs_assert(OGS_OK == s1ap_send_paging(mme_ue, S1AP_CNDomain_ps));
54
         } else {
55
             ogs_assert(OGS_OK ==
56
@@ -1065,10 +1081,10 @@
57
      * If GTP-xact Holding timer is expired,
58
      * OLD bearer->xact memory will be automatically removed.
59
      */
60
-    bearer->current.xact = xact;
61
     bearer->delete.xact = xact;
62
 
63
     if (ECM_IDLE(mme_ue)) {
64
+        MME_STORE_PAGING_INFO(mme_ue, MME_PAGING_TYPE_DELETE_BEARER, bearer);
65
         ogs_assert(OGS_OK == s1ap_send_paging(mme_ue, S1AP_CNDomain_ps));
66
     } else {
67
         ogs_assert(OGS_OK ==
68
@@ -1293,7 +1309,6 @@
69
      * If GTP-xact Holding timer is expired,
70
      * OLD bearer->xact memory will be automatically removed.
71
      */
72
-    bearer->current.xact = xact;
73
     bearer->notify.xact = xact;
74
 
75
     if (noti->cause.presence) {
76
@@ -1317,6 +1332,8 @@
77
  * before step 9, the MME shall not send S1 interface paging messages
78
  */
79
     if (ECM_IDLE(mme_ue)) {
80
+        MME_STORE_PAGING_INFO(mme_ue,
81
+                MME_PAGING_TYPE_DOWNLINK_DATA_NOTIFICATION, bearer);
82
         ogs_assert(OGS_OK == s1ap_send_paging(mme_ue, S1AP_CNDomain_ps));
83
 
84
     } else if (ECM_CONNECTED(mme_ue)) {
85
open5gs_2.4.9.202207300002.tar.xz/src/mme/mme-s6a-handler.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/mme-s6a-handler.c Changed
35
 
1
@@ -101,3 +101,33 @@
2
     mme_ue->num_of_session = i;
3
     mme_ue->context_identifier = slice_data->context_identifier;
4
 }
5
+
6
+void mme_s6a_handle_clr(mme_ue_t *mme_ue,
7
+        ogs_diam_s6a_clr_message_t *clr_message)
8
+{
9
+    uint8_t detach_type = 0;
10
+
11
+    ogs_assert(mme_ue);
12
+    ogs_assert(clr_message);    
13
+
14
+    /* Set NAS EPS Type */
15
+    mme_ue->nas_eps.type = MME_EPS_TYPE_DETACH_REQUEST_TO_UE;
16
+    ogs_debug("    OGS_NAS_EPS TYPE%d", mme_ue->nas_eps.type);
17
+
18
+    if (clr_message->clr_flags & OGS_DIAM_S6A_CLR_FLAGS_REATTACH_REQUIRED)
19
+        detach_type = OGS_NAS_DETACH_TYPE_TO_UE_RE_ATTACH_REQUIRED;
20
+    else
21
+        detach_type = OGS_NAS_DETACH_TYPE_TO_UE_RE_ATTACH_NOT_REQUIRED;
22
+    
23
+    if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_de_registered)) {
24
+        /* Remove all trace of subscriber even when detached. */
25
+        mme_ue_hash_remove(mme_ue);
26
+        mme_ue_remove(mme_ue);
27
+    } else if (ECM_IDLE(mme_ue)) {
28
+        MME_STORE_PAGING_INFO(mme_ue,
29
+                MME_PAGING_TYPE_DETACH_TO_UE, (void *)(uintptr_t)detach_type);
30
+        ogs_assert(OGS_OK == s1ap_send_paging(mme_ue, S1AP_CNDomain_ps));
31
+    } else {
32
+        ogs_assert(OGS_OK == nas_eps_send_detach_request(mme_ue, detach_type));
33
+    }
34
+}
35
open5gs_2.4.9.202207300002.tar.xz/src/mme/mme-s6a-handler.h -> open5gs_2.4.9.202207310002.tar.xz/src/mme/mme-s6a-handler.h Changed
10
 
1
@@ -30,6 +30,8 @@
2
         ogs_diam_s6a_aia_message_t *aia_message);
3
 void mme_s6a_handle_ula(mme_ue_t *mme_ue,
4
         ogs_diam_s6a_ula_message_t *ula_message);
5
+void mme_s6a_handle_clr(mme_ue_t *mme_ue,
6
+        ogs_diam_s6a_clr_message_t *clr_message);
7
 
8
 #ifdef __cplusplus
9
 }
10
open5gs_2.4.9.202207300002.tar.xz/src/mme/mme-sm.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/mme-sm.c Changed
87
 
1
@@ -437,40 +437,42 @@
2
         s6a_message = e->s6a_message;
3
         ogs_assert(s6a_message);
4
 
5
-        enb_ue = enb_ue_cycle(mme_ue->enb_ue);
6
-        if (!enb_ue) {
7
-            ogs_error("S1 context has already been removed");
8
-
9
-            ogs_subscription_data_free(
10
-                    &s6a_message->ula_message.subscription_data);
11
-            ogs_free(s6a_message);
12
-            break;
13
-        }
14
+        if (s6a_message->during_attach) {
15
+            enb_ue = enb_ue_cycle(mme_ue->enb_ue);
16
+            if (!enb_ue) {
17
+                ogs_error("S1 context has already been removed");
18
+
19
+                ogs_subscription_data_free(
20
+                        &s6a_message->ula_message.subscription_data);
21
+                ogs_free(s6a_message);
22
+                break;
23
+            }
24
 
25
-        if (s6a_message->result_code != ER_DIAMETER_SUCCESS) {
26
-            /* Unfortunately fd doesn't distinguish
27
-             * between result-code and experimental-result-code.
28
-             *
29
-             * However, e.g. 5004 has different meaning
30
-             * if used in result-code than in experimental-result-code */
31
-            uint8_t emm_cause = emm_cause_from_diameter(
32
-                    mme_ue, s6a_message->err, s6a_message->exp_err);
33
-
34
-            ogs_info("%s Attach reject OGS_NAS_EMM_CAUSE:%d",
35
-                    mme_ue->imsi_bcd, emm_cause);
36
-            ogs_assert(OGS_OK ==
37
-                nas_eps_send_attach_reject(mme_ue,
38
-                    emm_cause, OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
39
-
40
-            ogs_assert(OGS_OK ==
41
-                s1ap_send_ue_context_release_command(enb_ue,
42
-                    S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
43
-                    S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
44
-
45
-            ogs_subscription_data_free(
46
-                    &s6a_message->ula_message.subscription_data);
47
-            ogs_free(s6a_message);
48
-            break;
49
+            if (s6a_message->result_code != ER_DIAMETER_SUCCESS) {
50
+                /* Unfortunately fd doesn't distinguish
51
+                * between result-code and experimental-result-code.
52
+                *
53
+                * However, e.g. 5004 has different meaning
54
+                * if used in result-code than in experimental-result-code */
55
+                uint8_t emm_cause = emm_cause_from_diameter(
56
+                        mme_ue, s6a_message->err, s6a_message->exp_err);
57
+
58
+                ogs_info("%s Attach reject OGS_NAS_EMM_CAUSE:%d",
59
+                        mme_ue->imsi_bcd, emm_cause);
60
+                ogs_assert(OGS_OK ==
61
+                    nas_eps_send_attach_reject(mme_ue, emm_cause,
62
+                        OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
63
+
64
+                ogs_assert(OGS_OK ==
65
+                    s1ap_send_ue_context_release_command(enb_ue,
66
+                        S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
67
+                        S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
68
+
69
+                ogs_subscription_data_free(
70
+                        &s6a_message->ula_message.subscription_data);
71
+                ogs_free(s6a_message);
72
+                break;
73
+            }
74
         }
75
 
76
         switch (s6a_message->cmd_code) {
77
@@ -504,6 +506,9 @@
78
                 ogs_assert_if_reached();
79
             }
80
             break;
81
+        case OGS_DIAM_S6A_CMD_CODE_CANCEL_LOCATION:
82
+            mme_s6a_handle_clr(mme_ue, &s6a_message->clr_message);
83
+            break;
84
         default:
85
             ogs_error("Invalid Type%d", s6a_message->cmd_code);
86
             break;
87
open5gs_2.4.9.202207300002.tar.xz/src/mme/nas-path.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/nas-path.c Changed
35
 
1
@@ -256,6 +256,33 @@
2
     return rv;
3
 }
4
 
5
+int nas_eps_send_detach_request(mme_ue_t *mme_ue, uint8_t detach_type)
6
+{
7
+    int rv;
8
+    ogs_pkbuf_t *emmbuf = NULL;
9
+
10
+    ogs_debug("%s Detach request to UE", mme_ue->imsi_bcd);
11
+
12
+    if (mme_ue->t3422.pkbuf) {
13
+        emmbuf = mme_ue->t3422.pkbuf;
14
+        ogs_expect_or_return_val(emmbuf, OGS_ERROR);
15
+    } else {
16
+        ogs_assert(detach_type);
17
+        emmbuf = emm_build_detach_request(mme_ue, detach_type);
18
+        ogs_expect_or_return_val(emmbuf, OGS_ERROR);
19
+    }
20
+
21
+    mme_ue->t3422.pkbuf = ogs_pkbuf_copy(emmbuf);
22
+    ogs_expect_or_return_val(mme_ue->t3422.pkbuf, OGS_ERROR);
23
+    ogs_timer_start(mme_ue->t3422.timer, 
24
+            mme_timer_cfg(MME_TIMER_T3422)->duration);    
25
+
26
+    rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
27
+    ogs_expect_or_return_val(rv == OGS_OK, rv);
28
+
29
+    return rv;
30
+}
31
+
32
 int nas_eps_send_detach_accept(mme_ue_t *mme_ue)
33
 {
34
     int rv;
35
open5gs_2.4.9.202207300002.tar.xz/src/mme/nas-path.h -> open5gs_2.4.9.202207310002.tar.xz/src/mme/nas-path.h Changed
9
 
1
@@ -43,6 +43,7 @@
2
 
3
 int nas_eps_send_security_mode_command(mme_ue_t *mme_ue);
4
 
5
+int nas_eps_send_detach_request(mme_ue_t *mme_ue, uint8_t detach_type);
6
 int nas_eps_send_detach_accept(mme_ue_t *mme_ue);
7
 
8
 int nas_eps_send_pdn_connectivity_reject(
9
open5gs_2.4.9.202207300002.tar.xz/src/mme/s1ap-handler.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/s1ap-handler.c Changed
19
 
1
@@ -764,15 +764,8 @@
2
         }
3
     }
4
 
5
-    if (mme_ue->nas_eps.type != MME_EPS_TYPE_ATTACH_REQUEST)
6
-        mme_send_after_paging(mme_ue, OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
7
-
8
-    if (SMS_SERVICE_INDICATOR(mme_ue)) {
9
-        ogs_assert(OGS_OK ==
10
-            sgsap_send_service_request(mme_ue, SGSAP_EMM_CONNECTED_MODE));
11
-    }
12
-
13
-    CLEAR_SERVICE_INDICATOR(mme_ue);
14
+    if (MME_PAGING_ONGOING(mme_ue))
15
+        mme_send_after_paging(mme_ue, false);
16
 }
17
 
18
 void s1ap_handle_initial_context_setup_failure(
19
open5gs_2.4.9.202207300002.tar.xz/src/mme/sgsap-build.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/sgsap-build.c Changed
9
 
1
@@ -19,7 +19,6 @@
2
 
3
 #include "mme-context.h"
4
 
5
-#include "sgsap-types.h"
6
 #include "sgsap-build.h"
7
 #include "sgsap-conv.h"
8
 
9
open5gs_2.4.9.202207300002.tar.xz/src/mme/sgsap-build.h -> open5gs_2.4.9.202207310002.tar.xz/src/mme/sgsap-build.h Changed
10
 
1
@@ -22,6 +22,8 @@
2
 
3
 #include "mme-context.h"
4
 
5
+#include "sgsap-types.h"
6
+
7
 #ifdef __cplusplus
8
 extern "C" {
9
 #endif
10
open5gs_2.4.9.202207300002.tar.xz/src/mme/sgsap-handler.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/sgsap-handler.c Changed
17
 
1
@@ -352,11 +352,15 @@
2
         if (ECM_IDLE(mme_ue)) {
3
             if (CS_CALL_SERVICE_INDICATOR(mme_ue)) {
4
                 /* UE will respond Extended Service Request in PS CNDomain*/
5
+                MME_STORE_PAGING_INFO(mme_ue,
6
+                        MME_PAGING_TYPE_CS_CALL_SERVICE, NULL);
7
                 ogs_assert(OGS_OK ==
8
                     s1ap_send_paging(mme_ue, S1AP_CNDomain_cs));
9
 
10
             } else if (SMS_SERVICE_INDICATOR(mme_ue)) {
11
                 /* UE will respond Service Request in PS CNDomain*/
12
+                MME_STORE_PAGING_INFO(mme_ue,
13
+                        MME_PAGING_TYPE_SMS_SERVICE, NULL);
14
                 ogs_assert(OGS_OK ==
15
                     s1ap_send_paging(mme_ue, S1AP_CNDomain_ps));
16
             } else
17
open5gs_2.4.9.202207300002.tar.xz/src/mme/sgsap-path.c -> open5gs_2.4.9.202207310002.tar.xz/src/mme/sgsap-path.c Changed
17
 
1
@@ -22,8 +22,6 @@
2
 #include "mme-event.h"
3
 #include "mme-sm.h"
4
 
5
-#include "sgsap-types.h"
6
-#include "sgsap-build.h"
7
 #include "sgsap-path.h"
8
 
9
 int sgsap_open()
10
@@ -251,4 +249,4 @@
11
     ogs_expect(rv == OGS_OK);
12
 
13
     return rv;
14
-}
15
\ No newline at end of file
16
+}
17
open5gs_2.4.9.202207300002.tar.xz/src/mme/sgsap-path.h -> open5gs_2.4.9.202207310002.tar.xz/src/mme/sgsap-path.h Changed
10
 
1
@@ -23,6 +23,8 @@
2
 #include "mme-context.h"
3
 #include "mme-event.h"
4
 
5
+#include "sgsap-build.h"
6
+
7
 #ifdef __cplusplus
8
 extern "C" {
9
 #endif
10