Changes of Revision 28

open5gs_2.4.8.202207240002.dsc -> open5gs_2.4.8.202207250002.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.8.202207240002
6
+Version: 2.4.8.202207250002
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
- a817c7bb979ac93ae6ddced2415884bea86d2ab9 11456572 open5gs_2.4.8.202207240002.tar.xz
15
+ 8fc909756d2593e0d8d4e67eee0b2c74eb2c01f5 11457528 open5gs_2.4.8.202207250002.tar.xz
16
 Checksums-Sha256:
17
- ff8a9228b5067fd8aadd1f09aee880d0102e3e64553a720fde146817eed1b77c 11456572 open5gs_2.4.8.202207240002.tar.xz
18
+ 0434cbed773ff92d587b1f282d413f45da1fead1eb6d9176cebe9668856cdf75 11457528 open5gs_2.4.8.202207250002.tar.xz
19
 Files:
20
- 5a47aa968aad5e630cc2f600472174c6 11456572 open5gs_2.4.8.202207240002.tar.xz
21
+ 7eb7efce92ad40619d1f254e4e9b3dee 11457528 open5gs_2.4.8.202207250002.tar.xz
22
open5gs_2.4.8.202207240002.tar.xz/configs/sample.yaml.in -> open5gs_2.4.8.202207250002.tar.xz/configs/sample.yaml.in Changed
44
 
1
@@ -200,33 +200,33 @@
2
 #
3
 #  <SBI Client>>
4
 #
5
-#  o SBI Client(http://127.0.0.10:7777)
6
+#  o SBI Client(http://127.0.1.10:7777)
7
 #    sbi:
8
-#      addr: 127.0.0.10
9
+#      addr: 127.0.1.10
10
 #      port: 7777
11
 #
12
-#  o SBI Client(https://127.0.0.10:443, http://scp.open5gs.org:80)
13
+#  o SBI Client(https://127.0.1.10:443, http://scp.open5gs.org:80)
14
 #    sbi:
15
-#      - addr: 127.0.0.10
16
+#      - addr: 127.0.1.10
17
 #        tls:
18
 #          key: scp.key
19
 #          pem: scp.pem
20
 #      - name: scp.open5gs.org
21
 #
22
-#  o SBI Client(http://fd69:f21d:873c:fa::1:80)
23
-#    If prefer_ipv4 is true, http://127.0.0.10:80 is selected.
24
+#  o SBI Client(http://fd69:f21d:873c:fb::1:80)
25
+#    If prefer_ipv4 is true, http://127.0.1.10:80 is selected.
26
 #
27
 #    sbi:
28
 #      addr:
29
-#        - 127.0.0.10
30
-#        - fd69:f21d:873c:fa::1
31
+#        - 127.0.1.10
32
+#        - fd69:f21d:873c:fb::1
33
 #
34
 #  o SBI Option (Default)
35
 #    - tcp_nodelay : true
36
 #    - so_linger.l_onoff : false
37
 #
38
 #    sbi:
39
-#      addr: 127.0.0.10
40
+#      addr: 127.0.1.10
41
 #      option:
42
 #        tcp_nodelay: false
43
 #        so_linger:
44
open5gs_2.4.8.202207240002.tar.xz/debian/changelog -> open5gs_2.4.8.202207250002.tar.xz/debian/changelog Changed
12
 
1
@@ -1,8 +1,8 @@
2
-open5gs (2.4.8.202207240002) UNRELEASED; urgency=medium
3
+open5gs (2.4.8.202207250002) UNRELEASED; urgency=medium
4
 
5
   * Snapshot build
6
 
7
- -- Sukchan Lee <acetcom@gmail.com>  Sun, 24 Jul 2022 00:09:15 +0000
8
+ -- Sukchan Lee <acetcom@gmail.com>  Mon, 25 Jul 2022 00:09:22 +0000
9
 
10
 open5gs (2.4.8) unstable; urgency=medium
11
 
12
open5gs_2.4.8.202207240002.tar.xz/debian/control -> open5gs_2.4.8.202207250002.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.202207240002), ${shlibs:Depends},
6
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
15
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
24
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
33
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
42
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
51
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
60
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
69
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
78
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
87
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
96
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
105
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
114
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
123
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
132
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${shlibs:Depends},
141
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${misc:Depends},
150
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.202207240002), ${misc:Depends},
159
+Depends: osmocom-nightly (= 1.0.0.202207250002), ${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.8.202207240002.tar.xz/lib/app/ogs-context.c -> open5gs_2.4.8.202207250002.tar.xz/lib/app/ogs-context.c Changed
74
 
1
@@ -64,38 +64,27 @@
2
 
3
 static void recalculate_pool_size(void)
4
 {
5
+    self.pool.packet = self.max.ue * OGS_MAX_NUM_OF_PACKET_BUFFER;
6
+
7
 #define MAX_NUM_OF_TUNNEL       3   /* Num of Tunnel per Bearer */
8
     self.pool.sess = self.max.ue * OGS_MAX_NUM_OF_SESS;
9
     self.pool.bearer = self.pool.sess * OGS_MAX_NUM_OF_BEARER;
10
     self.pool.tunnel = self.pool.bearer * MAX_NUM_OF_TUNNEL;
11
 
12
-#define MAX_NUM_OF_TIMER        16
13
-    self.pool.timer = self.max.ue * MAX_NUM_OF_TIMER;
14
-#define MAX_NUM_OF_MESSAGE      16
15
-    self.pool.message = self.max.ue * MAX_NUM_OF_MESSAGE;
16
-#define MAX_NUM_OF_EVENT        16
17
-    self.pool.event = self.max.ue * MAX_NUM_OF_EVENT;
18
+#define OGS_MAX_NUM_OF_NF_SUBSCRIPTION  4 /* Num of Subscription per NF */
19
+    self.pool.nf_service = self.max.gnb * OGS_MAX_NUM_OF_NF_SERVICE;
20
 
21
-    self.pool.packet = self.max.ue * OGS_MAX_NUM_OF_PACKET_BUFFER;
22
+#define POOL_NUM_PER_UE 16
23
+#define POOL_NUM_PER_GNB 8
24
+    self.pool.timer = self.max.ue * POOL_NUM_PER_UE;
25
+    self.pool.message = self.max.ue * POOL_NUM_PER_UE;
26
+    self.pool.event = self.max.ue * POOL_NUM_PER_UE;
27
+    self.pool.socket = self.max.ue * POOL_NUM_PER_UE;
28
+    self.pool.subscription = self.max.ue * POOL_NUM_PER_UE;
29
+    self.pool.xact = self.max.ue * POOL_NUM_PER_UE;
30
 
31
     self.pool.nf = self.max.gnb;
32
 
33
-#define MAX_NUM_OF_SOCKET       8
34
-    self.pool.socket = self.max.ue * MAX_NUM_OF_SOCKET;
35
-
36
-#define MAX_NUM_OF_XACT         8
37
-    self.pool.gtp_xact = self.max.ue * MAX_NUM_OF_XACT;
38
-    self.pool.gtp_node = self.max.gtp_peer;
39
-
40
-    self.pool.pfcp_xact = self.max.ue * MAX_NUM_OF_XACT;
41
-    self.pool.pfcp_node = self.pool.nf;
42
-
43
-#define MAX_NUM_OF_NF_SERVICE   16  /* Num of NF Service per NF Instance */
44
-#define MAX_NUM_OF_SBI_MESSAGE  4   /* Num of HTTP(s) Request/Response per NF */
45
-#define MAX_NUM_OF_NF_SUBSCRIPTION  4 /* Num of Subscription per NF */
46
-    self.pool.nf_service = self.pool.nf * MAX_NUM_OF_NF_SERVICE;
47
-    self.pool.nf_subscription = self.pool.nf * MAX_NUM_OF_NF_SUBSCRIPTION;
48
-
49
 #define MAX_CSMAP_POOL          128
50
     self.pool.csmap = MAX_CSMAP_POOL;   /* Num of TAI-LAI Mapping Table */
51
 
52
@@ -192,11 +181,9 @@
53
 
54
 #define MAX_NUM_OF_UE               1024    /* Num of UE per AMF/MME */
55
 #define MAX_NUM_OF_GNB              64      /* Num of gNB per AMF/MME */
56
-#define MAX_NUM_OF_GTP_PEER         64      /* Num of gtp_node per SGW/PGW */
57
 
58
     self.max.gnb = MAX_NUM_OF_GNB;
59
     self.max.ue = MAX_NUM_OF_UE;
60
-    self.max.gtp_peer = MAX_NUM_OF_GTP_PEER;
61
 
62
     ogs_pkbuf_default_init(&self.pool.defconfig);
63
 
64
@@ -444,9 +431,6 @@
65
                             !strcmp(max_key, "enb")) {
66
                     const char *v = ogs_yaml_iter_value(&max_iter);
67
                     if (v) self.max.gnb = atoi(v);
68
-                } else if (!strcmp(max_key, "gtp_peer")) {
69
-                    const char *v = ogs_yaml_iter_value(&max_iter);
70
-                    if (v) self.max.gtp_peer = atoi(v);
71
                 } else
72
                     ogs_warn("unknown key `%s`", max_key);
73
             }
74
open5gs_2.4.8.202207240002.tar.xz/lib/app/ogs-context.h -> open5gs_2.4.8.202207250002.tar.xz/lib/app/ogs-context.h Changed
38
 
1
@@ -109,27 +109,25 @@
2
 
3
     struct {
4
         ogs_pkbuf_config_t defconfig;
5
-        uint64_t packet;
6
 
7
-        uint64_t nf;
8
+        uint64_t packet;
9
 
10
         uint64_t sess;
11
         uint64_t bearer;
12
         uint64_t tunnel;
13
-        uint64_t nf_service;
14
-        uint64_t nf_subscription;
15
 
16
-        uint64_t csmap;
17
+        uint64_t nf_service;
18
 
19
+        uint64_t timer;
20
         uint64_t message;
21
         uint64_t event;
22
-        uint64_t timer;
23
-
24
         uint64_t socket;
25
-        uint64_t gtp_xact;
26
-        uint64_t gtp_node;
27
-        uint64_t pfcp_xact;
28
-        uint64_t pfcp_node;
29
+        uint64_t subscription;
30
+        uint64_t xact;
31
+
32
+        uint64_t nf;
33
+
34
+        uint64_t csmap;
35
 
36
         uint64_t impi;
37
         uint64_t impu;
38
open5gs_2.4.8.202207240002.tar.xz/lib/core/ogs-3gpp-types.h -> open5gs_2.4.8.202207250002.tar.xz/lib/core/ogs-3gpp-types.h Changed
30
 
1
@@ -33,6 +33,9 @@
2
 #define OGS_BEARER_PER_UE               8   /* Num of Bearer per UE */
3
 #define OGS_MAX_NUM_OF_PACKET_BUFFER    64  /* Num of PacketBuffer per UE */
4
 
5
+/* Num of NF Service per NF Instance */
6
+#define OGS_MAX_NUM_OF_NF_SERVICE       16
7
+
8
 /*
9
  * The array of TLV messages is limited to 8.
10
  * So, Flow(PDI.SDF_Filter) in PDR is limited to 8.
11
@@ -56,6 +59,8 @@
12
 #define OGS_PLMN_ID_LEN                 3
13
 #define OGS_MAX_PLMN_ID_BCD_LEN         6
14
 
15
+#define OGS_CHRGCHARS_LEN               2
16
+
17
 #define OGS_BCD_TO_BUFFER_LEN(x)        (((x)+1)/2)
18
 #define OGS_MAX_IMSI_BCD_LEN            15
19
 #define OGS_MAX_IMSI_LEN                \
20
@@ -453,6 +458,9 @@
21
     uint32_t context_identifier; /* EPC */
22
     bool default_dnn_indicator; /* 5GC */
23
 
24
+    uint8_t charging_characteristicsOGS_CHRGCHARS_LEN;
25
+    bool charging_characteristics_presence;
26
+
27
 #define OGS_PDU_SESSION_TYPE_IPV4                   1
28
 #define OGS_PDU_SESSION_TYPE_IPV6                   2
29
 #define OGS_PDU_SESSION_TYPE_IPV4V6                 3
30
open5gs_2.4.8.202207240002.tar.xz/lib/diameter/s6a/message.c -> open5gs_2.4.8.202207250002.tar.xz/lib/diameter/s6a/message.c Changed
17
 
1
@@ -57,6 +57,7 @@
2
 struct dict_object *ogs_diam_s6a_max_bandwidth_ul = NULL;
3
 struct dict_object *ogs_diam_s6a_max_bandwidth_dl = NULL;
4
 struct dict_object *ogs_diam_s6a_pdn_type = NULL;
5
+struct dict_object *ogs_diam_s6a_3gpp_charging_characteristics = NULL;
6
 struct dict_object *ogs_diam_s6a_served_party_ip_address = NULL;
7
 struct dict_object *ogs_diam_s6a_eps_subscribed_qos_profile = NULL;
8
 struct dict_object *ogs_diam_s6a_qos_class_identifier = NULL;
9
@@ -125,6 +126,7 @@
10
     CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "All-APN-Configurations-Included-Indicator", &ogs_diam_s6a_all_apn_configuration_included_indicator);
11
     CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Configuration", &ogs_diam_s6a_apn_configuration);
12
     CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PDN-Type", &ogs_diam_s6a_pdn_type);
13
+    CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-Charging-Characteristics", &ogs_diam_s6a_3gpp_charging_characteristics);
14
     CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Served-Party-IP-Address", &ogs_diam_s6a_served_party_ip_address);
15
     CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscription-Data", &ogs_diam_s6a_subscription_data);
16
     CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscriber-Status", &ogs_diam_s6a_subscriber_status);
17
open5gs_2.4.8.202207240002.tar.xz/lib/diameter/s6a/message.h -> open5gs_2.4.8.202207250002.tar.xz/lib/diameter/s6a/message.h Changed
9
 
1
@@ -103,6 +103,7 @@
2
 extern struct dict_object *ogs_diam_s6a_max_bandwidth_ul;
3
 extern struct dict_object *ogs_diam_s6a_max_bandwidth_dl;
4
 extern struct dict_object *ogs_diam_s6a_pdn_type;
5
+extern struct dict_object *ogs_diam_s6a_3gpp_charging_characteristics;
6
 extern struct dict_object *ogs_diam_s6a_served_party_ip_address;
7
 extern struct dict_object *ogs_diam_s6a_eps_subscribed_qos_profile;
8
 extern struct dict_object *ogs_diam_s6a_qos_class_identifier;
9
open5gs_2.4.8.202207240002.tar.xz/lib/gtp/context.c -> open5gs_2.4.8.202207250002.tar.xz/lib/gtp/context.c Changed
10
 
1
@@ -35,7 +35,7 @@
2
 
3
     ogs_log_install_domain(&__ogs_gtp_domain, "gtp", ogs_core()->log.level);
4
 
5
-    ogs_pool_init(&pool, ogs_app()->pool.gtp_node);
6
+    ogs_pool_init(&pool, ogs_app()->pool.nf);
7
     ogs_pool_init(&ogs_gtpu_resource_pool, num_of_gtpu_resource);
8
 
9
     context_initialized = 1;
10
open5gs_2.4.8.202207240002.tar.xz/lib/gtp/xact.c -> open5gs_2.4.8.202207250002.tar.xz/lib/gtp/xact.c Changed
10
 
1
@@ -48,7 +48,7 @@
2
 {
3
     ogs_assert(ogs_gtp_xact_initialized == 0);
4
 
5
-    ogs_pool_init(&pool, ogs_app()->pool.gtp_xact);
6
+    ogs_pool_init(&pool, ogs_app()->pool.xact);
7
 
8
     g_xact_id = 0;
9
 
10
open5gs_2.4.8.202207240002.tar.xz/lib/pfcp/context.c -> open5gs_2.4.8.202207250002.tar.xz/lib/pfcp/context.c Changed
10
 
1
@@ -48,7 +48,7 @@
2
 
3
     ogs_log_install_domain(&__ogs_pfcp_domain, "pfcp", ogs_core()->log.level);
4
 
5
-    ogs_pool_init(&ogs_pfcp_node_pool, ogs_app()->pool.pfcp_node);
6
+    ogs_pool_init(&ogs_pfcp_node_pool, ogs_app()->pool.nf);
7
 
8
     ogs_pool_init(&ogs_pfcp_sess_pool, ogs_app()->pool.sess);
9
 
10
open5gs_2.4.8.202207240002.tar.xz/lib/pfcp/xact.c -> open5gs_2.4.8.202207250002.tar.xz/lib/pfcp/xact.c Changed
10
 
1
@@ -53,7 +53,7 @@
2
 {
3
     ogs_assert(ogs_pfcp_xact_initialized == 0);
4
 
5
-    ogs_pool_init(&pool, ogs_app()->pool.pfcp_xact);
6
+    ogs_pool_init(&pool, ogs_app()->pool.xact);
7
 
8
     g_xact_id = 0;
9
 
10
open5gs_2.4.8.202207240002.tar.xz/lib/sbi/context.c -> open5gs_2.4.8.202207250002.tar.xz/lib/sbi/context.c Changed
135
 
1
@@ -50,10 +50,10 @@
2
     ogs_pool_init(&nf_instance_pool, ogs_app()->pool.nf);
3
     ogs_pool_init(&nf_service_pool, ogs_app()->pool.nf_service);
4
 
5
-    ogs_pool_init(&xact_pool, ogs_app()->pool.message);
6
+    ogs_pool_init(&xact_pool, ogs_app()->pool.xact);
7
 
8
     ogs_list_init(&self.subscription_list);
9
-    ogs_pool_init(&subscription_pool, ogs_app()->pool.nf_subscription);
10
+    ogs_pool_init(&subscription_pool, ogs_app()->pool.subscription);
11
 
12
     ogs_pool_init(&smf_info_pool, ogs_app()->pool.nf);
13
 
14
@@ -1323,41 +1323,48 @@
15
         nf_service_associate_client(nf_service);
16
 }
17
 
18
-void ogs_sbi_select_nf(
19
-        ogs_sbi_object_t *sbi_object, OpenAPI_nf_type_e nf_type, void *state)
20
+bool ogs_sbi_discovery_param_is_matched(
21
+        ogs_sbi_nf_instance_t *nf_instance,
22
+        OpenAPI_nf_type_e target_nf_type,
23
+        ogs_sbi_discovery_option_t *discovery_option)
24
 {
25
-    ogs_sbi_nf_instance_t *nf_instance = NULL;
26
+    ogs_assert(nf_instance);
27
+    ogs_assert(ogs_sbi_self()->nf_state_registered);
28
+    ogs_assert(target_nf_type);
29
 
30
-    ogs_assert(sbi_object);
31
-    ogs_assert(nf_type);
32
-    ogs_assert(state);
33
+    if (!OGS_FSM_CHECK(&nf_instance->sm,
34
+            ogs_sbi_self()->nf_state_registered)) return false;
35
 
36
-    ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) {
37
-        if (OGS_FSM_CHECK(&nf_instance->sm, state) &&
38
-            nf_instance->nf_type == nf_type) {
39
-            OGS_SBI_SETUP_NF(sbi_object, nf_type, nf_instance);
40
-            break;
41
-        }
42
+    if (nf_instance->nf_type != target_nf_type) return false;
43
+
44
+    if (discovery_option) {
45
+        if (discovery_option->target_nf_instance_id &&
46
+            strcmp(nf_instance->id,
47
+                discovery_option->target_nf_instance_id) != 0)
48
+            return false;
49
     }
50
+
51
+    return true;
52
 }
53
 
54
-void ogs_sbi_select_nf_by_instanceid(
55
-        ogs_sbi_object_t *sbi_object, OpenAPI_nf_type_e nf_type, void *state,
56
-        char *nf_instance_id)
57
+void ogs_sbi_select_nf(
58
+        ogs_sbi_object_t *sbi_object,
59
+        OpenAPI_nf_type_e target_nf_type,
60
+        ogs_sbi_discovery_option_t *discovery_option)
61
 {
62
     ogs_sbi_nf_instance_t *nf_instance = NULL;
63
 
64
+    ogs_assert(ogs_sbi_self()->nf_state_registered);
65
     ogs_assert(sbi_object);
66
-    ogs_assert(nf_type);
67
-    ogs_assert(state);
68
+    ogs_assert(target_nf_type);
69
 
70
     ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) {
71
-        if (OGS_FSM_CHECK(&nf_instance->sm, state) &&
72
-            (nf_instance->nf_type == nf_type) &&
73
-            (!(strcmp(nf_instance->id, nf_instance_id)))) {
74
-            OGS_SBI_SETUP_NF(sbi_object, nf_type, nf_instance);
75
-            break;
76
-        }
77
+        if (ogs_sbi_discovery_param_is_matched(
78
+                    nf_instance, target_nf_type, discovery_option) == false)
79
+            continue;
80
+
81
+        OGS_SBI_SETUP_NF(sbi_object, target_nf_type, nf_instance);
82
+        break;
83
     }
84
 }
85
 
86
@@ -1423,21 +1430,25 @@
87
 }
88
 
89
 ogs_sbi_xact_t *ogs_sbi_xact_add(
90
-        OpenAPI_nf_type_e target_nf_type, ogs_sbi_object_t *sbi_object,
91
-        ogs_sbi_build_f build, void *context, void *data,
92
-        void (*timer_cb)(void *data))
93
+        ogs_sbi_object_t *sbi_object,
94
+        OpenAPI_nf_type_e target_nf_type,
95
+        ogs_sbi_discovery_option_t *discovery_option,
96
+        ogs_sbi_build_f build, void *context, void *data)
97
 {
98
     ogs_sbi_xact_t *xact = NULL;
99
 
100
+    ogs_assert(ogs_sbi_self()->client_wait_expire);
101
     ogs_assert(sbi_object);
102
 
103
     ogs_pool_alloc(&xact_pool, &xact);
104
     ogs_expect_or_return_val(xact, NULL);
105
     memset(xact, 0, sizeof(ogs_sbi_xact_t));
106
 
107
-    xact->target_nf_type = target_nf_type;
108
     xact->sbi_object = sbi_object;
109
 
110
+    xact->target_nf_type = target_nf_type;
111
+    xact->discovery_option = discovery_option;
112
+
113
     xact->request = (*build)(context, data);
114
     if (!xact->request) {
115
         ogs_error("SBI build failed");
116
@@ -1446,7 +1457,7 @@
117
     }
118
 
119
     xact->t_response = ogs_timer_add(
120
-            ogs_app()->timer_mgr, timer_cb, xact);
121
+            ogs_app()->timer_mgr, ogs_sbi_self()->client_wait_expire, xact);
122
     if (!xact->t_response) {
123
         ogs_error("ogs_timer_add() failed");
124
         ogs_sbi_request_free(xact->request);
125
@@ -1471,6 +1482,9 @@
126
     sbi_object = xact->sbi_object;
127
     ogs_assert(sbi_object);
128
 
129
+    if (xact->discovery_option)
130
+        ogs_sbi_discovery_option_free(xact->discovery_option);
131
+
132
     ogs_assert(xact->t_response);
133
     ogs_timer_delete(xact->t_response);
134
 
135
open5gs_2.4.8.202207240002.tar.xz/lib/sbi/context.h -> open5gs_2.4.8.202207250002.tar.xz/lib/sbi/context.h Changed
50
 
1
@@ -65,6 +65,9 @@
2
 
3
     const char *content_encoding;
4
 
5
+    void (*client_wait_expire)(void *data);
6
+    ogs_fsm_handler_t nf_state_registered;
7
+
8
 } ogs_sbi_context_t;
9
 
10
 typedef struct ogs_sbi_nf_instance_s {
11
@@ -157,6 +160,7 @@
12
     ogs_lnode_t lnode;
13
 
14
     OpenAPI_nf_type_e target_nf_type;
15
+    ogs_sbi_discovery_option_t *discovery_option;
16
 
17
     ogs_sbi_request_t *request;
18
     ogs_timer_t *t_response;
19
@@ -337,18 +341,23 @@
20
                 (__nFInstance)->reference_count); \
21
     } while(0)
22
 
23
+bool ogs_sbi_discovery_param_is_matched(
24
+        ogs_sbi_nf_instance_t *nf_instance,
25
+        OpenAPI_nf_type_e target_nf_type,
26
+        ogs_sbi_discovery_option_t *discovery_option);
27
+
28
 void ogs_sbi_select_nf(
29
-        ogs_sbi_object_t *sbi_object, OpenAPI_nf_type_e nf_type, void *state);
30
-void ogs_sbi_select_nf_by_instanceid(
31
-    ogs_sbi_object_t *sbi_object, OpenAPI_nf_type_e nf_type, void *state,
32
-    char *nf_instance_id);
33
+        ogs_sbi_object_t *sbi_object,
34
+        OpenAPI_nf_type_e target_nf_type,
35
+        ogs_sbi_discovery_option_t *discovery_option);
36
 
37
 void ogs_sbi_object_free(ogs_sbi_object_t *sbi_object);
38
 
39
 ogs_sbi_xact_t *ogs_sbi_xact_add(
40
-        OpenAPI_nf_type_e target_nf_type, ogs_sbi_object_t *sbi_object,
41
-        ogs_sbi_build_f build, void *context, void *data,
42
-        void (*timer_cb)(void *data));
43
+        ogs_sbi_object_t *sbi_object,
44
+        OpenAPI_nf_type_e target_nf_type,
45
+        ogs_sbi_discovery_option_t *discovery_option,
46
+        ogs_sbi_build_f build, void *context, void *data);
47
 void ogs_sbi_xact_remove(ogs_sbi_xact_t *xact);
48
 void ogs_sbi_xact_remove_all(ogs_sbi_object_t *sbi_object);
49
 ogs_sbi_xact_t *ogs_sbi_xact_cycle(ogs_sbi_xact_t *xact);
50
open5gs_2.4.8.202207240002.tar.xz/lib/sbi/message.c -> open5gs_2.4.8.202207250002.tar.xz/lib/sbi/message.c Changed
201
 
1
@@ -60,6 +60,11 @@
2
 
3
     ogs_assert(message);
4
 
5
+    /* Discovery Option */
6
+    if (message->param.discovery_option)
7
+        ogs_sbi_discovery_option_free(message->param.discovery_option);
8
+
9
+    /* JSON Data */
10
     if (message->NFProfile)
11
         OpenAPI_nf_profile_free(message->NFProfile);
12
     if (message->ProblemDetails)
13
@@ -176,6 +181,7 @@
14
     if (message->DeregistrationData)
15
         OpenAPI_deregistration_data_free(message->DeregistrationData);
16
 
17
+    /* HTTP Part */
18
     for (i = 0; i < message->num_of_part; i++) {
19
         if (message->parti.pkbuf)
20
             ogs_pkbuf_free(message->parti.pkbuf);
21
@@ -242,6 +248,7 @@
22
 
23
 ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
24
 {
25
+    int i;
26
     ogs_sbi_request_t *request = NULL;
27
 
28
     ogs_assert(message);
29
@@ -255,8 +262,6 @@
30
         request->h.uri = ogs_strdup(message->h.uri);
31
         ogs_expect_or_return_val(request->h.uri, NULL);
32
     } else {
33
-        int i;
34
-
35
         ogs_expect_or_return_val(message->h.service.name, NULL);
36
         request->h.service.name = ogs_strdup(message->h.service.name);
37
         ogs_expect_or_return_val(message->h.api.version, NULL);
38
@@ -270,15 +275,12 @@
39
                     message->h.resource.componenti);
40
     }
41
 
42
-    /* URL Param */
43
-    if (message->param.nf_id) {
44
-        ogs_sbi_header_set(request->http.params,
45
-                OGS_SBI_PARAM_NF_ID, message->param.nf_id);
46
-    }
47
-    if (message->param.nf_type) {
48
-        char *v = OpenAPI_nf_type_ToString(message->param.nf_type);
49
+    /* Discovery Parameter */
50
+    if (message->param.target_nf_type) {
51
+        char *v = OpenAPI_nf_type_ToString(message->param.target_nf_type);
52
         ogs_expect_or_return_val(v, NULL);
53
-        ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_NF_TYPE, v);
54
+        ogs_sbi_header_set(request->http.params,
55
+                OGS_SBI_PARAM_TARGET_NF_TYPE, v);
56
     }
57
     if (message->param.requester_nf_type) {
58
         char *v = OpenAPI_nf_type_ToString(message->param.requester_nf_type);
59
@@ -286,11 +288,50 @@
60
         ogs_sbi_header_set(request->http.params,
61
                 OGS_SBI_PARAM_REQUESTER_NF_TYPE, v);
62
     }
63
-    if (message->param.target_nf_type) {
64
-        char *v = OpenAPI_nf_type_ToString(message->param.target_nf_type);
65
-        ogs_expect_or_return_val(v, NULL);
66
+
67
+    /* Discovery Option Parameter */
68
+    if (message->param.discovery_option) {
69
+        ogs_sbi_discovery_option_t *discovery_option =
70
+                message->param.discovery_option;
71
+
72
+        if (discovery_option->target_nf_instance_id) {
73
+            ogs_sbi_header_set(request->http.params,
74
+                    OGS_SBI_PARAM_TARGET_NF_INSTANCE_ID,
75
+                    discovery_option->target_nf_instance_id);
76
+        }
77
+        if (discovery_option->requester_nf_instance_id) {
78
+            ogs_sbi_header_set(request->http.params,
79
+                    OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID,
80
+                    discovery_option->requester_nf_instance_id);
81
+        }
82
+        if (discovery_option->num_of_service_names) {
83
+            char *v = NULL;
84
+            cJSON *item = NULL;
85
+
86
+            item = cJSON_CreateStringArray(
87
+                (const char * const*)discovery_option->service_names,
88
+                discovery_option->num_of_service_names);
89
+            ogs_expect_or_return_val(item, NULL);
90
+
91
+            v = cJSON_Print(item);
92
+            ogs_expect_or_return_val(v, NULL);
93
+            cJSON_Delete(item);
94
+
95
+            ogs_sbi_header_set(
96
+                    request->http.params, OGS_SBI_PARAM_SERVICE_NAMES, v);
97
+            ogs_free(v);
98
+        }
99
+    }
100
+
101
+    /* URL Query Paramemter */
102
+    if (message->param.nf_id) {
103
         ogs_sbi_header_set(request->http.params,
104
-                OGS_SBI_PARAM_TARGET_NF_TYPE, v);
105
+                OGS_SBI_PARAM_NF_ID, message->param.nf_id);
106
+    }
107
+    if (message->param.nf_type) {
108
+        char *v = OpenAPI_nf_type_ToString(message->param.nf_type);
109
+        ogs_expect_or_return_val(v, NULL);
110
+        ogs_sbi_header_set(request->http.params, OGS_SBI_PARAM_NF_TYPE, v);
111
     }
112
     if (message->param.limit) {
113
         char *v = ogs_msprintf("%d", message->param.limit);
114
@@ -440,6 +481,8 @@
115
 {
116
     int rv;
117
     ogs_hash_index_t *hi;
118
+    ogs_sbi_discovery_option_t *discovery_option = NULL;
119
+    bool discovery_option_presence = false;
120
 
121
     ogs_assert(request);
122
     ogs_assert(message);
123
@@ -450,14 +493,14 @@
124
         return OGS_ERROR;
125
     }
126
 
127
+    discovery_option_presence = false;
128
+    discovery_option = ogs_sbi_discovery_option_new();
129
+    ogs_assert(discovery_option);
130
+
131
     for (hi = ogs_hash_first(request->http.params);
132
             hi; hi = ogs_hash_next(hi)) {
133
-        if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_NF_ID)) {
134
-            message->param.nf_id = ogs_hash_this_val(hi);
135
-        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_NF_TYPE)) {
136
-            message->param.nf_type =
137
-                OpenAPI_nf_type_FromString(ogs_hash_this_val(hi));
138
-        } else if (!strcmp(ogs_hash_this_key(hi),
139
+        /* Discovery Parameter */
140
+        if (!strcmp(ogs_hash_this_key(hi),
141
                     OGS_SBI_PARAM_TARGET_NF_TYPE)) {
142
             message->param.target_nf_type =
143
                 OpenAPI_nf_type_FromString(ogs_hash_this_val(hi));
144
@@ -465,6 +508,46 @@
145
                     OGS_SBI_PARAM_REQUESTER_NF_TYPE)) {
146
             message->param.requester_nf_type =
147
                 OpenAPI_nf_type_FromString(ogs_hash_this_val(hi));
148
+
149
+        /* Discovery Option Parameter */
150
+        } else if (!strcmp(ogs_hash_this_key(hi),
151
+                    OGS_SBI_PARAM_TARGET_NF_INSTANCE_ID)) {
152
+            discovery_option_presence = true;
153
+            ogs_sbi_discovery_option_set_target_nf_instance_id(
154
+                    discovery_option, ogs_hash_this_val(hi));
155
+        } else if (!strcmp(ogs_hash_this_key(hi),
156
+                    OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID)) {
157
+            discovery_option_presence = true;
158
+            ogs_sbi_discovery_option_set_requester_nf_instance_id(
159
+                    discovery_option, ogs_hash_this_val(hi));
160
+        } else if (!strcmp(ogs_hash_this_key(hi),
161
+                    OGS_SBI_PARAM_SERVICE_NAMES)) {
162
+            char *v = NULL;
163
+            cJSON *array = NULL, *item = NULL;
164
+
165
+            v = ogs_hash_this_val(hi);
166
+            if (v) {
167
+                array = cJSON_Parse(v);
168
+                if (cJSON_IsArray(array)) {
169
+
170
+                    discovery_option_presence = true;
171
+
172
+                    cJSON_ArrayForEach(item, array) {
173
+                        char *names = cJSON_GetStringValue(item);
174
+                        if (names)
175
+                            ogs_sbi_discovery_option_add_service_names(
176
+                                    discovery_option, names);
177
+                    }
178
+                }
179
+                cJSON_Delete(array);
180
+            }
181
+
182
+        /* URL Query Parameter */
183
+        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_NF_ID)) {
184
+            message->param.nf_id = ogs_hash_this_val(hi);
185
+        } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_NF_TYPE)) {
186
+            message->param.nf_type =
187
+                OpenAPI_nf_type_FromString(ogs_hash_this_val(hi));
188
         } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_LIMIT)) {
189
             message->param.limit = atoi(ogs_hash_this_val(hi));
190
         } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_DNN)) {
191
@@ -544,6 +627,13 @@
192
         }
193
     }
194
 
195
+    if (discovery_option_presence == true)
196
+        /* message->param.discovery_option will be freed()
197
+         * in ogs_sbi_message_free() */
198
+        message->param.discovery_option = discovery_option;
199
+    else
200
+        ogs_sbi_discovery_option_free(discovery_option);
201
open5gs_2.4.8.202207240002.tar.xz/lib/sbi/message.h -> open5gs_2.4.8.202207250002.tar.xz/lib/sbi/message.h Changed
149
 
1
@@ -247,20 +247,6 @@
2
 #define OGS_SBI_NBSF_MANAGEMENT_ES3XX 4
3
 #define OGS_SBI_NBSF_MANAGEMENT_EXTENDED_SAME_PCF 5
4
 
5
-#define OGS_SBI_PARAM_NF_ID                         "nf-id"
6
-#define OGS_SBI_PARAM_NF_TYPE                       "nf-type"
7
-#define OGS_SBI_PARAM_TARGET_NF_TYPE                "target-nf-type"
8
-#define OGS_SBI_PARAM_REQUESTER_NF_TYPE             "requester-nf-type"
9
-#define OGS_SBI_PARAM_LIMIT                         "limit"
10
-#define OGS_SBI_PARAM_DNN                           "dnn"
11
-#define OGS_SBI_PARAM_PLMN_ID                       "plmn-id"
12
-#define OGS_SBI_PARAM_SINGLE_NSSAI                  "single-nssai"
13
-#define OGS_SBI_PARAM_SNSSAI                        "snssai"
14
-#define OGS_SBI_PARAM_SLICE_INFO_REQUEST_FOR_PDU_SESSION \
15
-        "slice-info-request-for-pdu-session"
16
-#define OGS_SBI_PARAM_IPV4ADDR                      "ipv4Addr"
17
-#define OGS_SBI_PARAM_IPV6PREFIX                    "ipv6Prefix"
18
-
19
 #define OGS_SBI_ACCEPT                              "Accept"
20
 #define OGS_SBI_ACCEPT_ENCODING                     "Accept-Encoding"
21
 #define OGS_SBI_CONTENT_TYPE                        "Content-Type"
22
@@ -274,20 +260,61 @@
23
 #define OGS_SBI_APPLICATION_5GNAS_TYPE              "vnd.3gpp.5gnas"
24
 #define OGS_SBI_APPLICATION_NGAP_TYPE               "vnd.3gpp.ngap"
25
 
26
-#define OGS_SBI_CUSTOM_3GPP_COMMON              "3gpp-Sbi-"
27
-#define OGS_SBI_CUSTOM_MESSAGE_PRIORITY         "3gpp-Sbi-Message-Priority"
28
-#define OGS_SBI_CUSTOM_CALLBACK                 "3gpp-Sbi-Callback"
29
-#define OGS_SBI_CUSTOM_TARGET_APIROOT           "3gpp-Sbi-Target-apiRoot"
30
-#define OGS_SBI_CUSTOM_ROUTING_BINDING          "3gpp-Sbi-Routing-Binding"
31
-#define OGS_SBI_CUSTOM_BINDING                  "3gpp-Sbi-Binding"
32
-#define OGS_SBI_CUSTOM_DISCOVERY_COMMON         "3gpp-Sbi-Discovery-"
33
-#define OGS_SBI_CUSTOM_PRODUCER_ID              "3gpp-Sbi-Producer-Id"
34
-#define OGS_SBI_CUSTOM_OCI                      "3gpp-Sbi-Oci"
35
-#define OGS_SBI_CUSTOM_CLIENT_CREDENTIALS       "3gpp-Sbi-Client-Credentials"
36
-#define OGS_SBI_CUSTOM_NRF_URI                  "3gpp-Sbi-Nrf-Uri"
37
-#define OGS_SBI_CUSTOM_TARGET_NF_ID             "3gpp-Sbi-Target-Nf-Id"
38
-#define OGS_SBI_CUSTOM_ACCESS_SCOPE             "3gpp-Sbi-Access-Scope"
39
-#define OGS_SBI_CUSTOM_ACCESS_TOKEN             "3gpp-Sbi-Access-Token"
40
+#define OGS_SBI_CUSTOM_3GPP_COMMON                  "3gpp-Sbi-"
41
+#define OGS_SBI_CUSTOM_MESSAGE_PRIORITY  \
42
+    OGS_SBI_CUSTOM_3GPP_COMMON "Message-Priority"
43
+#define OGS_SBI_CUSTOM_CALLBACK          \
44
+    OGS_SBI_CUSTOM_3GPP_COMMON "Callback"
45
+#define OGS_SBI_CUSTOM_TARGET_APIROOT    \
46
+    OGS_SBI_CUSTOM_3GPP_COMMON "Target-apiRoot"
47
+#define OGS_SBI_CUSTOM_ROUTING_BINDING   \
48
+    OGS_SBI_CUSTOM_3GPP_COMMON "Routing-Binding"
49
+#define OGS_SBI_CUSTOM_BINDING           \
50
+    OGS_SBI_CUSTOM_3GPP_COMMON "Binding"
51
+#define OGS_SBI_CUSTOM_DISCOVERY_COMMON  \
52
+    OGS_SBI_CUSTOM_3GPP_COMMON "Discovery-"
53
+#define OGS_SBI_CUSTOM_DISCOVERY_TARGET_NF_TYPE     \
54
+    OGS_SBI_CUSTOM_DISCOVERY_COMMON OGS_SBI_PARAM_TARGET_NF_TYPE
55
+#define OGS_SBI_CUSTOM_DISCOVERY_REQUESTER_NF_TYPE  \
56
+    OGS_SBI_CUSTOM_DISCOVERY_COMMON OGS_SBI_PARAM_REQUESTER_NF_TYPE
57
+#define OGS_SBI_CUSTOM_DISCOVERY_TARGET_NF_INSTANCE_ID \
58
+    OGS_SBI_CUSTOM_DISCOVERY_COMMON OGS_SBI_PARAM_TARGET_NF_INSTANCE_ID
59
+#define OGS_SBI_CUSTOM_DISCOVERY_REQUESTER_NF_INSTANCE_ID \
60
+    OGS_SBI_CUSTOM_DISCOVERY_COMMON OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID
61
+#define OGS_SBI_CUSTOM_DISCOVERY_SERVICE_NAMES  \
62
+    OGS_SBI_CUSTOM_DISCOVERY_COMMON OGS_SBI_PARAM_SERVICE_NAMES
63
+#define OGS_SBI_CUSTOM_PRODUCER_ID       \
64
+    OGS_SBI_CUSTOM_3GPP_COMMON "Producer-Id"
65
+#define OGS_SBI_CUSTOM_OCI               \
66
+    OGS_SBI_CUSTOM_3GPP_COMMON "Oci"
67
+#define OGS_SBI_CUSTOM_CLIENT_CREDENTIALS   \
68
+    OGS_SBI_CUSTOM_3GPP_COMMON "Client-Credentials"
69
+#define OGS_SBI_CUSTOM_NRF_URI           \
70
+    OGS_SBI_CUSTOM_3GPP_COMMON "Nrf-Uri"
71
+#define OGS_SBI_CUSTOM_TARGET_NF_ID      \
72
+    OGS_SBI_CUSTOM_3GPP_COMMON "Target-Nf-Id"
73
+#define OGS_SBI_CUSTOM_ACCESS_SCOPE      \
74
+    OGS_SBI_CUSTOM_3GPP_COMMON "Access-Scope"
75
+#define OGS_SBI_CUSTOM_ACCESS_TOKEN      \
76
+    OGS_SBI_CUSTOM_3GPP_COMMON "Access-Token"
77
+
78
+#define OGS_SBI_PARAM_TARGET_NF_TYPE                "target-nf-type"
79
+#define OGS_SBI_PARAM_REQUESTER_NF_TYPE             "requester-nf-type"
80
+#define OGS_SBI_PARAM_TARGET_NF_INSTANCE_ID         "target-nf-instance-id"
81
+#define OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID      "requester-nf-instance-id"
82
+#define OGS_SBI_PARAM_SERVICE_NAMES                 "service-names"
83
+
84
+#define OGS_SBI_PARAM_NF_ID                         "nf-id"
85
+#define OGS_SBI_PARAM_NF_TYPE                       "nf-type"
86
+#define OGS_SBI_PARAM_LIMIT                         "limit"
87
+#define OGS_SBI_PARAM_DNN                           "dnn"
88
+#define OGS_SBI_PARAM_PLMN_ID                       "plmn-id"
89
+#define OGS_SBI_PARAM_SINGLE_NSSAI                  "single-nssai"
90
+#define OGS_SBI_PARAM_SNSSAI                        "snssai"
91
+#define OGS_SBI_PARAM_SLICE_INFO_REQUEST_FOR_PDU_SESSION \
92
+        "slice-info-request-for-pdu-session"
93
+#define OGS_SBI_PARAM_IPV4ADDR                      "ipv4Addr"
94
+#define OGS_SBI_PARAM_IPV6PREFIX                    "ipv6Prefix"
95
 
96
 #define OGS_SBI_CONTENT_JSON_TYPE                   \
97
     OGS_SBI_APPLICATION_TYPE "/" OGS_SBI_APPLICATION_JSON_TYPE
98
@@ -337,6 +364,14 @@
99
     ogs_pkbuf_t *pkbuf;
100
 } ogs_sbi_part_t;
101
 
102
+typedef struct ogs_sbi_discovery_option_s {
103
+    char *target_nf_instance_id;
104
+    char *requester_nf_instance_id;
105
+
106
+    int num_of_service_names;
107
+    char *service_namesOGS_MAX_NUM_OF_NF_SERVICE;
108
+} ogs_sbi_discovery_option_t;
109
+
110
 typedef struct ogs_sbi_message_s {
111
     ogs_sbi_header_t h;
112
 
113
@@ -349,8 +384,14 @@
114
     } http;
115
 
116
     struct {
117
+        /* Discovery Parameter */
118
         OpenAPI_nf_type_e target_nf_type;
119
         OpenAPI_nf_type_e requester_nf_type;
120
+
121
+        /* Discovery Option Parameter */
122
+        ogs_sbi_discovery_option_t *discovery_option;
123
+
124
+        /* URL Query Parameter */
125
         char *nf_id;
126
         OpenAPI_nf_type_e nf_type;
127
         int limit;
128
@@ -494,6 +535,20 @@
129
 
130
 void ogs_sbi_http_hash_free(ogs_hash_t *hash);
131
 
132
+ogs_sbi_discovery_option_t *ogs_sbi_discovery_option_new(void);
133
+void ogs_sbi_discovery_option_free(
134
+        ogs_sbi_discovery_option_t *discovery_option);
135
+
136
+void ogs_sbi_discovery_option_set_target_nf_instance_id(
137
+        ogs_sbi_discovery_option_t *discovery_option,
138
+        char *target_nf_instance_id);
139
+void ogs_sbi_discovery_option_set_requester_nf_instance_id(
140
+        ogs_sbi_discovery_option_t *discovery_option,
141
+        char *requester_nf_instance_id);
142
+void ogs_sbi_discovery_option_add_service_names(
143
+        ogs_sbi_discovery_option_t *discovery_option,
144
+        char *service_name);
145
+
146
 #ifdef __cplusplus
147
 }
148
 #endif
149
open5gs_2.4.8.202207240002.tar.xz/lib/sbi/nnrf-build.c -> open5gs_2.4.8.202207250002.tar.xz/lib/sbi/nnrf-build.c Changed
20
 
1
@@ -501,7 +501,8 @@
2
 }
3
 
4
 ogs_sbi_request_t *ogs_nnrf_disc_build_discover(
5
-        OpenAPI_nf_type_e target_nf_type, OpenAPI_nf_type_e requester_nf_type)
6
+        OpenAPI_nf_type_e target_nf_type, OpenAPI_nf_type_e requester_nf_type,
7
+        ogs_sbi_discovery_option_t *discovery_option)
8
 {
9
     ogs_sbi_message_t message;
10
     ogs_sbi_request_t *request = NULL;
11
@@ -519,6 +520,8 @@
12
     message.param.target_nf_type = target_nf_type;
13
     message.param.requester_nf_type = requester_nf_type;
14
 
15
+    message.param.discovery_option = discovery_option;
16
+
17
     request = ogs_sbi_build_request(&message);
18
 
19
     return request;
20
open5gs_2.4.8.202207240002.tar.xz/lib/sbi/nnrf-build.h -> open5gs_2.4.8.202207250002.tar.xz/lib/sbi/nnrf-build.h Changed
11
 
1
@@ -37,7 +37,8 @@
2
 ogs_sbi_request_t *ogs_nnrf_nfm_build_profile_retrieve(char *nf_instance_id);
3
 
4
 ogs_sbi_request_t *ogs_nnrf_disc_build_discover(
5
-        OpenAPI_nf_type_e target_nf_type, OpenAPI_nf_type_e requester_nf_type);
6
+        OpenAPI_nf_type_e target_nf_type, OpenAPI_nf_type_e requester_nf_type,
7
+        ogs_sbi_discovery_option_t *discovery_option);
8
 
9
 #ifdef __cplusplus
10
 }
11
open5gs_2.4.8.202207240002.tar.xz/lib/sbi/path.c -> open5gs_2.4.8.202207250002.tar.xz/lib/sbi/path.c Changed
161
 
1
@@ -20,7 +20,7 @@
2
 #include "ogs-sbi.h"
3
 #include "ogs-app.h"
4
 
5
-bool ogs_sbi_send(ogs_sbi_nf_instance_t *nf_instance,
6
+bool ogs_sbi_send_request(ogs_sbi_nf_instance_t *nf_instance,
7
         ogs_sbi_client_cb_f client_cb, ogs_sbi_xact_t *xact)
8
 {
9
     ogs_sbi_request_t *request = NULL;
10
@@ -77,49 +77,49 @@
11
     return true;
12
 }
13
 
14
-bool ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact,
15
-        ogs_fsm_handler_t nf_state_registered, ogs_sbi_client_cb_f client_cb)
16
+bool ogs_sbi_discover_and_send(
17
+        ogs_sbi_object_t *sbi_object,
18
+        OpenAPI_nf_type_e target_nf_type,
19
+        OpenAPI_nf_type_e requester_nf_type,
20
+        ogs_sbi_discovery_option_t *discovery_option,
21
+        ogs_sbi_client_cb_f client_cb, void *data)
22
 {
23
     ogs_sbi_nf_instance_t *nf_instance = NULL;
24
 
25
-    ogs_assert(xact);
26
-    ogs_assert(xact->sbi_object);
27
-    ogs_assert(xact->target_nf_type);
28
-    ogs_assert(nf_state_registered);
29
+    ogs_assert(sbi_object);
30
+    ogs_assert(target_nf_type);
31
+    ogs_assert(requester_nf_type);
32
     ogs_assert(client_cb);
33
 
34
     /* Target NF-Instance */
35
-    nf_instance = OGS_SBI_NF_INSTANCE(xact->sbi_object, xact->target_nf_type);
36
+    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, target_nf_type);
37
     if (!nf_instance) {
38
-        ogs_assert(xact->target_nf_type != OpenAPI_nf_type_NRF);
39
-        ogs_sbi_select_nf(
40
-                xact->sbi_object, xact->target_nf_type, nf_state_registered);
41
-        nf_instance = OGS_SBI_NF_INSTANCE(
42
-                xact->sbi_object, xact->target_nf_type);
43
+        ogs_assert(target_nf_type != OpenAPI_nf_type_NRF);
44
+        ogs_sbi_select_nf(sbi_object, target_nf_type, discovery_option);
45
+        nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, target_nf_type);
46
     }
47
 
48
     if (nf_instance) {
49
-        return ogs_sbi_send(nf_instance, client_cb, xact);
50
+        return ogs_sbi_send_request(nf_instance, client_cb, data);
51
     }
52
 
53
     /* NRF NF-Instance */
54
-    nf_instance = OGS_SBI_NF_INSTANCE(xact->sbi_object, OpenAPI_nf_type_NRF);
55
+    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, OpenAPI_nf_type_NRF);
56
     if (!nf_instance) {
57
-        ogs_sbi_select_nf(
58
-                xact->sbi_object, OpenAPI_nf_type_NRF, nf_state_registered);
59
-        nf_instance = OGS_SBI_NF_INSTANCE(
60
-                xact->sbi_object, OpenAPI_nf_type_NRF);
61
+        ogs_sbi_select_nf(sbi_object, OpenAPI_nf_type_NRF, NULL);
62
+        nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, OpenAPI_nf_type_NRF);
63
     }
64
 
65
     if (nf_instance) {
66
         ogs_warn("Try to discover %s",
67
-                    OpenAPI_nf_type_ToString(xact->target_nf_type));
68
+                    OpenAPI_nf_type_ToString(target_nf_type));
69
         return ogs_nnrf_disc_send_nf_discover(
70
-                nf_instance, xact->target_nf_type, xact);
71
+                nf_instance,
72
+                target_nf_type, requester_nf_type, discovery_option,
73
+                data);
74
     }
75
 
76
-    ogs_error("Cannot discover %s",
77
-                OpenAPI_nf_type_ToString(xact->target_nf_type));
78
+    ogs_error("Cannot discover %s", OpenAPI_nf_type_ToString(target_nf_type));
79
 
80
     return false;
81
 }
82
@@ -141,51 +141,6 @@
83
     return ogs_sbi_scp_send_request(client, client->cb, request, nf_instance);
84
 }
85
 
86
-bool ogs_sbi_discover_by_nf_instanceid_and_send(ogs_sbi_xact_t *xact,
87
-        ogs_fsm_handler_t nf_state_registered, ogs_sbi_client_cb_f client_cb,
88
-        char *nf_instance_id)
89
-{
90
-    ogs_sbi_nf_instance_t *nf_instance = NULL;
91
-
92
-    ogs_assert(xact);
93
-    ogs_assert(xact->sbi_object);
94
-    ogs_assert(xact->target_nf_type);
95
-    ogs_assert(nf_state_registered);
96
-    ogs_assert(client_cb);
97
-    ogs_assert(nf_instance_id);
98
-
99
-    /* Target NF-Instance - search by NF Instance Id */
100
-    ogs_assert(xact->target_nf_type != OpenAPI_nf_type_NRF);
101
-    ogs_sbi_select_nf_by_instanceid(
102
-        xact->sbi_object, xact->target_nf_type, nf_state_registered,
103
-        nf_instance_id);
104
-
105
-    nf_instance = OGS_SBI_NF_INSTANCE(
106
-            xact->sbi_object, xact->target_nf_type);
107
-
108
-    if (nf_instance) {
109
-        return ogs_sbi_send(nf_instance, client_cb, xact);
110
-    }
111
-
112
-    /* NRF NF-Instance */
113
-    nf_instance = OGS_SBI_NF_INSTANCE(xact->sbi_object, OpenAPI_nf_type_NRF);
114
-    if (!nf_instance) {
115
-        ogs_sbi_select_nf(
116
-                xact->sbi_object, OpenAPI_nf_type_NRF, nf_state_registered);
117
-        nf_instance = OGS_SBI_NF_INSTANCE(
118
-                xact->sbi_object, OpenAPI_nf_type_NRF);
119
-    }
120
-
121
-    if (nf_instance) {
122
-        ogs_warn("Try to retrieve %s", nf_instance_id);
123
-        return ogs_nnrf_nfm_send_nf_profile_retrieve(nf_instance,
124
-                nf_instance_id, xact);
125
-    }
126
-
127
-    ogs_error("Cannot retrieve %s", nf_instance_id);
128
-    return false;
129
-}
130
-
131
 bool ogs_nnrf_nfm_send_nf_update(ogs_sbi_nf_instance_t *nf_instance)
132
 {
133
     ogs_sbi_request_t *request = NULL;
134
@@ -279,17 +234,22 @@
135
             client, client->cb, request, subscription);
136
 }
137
 
138
-bool ogs_nnrf_disc_send_nf_discover(ogs_sbi_nf_instance_t *nf_instance,
139
-        OpenAPI_nf_type_e target_nf_type, void *data)
140
+bool ogs_nnrf_disc_send_nf_discover(
141
+        ogs_sbi_nf_instance_t *nf_instance,
142
+        OpenAPI_nf_type_e target_nf_type,
143
+        OpenAPI_nf_type_e requester_nf_type,
144
+        ogs_sbi_discovery_option_t *discovery_option,
145
+        void *data)
146
 {
147
     ogs_sbi_client_t *client = NULL;
148
     ogs_sbi_request_t *request = NULL;
149
 
150
     ogs_assert(nf_instance);
151
+    ogs_assert(target_nf_type);
152
+    ogs_assert(requester_nf_type);
153
 
154
-    ogs_assert(ogs_sbi_self()->nf_instance);
155
     request = ogs_nnrf_disc_build_discover(
156
-            target_nf_type, ogs_sbi_self()->nf_instance->nf_type);
157
+                target_nf_type, requester_nf_type, discovery_option);
158
     ogs_expect_or_return_val(request, false);
159
 
160
     client = nf_instance->client;
161
open5gs_2.4.8.202207240002.tar.xz/lib/sbi/path.h -> open5gs_2.4.8.202207250002.tar.xz/lib/sbi/path.h Changed
37
 
1
@@ -26,13 +26,14 @@
2
 extern "C" {
3
 #endif
4
 
5
-bool ogs_sbi_send(ogs_sbi_nf_instance_t *nf_instance,
6
+bool ogs_sbi_send_request(ogs_sbi_nf_instance_t *nf_instance,
7
         ogs_sbi_client_cb_f client_cb, ogs_sbi_xact_t *xact);
8
-bool ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact,
9
-        ogs_fsm_handler_t nf_state_registered, ogs_sbi_client_cb_f client_cb);
10
-bool ogs_sbi_discover_by_nf_instanceid_and_send(ogs_sbi_xact_t *xact,
11
-        ogs_fsm_handler_t nf_state_registered, ogs_sbi_client_cb_f client_cb,
12
-        char *nf_instance_id);
13
+bool ogs_sbi_discover_and_send(
14
+        ogs_sbi_object_t *sbi_object,
15
+        OpenAPI_nf_type_e target_nf_type,
16
+        OpenAPI_nf_type_e requester_nf_type,
17
+        ogs_sbi_discovery_option_t *discovery_option,
18
+        ogs_sbi_client_cb_f client_cb, void *data);
19
 
20
 bool ogs_nnrf_nfm_send_nf_register(
21
         ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_request_t *(*build)(void));
22
@@ -47,8 +48,12 @@
23
 bool ogs_nnrf_nfm_send_nf_status_unsubscribe(
24
         ogs_sbi_subscription_t *subscription);
25
 
26
-bool ogs_nnrf_disc_send_nf_discover(ogs_sbi_nf_instance_t *nf_instance,
27
-        OpenAPI_nf_type_e target_nf_type, void *data);
28
+bool ogs_nnrf_disc_send_nf_discover(
29
+        ogs_sbi_nf_instance_t *nf_instance,
30
+        OpenAPI_nf_type_e target_nf_type,
31
+        OpenAPI_nf_type_e requester_nf_type,
32
+        ogs_sbi_discovery_option_t *discovery_option,
33
+        void *data);
34
 
35
 #define ogs_sbi_send_http_status_no_content(__sTREAM) \
36
         ogs_sbi_send_response(__sTREAM, OGS_SBI_HTTP_STATUS_NO_CONTENT)
37
open5gs_2.4.8.202207240002.tar.xz/src/amf/context.c -> open5gs_2.4.8.202207250002.tar.xz/src/amf/context.c Changed
74
 
1
@@ -1780,40 +1780,46 @@
2
     return ogs_pool_cycle(&amf_sess_pool, sess);
3
 }
4
 
5
-void amf_ue_select_nf(amf_ue_t *amf_ue, OpenAPI_nf_type_e nf_type)
6
-{
7
-    ogs_assert(amf_ue);
8
-    ogs_assert(nf_type);
9
-
10
-    ogs_sbi_select_nf(&amf_ue->sbi, nf_type, amf_nf_state_registered);
11
-}
12
-
13
-void amf_sess_select_nf(amf_sess_t *sess, OpenAPI_nf_type_e nf_type)
14
-{
15
-    ogs_assert(sess);
16
-    ogs_assert(nf_type);
17
-
18
-    if (nf_type == OpenAPI_nf_type_SMF)
19
-        amf_sess_select_smf(sess);
20
-    else
21
-        ogs_sbi_select_nf(&sess->sbi, nf_type, amf_nf_state_registered);
22
-}
23
-
24
 static bool check_smf_info(amf_sess_t *sess, ogs_list_t *nf_info_list);
25
 
26
-void amf_sess_select_smf(amf_sess_t *sess)
27
+void amf_sbi_select_nf(
28
+        ogs_sbi_object_t *sbi_object,
29
+        OpenAPI_nf_type_e target_nf_type,
30
+        ogs_sbi_discovery_option_t *discovery_option)
31
 {
32
     ogs_sbi_nf_instance_t *nf_instance = NULL;
33
+    amf_sess_t *sess = NULL;
34
 
35
-    ogs_assert(sess);
36
+    ogs_assert(ogs_sbi_self()->nf_state_registered);
37
+    ogs_assert(sbi_object);
38
+    ogs_assert(target_nf_type);
39
+
40
+    switch(sbi_object->type) {
41
+    case OGS_SBI_OBJ_UE_TYPE:
42
+        ogs_sbi_select_nf(sbi_object, target_nf_type, discovery_option);
43
+        break;
44
+    case OGS_SBI_OBJ_SESS_TYPE:
45
+        sess = (amf_sess_t *)sbi_object;
46
+        ogs_assert(sess);
47
+
48
+        ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) {
49
+            if (ogs_sbi_discovery_param_is_matched(
50
+                    nf_instance, target_nf_type, discovery_option) == false)
51
+                continue;
52
+
53
+            if (target_nf_type == OpenAPI_nf_type_SMF) {
54
+                if (check_smf_info(sess, &nf_instance->nf_info_list) == false)
55
+                    continue;
56
+            }
57
 
58
-    ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) {
59
-        if (OGS_FSM_CHECK(&nf_instance->sm, amf_nf_state_registered) &&
60
-            nf_instance->nf_type == OpenAPI_nf_type_SMF &&
61
-            check_smf_info(sess, &nf_instance->nf_info_list) == true) {
62
-            OGS_SBI_SETUP_NF(&sess->sbi, OpenAPI_nf_type_SMF, nf_instance);
63
+            OGS_SBI_SETUP_NF(sbi_object, target_nf_type, nf_instance);
64
             break;
65
         }
66
+        break;
67
+    default:
68
+        ogs_fatal("(NF discover search result) Not implemented %d",
69
+                    sbi_object->type);
70
+        ogs_assert_if_reached();
71
     }
72
 }
73
 
74
open5gs_2.4.8.202207240002.tar.xz/src/amf/context.h -> open5gs_2.4.8.202207250002.tar.xz/src/amf/context.h Changed
16
 
1
@@ -752,10 +752,10 @@
2
 amf_ue_t *amf_ue_cycle(amf_ue_t *amf_ue);
3
 amf_sess_t *amf_sess_cycle(amf_sess_t *sess);
4
 
5
-void amf_ue_select_nf(amf_ue_t *amf_ue, OpenAPI_nf_type_e nf_type);
6
-void amf_sess_select_nf(amf_sess_t *sess, OpenAPI_nf_type_e nf_type);
7
-
8
-void amf_sess_select_smf(amf_sess_t *sess);
9
+void amf_sbi_select_nf(
10
+        ogs_sbi_object_t *sbi_object,
11
+        OpenAPI_nf_type_e target_nf_type,
12
+        ogs_sbi_discovery_option_t *discovery_option);
13
 
14
 #define AMF_SESSION_SYNC_DONE(__aMF, __sTATE) \
15
     (amf_sess_xact_state_count(__aMF, __sTATE) == 0)
16
open5gs_2.4.8.202207240002.tar.xz/src/amf/gmm-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/amf/gmm-handler.c Changed
76
 
1
@@ -720,8 +720,8 @@
2
             authentication_response_parameter->length);
3
 
4
     ogs_assert(true ==
5
-        amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, amf_ue, NULL,
6
-                amf_nausf_auth_build_authenticate_confirmation));
7
+        amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, NULL,
8
+                amf_nausf_auth_build_authenticate_confirmation, amf_ue, NULL));
9
 
10
     return OGS_OK;
11
 }
12
@@ -1067,20 +1067,22 @@
13
                 nf_instance = OGS_SBI_NF_INSTANCE(
14
                                 &sess->sbi, OpenAPI_nf_type_SMF);
15
                 if (!nf_instance) {
16
-                    amf_sess_select_smf(sess);
17
+                    amf_sbi_select_nf(&sess->sbi, OpenAPI_nf_type_SMF, NULL);
18
                     nf_instance = OGS_SBI_NF_INSTANCE(
19
                                     &sess->sbi, OpenAPI_nf_type_SMF);
20
                 }
21
 
22
                 if (nf_instance) {
23
                     ogs_assert(true ==
24
-                        amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
25
-                            sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL,
26
-                            amf_nsmf_pdusession_build_create_sm_context));
27
+                        amf_sess_sbi_discover_and_send(
28
+                            OpenAPI_nf_type_SMF, NULL,
29
+                            amf_nsmf_pdusession_build_create_sm_context,
30
+                            sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL));
31
                 } else {
32
                     ogs_assert(true ==
33
-                        amf_sess_sbi_discover_and_send(OpenAPI_nf_type_NSSF,
34
-                            sess, 0, NULL, amf_nnssf_nsselection_build_get));
35
+                        amf_sess_sbi_discover_and_send(
36
+                            OpenAPI_nf_type_NSSF, NULL,
37
+                            amf_nnssf_nsselection_build_get, sess, 0, NULL));
38
                 }
39
 
40
             } else {
41
@@ -1090,9 +1092,10 @@
42
                 param.cause = OpenAPI_cause_REL_DUE_TO_DUPLICATE_SESSION_ID;
43
 
44
                 ogs_assert(true ==
45
-                    amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
46
+                    amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
47
+                        amf_nsmf_pdusession_build_update_sm_context,
48
                         sess, AMF_UPDATE_SM_CONTEXT_DUPLICATED_PDU_SESSION_ID,
49
-                        &param, amf_nsmf_pdusession_build_update_sm_context));
50
+                        &param));
51
             }
52
 
53
         } else {
54
@@ -1115,15 +1118,15 @@
55
                 param.ue_timezone = true;
56
 
57
                 ogs_assert(true ==
58
-                    amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
59
-                        sess, AMF_UPDATE_SM_CONTEXT_N1_RELEASED, &param,
60
-                        amf_nsmf_pdusession_build_update_sm_context));
61
+                    amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
62
+                        amf_nsmf_pdusession_build_update_sm_context,
63
+                        sess, AMF_UPDATE_SM_CONTEXT_N1_RELEASED, &param));
64
             } else {
65
 
66
                 ogs_assert(true ==
67
-                    amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
68
-                        sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, &param,
69
-                        amf_nsmf_pdusession_build_update_sm_context));
70
+                    amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
71
+                        amf_nsmf_pdusession_build_update_sm_context,
72
+                        sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, &param));
73
             }
74
 
75
             switch (gsm_header->message_type) {
76
open5gs_2.4.8.202207240002.tar.xz/src/amf/gmm-sm.c -> open5gs_2.4.8.202207250002.tar.xz/src/amf/gmm-sm.c Changed
144
 
1
@@ -177,8 +177,9 @@
2
                     if (!PCF_AM_POLICY_ASSOCIATED(amf_ue)) {
3
                         ogs_assert(true ==
4
                             amf_ue_sbi_discover_and_send(
5
-                                OpenAPI_nf_type_PCF, amf_ue, NULL,
6
-                                amf_npcf_am_policy_control_build_create));
7
+                                OpenAPI_nf_type_PCF, NULL,
8
+                                amf_npcf_am_policy_control_build_create,
9
+                                amf_ue, NULL));
10
                         OGS_FSM_TRAN(s, &gmm_state_initial_context_setup);
11
                         break;
12
                     }
13
@@ -199,9 +200,8 @@
14
                         amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
15
                 if (amf_sess_xact_count(amf_ue) == xact_count) {
16
                     ogs_assert(true ==
17
-                        amf_ue_sbi_discover_and_send(
18
-                            OpenAPI_nf_type_AUSF, amf_ue, NULL,
19
-                            amf_nausf_auth_build_authenticate));
20
+                        amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, NULL,
21
+                            amf_nausf_auth_build_authenticate, amf_ue, NULL));
22
                 }
23
 
24
                 OGS_FSM_TRAN(s, &gmm_state_authentication);
25
@@ -277,9 +277,8 @@
26
                     amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
27
             if (amf_sess_xact_count(amf_ue) == xact_count) {
28
                 ogs_assert(true ==
29
-                    amf_ue_sbi_discover_and_send(
30
-                        OpenAPI_nf_type_AUSF, amf_ue, NULL,
31
-                        amf_nausf_auth_build_authenticate));
32
+                    amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, NULL,
33
+                        amf_nausf_auth_build_authenticate, amf_ue, NULL));
34
             }
35
 
36
             OGS_FSM_TRAN(s, &gmm_state_authentication);
37
@@ -585,9 +584,8 @@
38
             case OGS_5GMM_CAUSE_NGKSI_ALREADY_IN_USE:
39
                 ogs_warn("Authentication failure(ngKSI already in use)");
40
                 ogs_assert(true ==
41
-                    amf_ue_sbi_discover_and_send(
42
-                        OpenAPI_nf_type_AUSF, amf_ue, NULL,
43
-                        amf_nausf_auth_build_authenticate));
44
+                    amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, NULL,
45
+                        amf_nausf_auth_build_authenticate, amf_ue, NULL));
46
                 return;
47
 
48
             case OGS_5GMM_CAUSE_SYNCH_FAILURE:
49
@@ -598,9 +596,9 @@
50
                     break;
51
                 }
52
                 ogs_assert(true ==
53
-                    amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, amf_ue,
54
-                        authentication_failure_parameter->auts,
55
-                        amf_nausf_auth_build_authenticate));
56
+                    amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, NULL,
57
+                        amf_nausf_auth_build_authenticate,
58
+                        amf_ue, authentication_failure_parameter->auts));
59
                 return;
60
 
61
             default:
62
@@ -630,8 +628,8 @@
63
             }
64
 
65
             ogs_assert(true ==
66
-                amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, amf_ue, NULL,
67
-                    amf_nausf_auth_build_authenticate));
68
+                amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, NULL,
69
+                    amf_nausf_auth_build_authenticate, amf_ue, NULL));
70
             break;
71
 
72
         case OGS_NAS_5GS_5GMM_STATUS:
73
@@ -834,8 +832,8 @@
74
             amf_ue->nhcc = 1;
75
 
76
             ogs_assert(true ==
77
-                amf_ue_sbi_discover_and_send(OpenAPI_nf_type_UDM, amf_ue, NULL,
78
-                    amf_nudm_uecm_build_registration));
79
+                amf_ue_sbi_discover_and_send(OpenAPI_nf_type_UDM, NULL,
80
+                    amf_nudm_uecm_build_registration, amf_ue, NULL));
81
 
82
             if (amf_ue->nas.message_type == OGS_NAS_5GS_REGISTRATION_REQUEST) {
83
                 OGS_FSM_TRAN(s, &gmm_state_initial_context_setup);
84
@@ -869,8 +867,8 @@
85
             }
86
 
87
             ogs_assert(true ==
88
-                amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, amf_ue, NULL,
89
-                    amf_nausf_auth_build_authenticate));
90
+                amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, NULL,
91
+                    amf_nausf_auth_build_authenticate, amf_ue, NULL));
92
 
93
             OGS_FSM_TRAN(s, &gmm_state_authentication);
94
             break;
95
@@ -996,9 +994,9 @@
96
                 CASE(OGS_SBI_HTTP_METHOD_PUT)
97
                     ogs_assert(true ==
98
                         amf_ue_sbi_discover_and_send(
99
-                            OpenAPI_nf_type_UDM, amf_ue,
100
-                            (char *)OGS_SBI_RESOURCE_NAME_AM_DATA,
101
-                            amf_nudm_sdm_build_get));
102
+                            OpenAPI_nf_type_UDM, NULL,
103
+                            amf_nudm_sdm_build_get,
104
+                            amf_ue, (char *)OGS_SBI_RESOURCE_NAME_AM_DATA));
105
                     break;
106
 
107
                 DEFAULT
108
@@ -1196,9 +1194,8 @@
109
                     amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
110
             if (amf_sess_xact_count(amf_ue) == xact_count) {
111
                 ogs_assert(true ==
112
-                    amf_ue_sbi_discover_and_send(
113
-                        OpenAPI_nf_type_AUSF, amf_ue, NULL,
114
-                        amf_nausf_auth_build_authenticate));
115
+                    amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, NULL,
116
+                        amf_nausf_auth_build_authenticate, amf_ue, NULL));
117
             }
118
             OGS_FSM_TRAN(s, &gmm_state_authentication);
119
             break;
120
@@ -1361,8 +1358,9 @@
121
                     if (!PCF_AM_POLICY_ASSOCIATED(amf_ue)) {
122
                         ogs_assert(true ==
123
                             amf_ue_sbi_discover_and_send(
124
-                                OpenAPI_nf_type_PCF, amf_ue, NULL,
125
-                                amf_npcf_am_policy_control_build_create));
126
+                                OpenAPI_nf_type_PCF, NULL,
127
+                                amf_npcf_am_policy_control_build_create,
128
+                                amf_ue, NULL));
129
                         OGS_FSM_TRAN(s, &gmm_state_initial_context_setup);
130
                         break;
131
                     }
132
@@ -1383,9 +1381,8 @@
133
                         amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
134
                 if (amf_sess_xact_count(amf_ue) == xact_count) {
135
                     ogs_assert(true ==
136
-                        amf_ue_sbi_discover_and_send(
137
-                            OpenAPI_nf_type_AUSF, amf_ue, NULL,
138
-                            amf_nausf_auth_build_authenticate));
139
+                        amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, NULL,
140
+                            amf_nausf_auth_build_authenticate, amf_ue, NULL));
141
                 }
142
 
143
                 OGS_FSM_TRAN(s, &gmm_state_authentication);
144
open5gs_2.4.8.202207240002.tar.xz/src/amf/namf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/amf/namf-handler.c Changed
13
 
1
@@ -577,9 +577,8 @@
2
 
3
             if (ogs_list_count(&amf_ue->sess_list) == 0)
4
                 ogs_assert(true ==
5
-                    amf_ue_sbi_discover_and_send(
6
-                        OpenAPI_nf_type_PCF, amf_ue,
7
-                        NULL, amf_npcf_am_policy_control_build_delete));
8
+                    amf_ue_sbi_discover_and_send(OpenAPI_nf_type_PCF, NULL,
9
+                        amf_npcf_am_policy_control_build_delete, amf_ue, NULL));
10
 
11
             OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_de_registered);
12
     }
13
open5gs_2.4.8.202207240002.tar.xz/src/amf/ngap-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/amf/ngap-handler.c Changed
131
 
1
@@ -904,9 +904,9 @@
2
         ogs_pkbuf_put_data(param.n2smbuf, transfer->buf, transfer->size);
3
 
4
         ogs_assert(true ==
5
-            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
6
-                sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, &param,
7
-                amf_nsmf_pdusession_build_update_sm_context));
8
+            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
9
+                amf_nsmf_pdusession_build_update_sm_context,
10
+                sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, &param));
11
 
12
         ogs_pkbuf_free(param.n2smbuf);
13
     }
14
@@ -1643,9 +1643,9 @@
15
             ogs_pkbuf_put_data(param.n2smbuf, transfer->buf, transfer->size);
16
 
17
             ogs_assert(true ==
18
-                amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
19
-                    sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, &param,
20
-                    amf_nsmf_pdusession_build_update_sm_context));
21
+                amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
22
+                    amf_nsmf_pdusession_build_update_sm_context,
23
+                    sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, &param));
24
 
25
             ogs_pkbuf_free(param.n2smbuf);
26
         }
27
@@ -1762,9 +1762,9 @@
28
             amf_ue->deactivation.cause = NGAP_CauseNas_normal_release;
29
 
30
             ogs_assert(true ==
31
-                amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
32
-                    sess, AMF_UPDATE_SM_CONTEXT_SETUP_FAIL, &param,
33
-                    amf_nsmf_pdusession_build_update_sm_context));
34
+                amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
35
+                    amf_nsmf_pdusession_build_update_sm_context,
36
+                    sess, AMF_UPDATE_SM_CONTEXT_SETUP_FAIL, &param));
37
 
38
             ogs_pkbuf_free(param.n2smbuf);
39
         }
40
@@ -1942,9 +1942,9 @@
41
         ogs_pkbuf_put_data(param.n2smbuf, transfer->buf, transfer->size);
42
 
43
         ogs_assert(true ==
44
-            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
45
-                sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, &param,
46
-                amf_nsmf_pdusession_build_update_sm_context));
47
+            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
48
+                amf_nsmf_pdusession_build_update_sm_context,
49
+                sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, &param));
50
 
51
         ogs_pkbuf_free(param.n2smbuf);
52
     }
53
@@ -2117,9 +2117,9 @@
54
         ogs_pkbuf_put_data(param.n2smbuf, transfer->buf, transfer->size);
55
 
56
         ogs_assert(true ==
57
-            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
58
-                sess, AMF_UPDATE_SM_CONTEXT_N2_RELEASED, &param,
59
-                amf_nsmf_pdusession_build_update_sm_context));
60
+            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
61
+                amf_nsmf_pdusession_build_update_sm_context,
62
+                sess, AMF_UPDATE_SM_CONTEXT_N2_RELEASED, &param));
63
 
64
         ogs_pkbuf_free(param.n2smbuf);
65
     }
66
@@ -2539,9 +2539,9 @@
67
         ogs_pkbuf_put_data(param.n2smbuf, transfer->buf, transfer->size);
68
 
69
         ogs_assert(true ==
70
-            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
71
-                sess, AMF_UPDATE_SM_CONTEXT_PATH_SWITCH_REQUEST, &param,
72
-                amf_nsmf_pdusession_build_update_sm_context));
73
+            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
74
+                amf_nsmf_pdusession_build_update_sm_context,
75
+                sess, AMF_UPDATE_SM_CONTEXT_PATH_SWITCH_REQUEST, &param));
76
 
77
         ogs_pkbuf_free(param.n2smbuf);
78
     }
79
@@ -2855,9 +2855,9 @@
80
         param.TargetID = TargetID;
81
 
82
         ogs_assert(true ==
83
-            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
84
-                sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED, &param,
85
-                amf_nsmf_pdusession_build_update_sm_context));
86
+            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
87
+                amf_nsmf_pdusession_build_update_sm_context,
88
+                sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED, &param));
89
 
90
         ogs_pkbuf_free(param.n2smbuf);
91
     }
92
@@ -3079,9 +3079,9 @@
93
         param.hoState = OpenAPI_ho_state_PREPARED;
94
 
95
         ogs_assert(true ==
96
-            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
97
-                sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_REQ_ACK, &param,
98
-                amf_nsmf_pdusession_build_update_sm_context));
99
+            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
100
+                amf_nsmf_pdusession_build_update_sm_context,
101
+                sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_REQ_ACK, &param));
102
 
103
         ogs_pkbuf_free(param.n2smbuf);
104
     }
105
@@ -3324,9 +3324,9 @@
106
         param.ngApCause.value = (int)Cause->choice.radioNetwork;
107
 
108
         ogs_assert(true ==
109
-            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
110
-                sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_CANCEL, &param,
111
-                amf_nsmf_pdusession_build_update_sm_context));
112
+            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
113
+                amf_nsmf_pdusession_build_update_sm_context,
114
+                sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_CANCEL, &param));
115
     }
116
 }
117
 
118
@@ -3604,9 +3604,9 @@
119
         param.hoState = OpenAPI_ho_state_COMPLETED;
120
 
121
         ogs_assert(true ==
122
-            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
123
-                sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY, &param,
124
-                amf_nsmf_pdusession_build_update_sm_context));
125
+            amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
126
+                amf_nsmf_pdusession_build_update_sm_context,
127
+                sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY, &param));
128
     }
129
 }
130
 
131
open5gs_2.4.8.202207240002.tar.xz/src/amf/nnrf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/amf/nnrf-handler.c Changed
122
 
1
@@ -255,16 +255,19 @@
2
         ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg)
3
 {
4
     ogs_sbi_object_t *sbi_object = NULL;
5
-    amf_ue_t *amf_ue = NULL;
6
-    amf_sess_t *sess = NULL;
7
-    ogs_sbi_nf_instance_t *nf_instance = NULL;
8
+    OpenAPI_nf_type_e target_nf_type = 0;
9
+    ogs_sbi_discovery_option_t *discovery_option = NULL;
10
 
11
     OpenAPI_search_result_t *SearchResult = NULL;
12
 
13
+    ogs_assert(recvmsg);
14
     ogs_assert(xact);
15
     sbi_object = xact->sbi_object;
16
     ogs_assert(sbi_object);
17
-    ogs_assert(recvmsg);
18
+    target_nf_type = xact->target_nf_type;
19
+    ogs_assert(target_nf_type);
20
+
21
+    discovery_option = xact->discovery_option;
22
 
23
     SearchResult = recvmsg->SearchResult;
24
     if (!SearchResult) {
25
@@ -272,53 +275,19 @@
26
         return;
27
     }
28
 
29
-    amf_nnrf_handle_nf_discover_search_result(sbi_object, SearchResult);
30
+    amf_nnrf_handle_nf_discover_search_result(
31
+            sbi_object, target_nf_type, discovery_option, SearchResult);
32
 
33
-    ogs_assert(xact->target_nf_type);
34
-    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, xact->target_nf_type);
35
-    if (!nf_instance) {
36
-        ogs_assert(sbi_object->type > OGS_SBI_OBJ_BASE &&
37
-                    sbi_object->type < OGS_SBI_OBJ_TOP);
38
-        switch(sbi_object->type) {
39
-        case OGS_SBI_OBJ_UE_TYPE:
40
-            amf_ue = (amf_ue_t *)sbi_object;
41
-            ogs_assert(amf_ue);
42
-            ogs_error("%s (NF discover) No %s", amf_ue->suci,
43
-                    OpenAPI_nf_type_ToString(xact->target_nf_type));
44
-            ogs_assert(OGS_OK ==
45
-                nas_5gs_send_gmm_reject_from_sbi(amf_ue,
46
-                    OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
47
-            break;
48
-        case OGS_SBI_OBJ_SESS_TYPE:
49
-            sess = (amf_sess_t *)sbi_object;
50
-            ogs_assert(sess);
51
-            ogs_error("%d:%d (NF discover) No %s", sess->psi, sess->pti,
52
-                    OpenAPI_nf_type_ToString(xact->target_nf_type));
53
-            if (sess->payload_container_type) {
54
-                ogs_assert(OGS_OK ==
55
-                    nas_5gs_send_back_gsm_message(sess,
56
-                        OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
57
-                        AMF_NAS_BACKOFF_TIME));
58
-            } else {
59
-                ogs_assert(OGS_OK ==
60
-                    ngap_send_error_indication2(amf_ue,
61
-                        NGAP_Cause_PR_transport,
62
-                        NGAP_CauseTransport_transport_resource_unavailable));
63
-            }
64
-            break;
65
-        default:
66
-            ogs_fatal("(NF discover) Not implemented %s:%d",
67
-                OpenAPI_nf_type_ToString(xact->target_nf_type),
68
-                sbi_object->type);
69
-            ogs_assert_if_reached();
70
-        }
71
-    } else {
72
-        ogs_assert(true == amf_sbi_send(nf_instance, xact));
73
-    }
74
+    amf_sbi_select_nf(sbi_object, target_nf_type, discovery_option);
75
+
76
+    ogs_expect(true == amf_sbi_send_request(sbi_object, target_nf_type, xact));
77
 }
78
 
79
 void amf_nnrf_handle_nf_discover_search_result(
80
-        ogs_sbi_object_t *sbi_object, OpenAPI_search_result_t *SearchResult)
81
+        ogs_sbi_object_t *sbi_object,
82
+        OpenAPI_nf_type_e target_nf_type,
83
+        ogs_sbi_discovery_option_t *discovery_option,
84
+        OpenAPI_search_result_t *SearchResult)
85
 {
86
     bool handled;
87
 
88
@@ -355,9 +324,6 @@
89
         }
90
 
91
         if (NF_INSTANCE_IS_OTHERS(nf_instance->id)) {
92
-            amf_ue_t *amf_ue = NULL;
93
-            amf_sess_t *sess = NULL;
94
-
95
             handled = ogs_sbi_nnrf_handle_nf_profile(
96
                         nf_instance, NFProfile, NULL, NULL);
97
             if (!handled) {
98
@@ -374,23 +340,6 @@
99
                 continue;
100
             }
101
 
102
-            switch(sbi_object->type) {
103
-            case OGS_SBI_OBJ_UE_TYPE:
104
-                amf_ue = (amf_ue_t *)sbi_object;
105
-                ogs_assert(amf_ue);
106
-                amf_ue_select_nf(amf_ue, nf_instance->nf_type);
107
-                break;
108
-            case OGS_SBI_OBJ_SESS_TYPE:
109
-                sess = (amf_sess_t *)sbi_object;
110
-                ogs_assert(sess);
111
-                amf_sess_select_nf(sess, nf_instance->nf_type);
112
-                break;
113
-            default:
114
-                ogs_fatal("(NF discover search result) Not implemented %d",
115
-                            sbi_object->type);
116
-                ogs_assert_if_reached();
117
-            }
118
-
119
             /* TIME : Update validity from NRF */
120
             if (SearchResult->is_validity_period &&
121
                 SearchResult->validity_period) {
122
open5gs_2.4.8.202207240002.tar.xz/src/amf/nnrf-handler.h -> open5gs_2.4.8.202207250002.tar.xz/src/amf/nnrf-handler.h Changed
13
 
1
@@ -37,7 +37,10 @@
2
 void amf_nnrf_handle_nf_discover(
3
         ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg);
4
 void amf_nnrf_handle_nf_discover_search_result(
5
-        ogs_sbi_object_t *sbi_object, OpenAPI_search_result_t *SearchResult);
6
+        ogs_sbi_object_t *sbi_object,
7
+        OpenAPI_nf_type_e target_nf_type,
8
+        ogs_sbi_discovery_option_t *discovery_option,
9
+        OpenAPI_search_result_t *SearchResult);
10
 
11
 #ifdef __cplusplus
12
 }
13
open5gs_2.4.8.202207240002.tar.xz/src/amf/nsmf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/amf/nsmf-handler.c Changed
63
 
1
@@ -231,8 +231,9 @@
2
                         if (!PCF_AM_POLICY_ASSOCIATED(amf_ue)) {
3
                             ogs_assert(true ==
4
                                 amf_ue_sbi_discover_and_send(
5
-                                    OpenAPI_nf_type_PCF, amf_ue, NULL,
6
-                                    amf_npcf_am_policy_control_build_create));
7
+                                    OpenAPI_nf_type_PCF, NULL,
8
+                                    amf_npcf_am_policy_control_build_create,
9
+                                    amf_ue, NULL));
10
                         } else {
11
                             CLEAR_AMF_UE_TIMER(amf_ue->t3550);
12
                             ogs_assert(OGS_OK ==
13
@@ -562,9 +563,9 @@
14
                 ogs_warn("%s:%d Receive Update SM context"
15
                         "(DUPLICATED_PDU_SESSION_ID)", amf_ue->supi, sess->psi);
16
 
17
-                amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF,
18
-                        sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL,
19
-                        amf_nsmf_pdusession_build_create_sm_context);
20
+                amf_sess_sbi_discover_and_send(OpenAPI_nf_type_SMF, NULL,
21
+                        amf_nsmf_pdusession_build_create_sm_context,
22
+                        sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL);
23
 
24
             } else if (state == AMF_UPDATE_SM_CONTEXT_PATH_SWITCH_REQUEST) {
25
 
26
@@ -815,9 +816,8 @@
27
 
28
             if (!PCF_AM_POLICY_ASSOCIATED(amf_ue)) {
29
                 ogs_assert(true ==
30
-                    amf_ue_sbi_discover_and_send(
31
-                        OpenAPI_nf_type_PCF, amf_ue, NULL,
32
-                        amf_npcf_am_policy_control_build_create));
33
+                    amf_ue_sbi_discover_and_send(OpenAPI_nf_type_PCF, NULL,
34
+                        amf_npcf_am_policy_control_build_create, amf_ue, NULL));
35
             } else {
36
                 CLEAR_AMF_UE_TIMER(amf_ue->t3550);
37
                 ogs_assert(OGS_OK ==
38
@@ -868,9 +868,8 @@
39
                 if (OGS_FSM_CHECK(&amf_ue->sm, gmm_state_authentication)) {
40
 
41
                     ogs_assert(true ==
42
-                        amf_ue_sbi_discover_and_send(
43
-                            OpenAPI_nf_type_AUSF, amf_ue, NULL,
44
-                            amf_nausf_auth_build_authenticate));
45
+                        amf_ue_sbi_discover_and_send(OpenAPI_nf_type_AUSF, NULL,
46
+                            amf_nausf_auth_build_authenticate, amf_ue, NULL));
47
 
48
                 } else if (OGS_FSM_CHECK(&amf_ue->sm,
49
                             gmm_state_de_registered)) {
50
@@ -886,9 +885,9 @@
51
                      */
52
 
53
                     ogs_assert(true ==
54
-                        amf_ue_sbi_discover_and_send(
55
-                            OpenAPI_nf_type_PCF, amf_ue,
56
-                            NULL, amf_npcf_am_policy_control_build_delete));
57
+                        amf_ue_sbi_discover_and_send(OpenAPI_nf_type_PCF, NULL,
58
+                            amf_npcf_am_policy_control_build_delete,
59
+                            amf_ue, NULL));
60
 
61
                 } else if (OGS_FSM_CHECK(&amf_ue->sm, gmm_state_registered)) {
62
                     /*
63
open5gs_2.4.8.202207240002.tar.xz/src/amf/nudm-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/amf/nudm-handler.c Changed
35
 
1
@@ -140,9 +140,9 @@
2
         }
3
 
4
         ogs_assert(true ==
5
-            amf_ue_sbi_discover_and_send(OpenAPI_nf_type_UDM, amf_ue,
6
-                (char *)OGS_SBI_RESOURCE_NAME_SMF_SELECT_DATA,
7
-                amf_nudm_sdm_build_get));
8
+            amf_ue_sbi_discover_and_send(OpenAPI_nf_type_UDM, NULL,
9
+                amf_nudm_sdm_build_get,
10
+                amf_ue, (char *)OGS_SBI_RESOURCE_NAME_SMF_SELECT_DATA));
11
         break;
12
 
13
     CASE(OGS_SBI_RESOURCE_NAME_SMF_SELECT_DATA)
14
@@ -212,15 +212,15 @@
15
             }
16
         }
17
         ogs_assert(true ==
18
-            amf_ue_sbi_discover_and_send(OpenAPI_nf_type_UDM, amf_ue,
19
-                (char *)OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA,
20
-                amf_nudm_sdm_build_get));
21
+            amf_ue_sbi_discover_and_send(OpenAPI_nf_type_UDM, NULL,
22
+                amf_nudm_sdm_build_get,
23
+                amf_ue, (char *)OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA));
24
         break;
25
 
26
     CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA)
27
         ogs_assert(true ==
28
-            amf_ue_sbi_discover_and_send(OpenAPI_nf_type_PCF, amf_ue,
29
-                NULL, amf_npcf_am_policy_control_build_create));
30
+            amf_ue_sbi_discover_and_send(OpenAPI_nf_type_PCF, NULL,
31
+                amf_npcf_am_policy_control_build_create, amf_ue, NULL));
32
         break;
33
 
34
     DEFAULT
35
open5gs_2.4.8.202207240002.tar.xz/src/amf/sbi-path.c -> open5gs_2.4.8.202207250002.tar.xz/src/amf/sbi-path.c Changed
201
 
1
@@ -19,6 +19,7 @@
2
 
3
 #include "sbi-path.h"
4
 #include "nas-path.h"
5
+#include "ngap-path.h"
6
 #include "nnrf-handler.h"
7
 
8
 static int server_cb(ogs_sbi_request_t *request, void *data)
9
@@ -81,9 +82,6 @@
10
     ogs_sbi_nf_instance_t *nf_instance = NULL;
11
     ogs_sbi_nf_service_t *service = NULL;
12
 
13
-    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
14
-        return OGS_ERROR;
15
-
16
     /* Add SELF NF instance */
17
     nf_instance = ogs_sbi_self()->nf_instance;
18
     ogs_assert(nf_instance);
19
@@ -126,6 +124,16 @@
20
         amf_nf_fsm_init(nf_instance);
21
     }
22
 
23
+    /* Timer expiration handler of client wait timer */
24
+    ogs_sbi_self()->client_wait_expire = amf_timer_sbi_client_wait_expire;
25
+
26
+    /* NF register state in NF state machine */
27
+    ogs_sbi_self()->nf_state_registered =
28
+        (ogs_fsm_handler_t)amf_nf_state_registered;
29
+
30
+    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
31
+        return OGS_ERROR;
32
+
33
     return OGS_OK;
34
 }
35
 
36
@@ -135,24 +143,84 @@
37
     ogs_sbi_server_stop_all();
38
 }
39
 
40
-bool amf_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact)
41
+bool amf_sbi_send_request(
42
+        ogs_sbi_object_t *sbi_object,
43
+        OpenAPI_nf_type_e target_nf_type,
44
+        void *data)
45
 {
46
-    return ogs_sbi_send(nf_instance, client_cb, xact);
47
+    ogs_sbi_nf_instance_t *nf_instance = NULL;
48
+
49
+    ogs_assert(sbi_object);
50
+    ogs_assert(target_nf_type);
51
+    ogs_assert(data);
52
+
53
+    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, target_nf_type);
54
+    if (!nf_instance) {
55
+        amf_ue_t *amf_ue = NULL;
56
+        amf_sess_t *sess = NULL;
57
+
58
+        ogs_assert(sbi_object->type > OGS_SBI_OBJ_BASE &&
59
+                    sbi_object->type < OGS_SBI_OBJ_TOP);
60
+        switch(sbi_object->type) {
61
+        case OGS_SBI_OBJ_UE_TYPE:
62
+            amf_ue = (amf_ue_t *)sbi_object;
63
+            ogs_assert(amf_ue);
64
+            ogs_error("%s (NF discover) No %s", amf_ue->suci,
65
+                    OpenAPI_nf_type_ToString(target_nf_type));
66
+            ogs_assert(OGS_OK ==
67
+                nas_5gs_send_gmm_reject_from_sbi(amf_ue,
68
+                    OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
69
+            break;
70
+        case OGS_SBI_OBJ_SESS_TYPE:
71
+            sess = (amf_sess_t *)sbi_object;
72
+            ogs_assert(sess);
73
+            ogs_error("%d:%d (NF discover) No %s", sess->psi, sess->pti,
74
+                    OpenAPI_nf_type_ToString(target_nf_type));
75
+            if (sess->payload_container_type) {
76
+                ogs_assert(OGS_OK ==
77
+                    nas_5gs_send_back_gsm_message(sess,
78
+                        OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
79
+                        AMF_NAS_BACKOFF_TIME));
80
+            } else {
81
+                ogs_assert(OGS_OK ==
82
+                    ngap_send_error_indication2(amf_ue,
83
+                        NGAP_Cause_PR_transport,
84
+                        NGAP_CauseTransport_transport_resource_unavailable));
85
+            }
86
+            break;
87
+        default:
88
+            ogs_fatal("(NF discover) Not implemented %s:%d",
89
+                OpenAPI_nf_type_ToString(target_nf_type),
90
+                sbi_object->type);
91
+            ogs_assert_if_reached();
92
+        }
93
+
94
+        return false;
95
+    }
96
+
97
+    return ogs_sbi_send_request(nf_instance, client_cb, data);
98
 }
99
 
100
 bool amf_ue_sbi_discover_and_send(
101
-        OpenAPI_nf_type_e target_nf_type, amf_ue_t *amf_ue, void *data,
102
-        ogs_sbi_request_t *(*build)(amf_ue_t *amf_ue, void *data))
103
+        OpenAPI_nf_type_e target_nf_type,
104
+        ogs_sbi_discovery_option_t *discovery_option,
105
+        ogs_sbi_request_t *(*build)(amf_ue_t *amf_ue, void *data),
106
+        amf_ue_t *amf_ue, void *data)
107
 {
108
     ogs_sbi_xact_t *xact = NULL;
109
+    OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL;
110
+
111
+    ogs_assert(ogs_sbi_self()->nf_instance);
112
+    requester_nf_type = ogs_sbi_self()->nf_instance->nf_type;
113
+    ogs_assert(requester_nf_type);
114
 
115
     ogs_assert(target_nf_type);
116
     ogs_assert(amf_ue);
117
     ogs_assert(build);
118
 
119
-    xact = ogs_sbi_xact_add(target_nf_type, &amf_ue->sbi,
120
-            (ogs_sbi_build_f)build, amf_ue, data,
121
-            amf_timer_sbi_client_wait_expire);
122
+    xact = ogs_sbi_xact_add(
123
+            &amf_ue->sbi, target_nf_type, discovery_option,
124
+            (ogs_sbi_build_f)build, amf_ue, data);
125
     if (!xact) {
126
         ogs_error("amf_ue_sbi_discover_and_send() failed");
127
         ogs_assert(OGS_OK ==
128
@@ -161,8 +229,10 @@
129
         return false;
130
     }
131
 
132
-    if (ogs_sbi_discover_and_send(xact,
133
-            (ogs_fsm_handler_t)amf_nf_state_registered, client_cb) != true) {
134
+    if (ogs_sbi_discover_and_send(
135
+            &amf_ue->sbi,
136
+            target_nf_type, requester_nf_type, discovery_option,
137
+            client_cb, xact) != true) {
138
         ogs_error("amf_ue_sbi_discover_and_send() failed");
139
         ogs_sbi_xact_remove(xact);
140
         ogs_assert(OGS_OK ==
141
@@ -174,19 +244,26 @@
142
     return true;
143
 }
144
 
145
-bool amf_sess_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
146
-        amf_sess_t *sess, int state, void *data,
147
-        ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data))
148
+bool amf_sess_sbi_discover_and_send(
149
+        OpenAPI_nf_type_e target_nf_type,
150
+        ogs_sbi_discovery_option_t *discovery_option,
151
+        ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data),
152
+        amf_sess_t *sess, int state, void *data)
153
 {
154
     ogs_sbi_xact_t *xact = NULL;
155
+    OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL;
156
+
157
+    ogs_assert(ogs_sbi_self()->nf_instance);
158
+    requester_nf_type = ogs_sbi_self()->nf_instance->nf_type;
159
+    ogs_assert(requester_nf_type);
160
 
161
     ogs_assert(target_nf_type);
162
     ogs_assert(sess);
163
     ogs_assert(build);
164
 
165
-    xact = ogs_sbi_xact_add(target_nf_type, &sess->sbi,
166
-            (ogs_sbi_build_f)build, sess, data,
167
-            amf_timer_sbi_client_wait_expire);
168
+    xact = ogs_sbi_xact_add(
169
+            &sess->sbi, target_nf_type, discovery_option,
170
+            (ogs_sbi_build_f)build, sess, data);
171
     if (!xact) {
172
         ogs_error("amf_sess_sbi_discover_and_send() failed");
173
         ogs_assert(OGS_OK == nas_5gs_send_back_gsm_message(sess,
174
@@ -196,8 +273,10 @@
175
 
176
     xact->state = state;
177
 
178
-    if (ogs_sbi_discover_and_send(xact,
179
-            (ogs_fsm_handler_t)amf_nf_state_registered, client_cb) != true) {
180
+    if (ogs_sbi_discover_and_send(
181
+            &sess->sbi,
182
+            target_nf_type, requester_nf_type, discovery_option,
183
+            client_cb, xact) != true) {
184
         ogs_error("amf_sess_sbi_discover_and_send() failed");
185
         ogs_sbi_xact_remove(xact);
186
         ogs_assert(OGS_OK == nas_5gs_send_back_gsm_message(sess,
187
@@ -252,7 +331,9 @@
188
     }
189
 
190
     amf_nnrf_handle_nf_discover_search_result(
191
-            &sess->sbi, message.SearchResult);
192
+            &sess->sbi, OpenAPI_nf_type_SMF, NULL, message.SearchResult);
193
+
194
+    amf_sbi_select_nf(&sess->sbi, OpenAPI_nf_type_SMF, NULL);
195
 
196
     if (!OGS_SBI_NF_INSTANCE(&sess->sbi, OpenAPI_nf_type_SMF)) {
197
         ogs_error("Cannot discover %s",
198
@@ -265,9 +346,9 @@
199
         goto cleanup;
200
     }
201
open5gs_2.4.8.202207240002.tar.xz/src/amf/sbi-path.h -> open5gs_2.4.8.202207250002.tar.xz/src/amf/sbi-path.h Changed
36
 
1
@@ -34,10 +34,15 @@
2
 int amf_sbi_open(void);
3
 void amf_sbi_close(void);
4
 
5
-bool amf_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact);
6
-bool amf_ue_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
7
-        amf_ue_t *amf_ue, void *data,
8
-        ogs_sbi_request_t *(*build)(amf_ue_t *amf_ue, void *data));
9
+bool amf_sbi_send_request(
10
+        ogs_sbi_object_t *sbi_object,
11
+        OpenAPI_nf_type_e target_nf_type,
12
+        void *data);
13
+bool amf_ue_sbi_discover_and_send(
14
+        OpenAPI_nf_type_e target_nf_type,
15
+        ogs_sbi_discovery_option_t *discovery_option,
16
+        ogs_sbi_request_t *(*build)(amf_ue_t *amf_ue, void *data),
17
+        amf_ue_t *amf_ue, void *data);
18
 
19
 #define AMF_CREATE_SM_CONTEXT_NO_STATE              0
20
 #define AMF_UPDATE_SM_CONTEXT_ACTIVATED             11
21
@@ -61,9 +66,11 @@
22
 #define AMF_REMOVE_S1_CONTEXT_BY_LO_CONNREFUSED     51
23
 #define AMF_REMOVE_S1_CONTEXT_BY_RESET_ALL          52
24
 #define AMF_REMOVE_S1_CONTEXT_BY_RESET_PARTIAL      53
25
-bool amf_sess_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
26
-        amf_sess_t *sess, int state, void *data,
27
-        ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data));
28
+bool amf_sess_sbi_discover_and_send(
29
+        OpenAPI_nf_type_e target_nf_type,
30
+        ogs_sbi_discovery_option_t *discovery_option,
31
+        ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data),
32
+        amf_sess_t *sess, int state, void *data);
33
 
34
 bool amf_sess_sbi_discover_by_nsi(
35
         OpenAPI_nf_type_e target_nf_type, amf_sess_t *sess);
36
open5gs_2.4.8.202207240002.tar.xz/src/ausf/context.c -> open5gs_2.4.8.202207250002.tar.xz/src/ausf/context.c Changed
13
 
1
@@ -222,11 +222,3 @@
2
 {
3
     return ogs_pool_cycle(&ausf_ue_pool, ausf_ue);
4
 }
5
-
6
-void ausf_ue_select_nf(ausf_ue_t *ausf_ue, OpenAPI_nf_type_e nf_type)
7
-{
8
-    ogs_assert(ausf_ue);
9
-    ogs_assert(nf_type);
10
-
11
-    ogs_sbi_select_nf(&ausf_ue->sbi, nf_type, ausf_nf_state_registered);
12
-}
13
open5gs_2.4.8.202207240002.tar.xz/src/ausf/context.h -> open5gs_2.4.8.202207250002.tar.xz/src/ausf/context.h Changed
10
 
1
@@ -97,8 +97,6 @@
2
 
3
 ausf_ue_t *ausf_ue_cycle(ausf_ue_t *ausf_ue);
4
 
5
-void ausf_ue_select_nf(ausf_ue_t *ausf_ue, OpenAPI_nf_type_e nf_type);
6
-
7
 #ifdef __cplusplus
8
 }
9
 #endif
10
open5gs_2.4.8.202207240002.tar.xz/src/ausf/nausf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/ausf/nausf-handler.c Changed
26
 
1
@@ -55,9 +55,9 @@
2
     ogs_assert(ausf_ue->serving_network_name);
3
 
4
     ogs_assert(true ==
5
-        ausf_sbi_discover_and_send(OpenAPI_nf_type_UDM, ausf_ue, stream,
6
-            AuthenticationInfo->resynchronization_info,
7
-            ausf_nudm_ueau_build_get));
8
+        ausf_sbi_discover_and_send(OpenAPI_nf_type_UDM, NULL,
9
+            ausf_nudm_ueau_build_get,
10
+            ausf_ue, stream, AuthenticationInfo->resynchronization_info));
11
 
12
     return true;
13
 }
14
@@ -104,8 +104,9 @@
15
     }
16
 
17
     ogs_assert(true ==
18
-        ausf_sbi_discover_and_send(OpenAPI_nf_type_UDM, ausf_ue, stream, NULL,
19
-            ausf_nudm_ueau_build_result_confirmation_inform));
20
+        ausf_sbi_discover_and_send(OpenAPI_nf_type_UDM, NULL,
21
+            ausf_nudm_ueau_build_result_confirmation_inform,
22
+            ausf_ue, stream, NULL));
23
 
24
     return true;
25
 }
26
open5gs_2.4.8.202207240002.tar.xz/src/ausf/nnrf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/ausf/nnrf-handler.c Changed
61
 
1
@@ -252,16 +252,22 @@
2
         ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg)
3
 {
4
     ogs_sbi_object_t *sbi_object = NULL;
5
+    OpenAPI_nf_type_e target_nf_type = 0;
6
+    ogs_sbi_discovery_option_t *discovery_option = NULL;
7
     ogs_sbi_nf_instance_t *nf_instance = NULL;
8
 
9
     OpenAPI_search_result_t *SearchResult = NULL;
10
     OpenAPI_lnode_t *node = NULL;
11
     bool handled;
12
 
13
+    ogs_assert(recvmsg);
14
     ogs_assert(xact);
15
     sbi_object = xact->sbi_object;
16
     ogs_assert(sbi_object);
17
-    ogs_assert(recvmsg);
18
+    target_nf_type = xact->target_nf_type;
19
+    ogs_assert(target_nf_type);
20
+
21
+    discovery_option = xact->discovery_option;
22
 
23
     SearchResult = recvmsg->SearchResult;
24
     if (!SearchResult) {
25
@@ -296,8 +302,6 @@
26
         }
27
 
28
         if (NF_INSTANCE_IS_OTHERS(nf_instance->id)) {
29
-            ausf_ue_t *ausf_ue = NULL;
30
-
31
             handled = ogs_sbi_nnrf_handle_nf_profile(
32
                         nf_instance, NFProfile, NULL, NULL);
33
             if (!handled) {
34
@@ -314,10 +318,6 @@
35
                 continue;
36
             }
37
 
38
-            ausf_ue = (ausf_ue_t *)sbi_object;
39
-            ogs_assert(ausf_ue);
40
-            ausf_ue_select_nf(ausf_ue, nf_instance->nf_type);
41
-
42
             /* TIME : Update validity from NRF */
43
             if (SearchResult->is_validity_period &&
44
                 SearchResult->validity_period) {
45
@@ -336,12 +336,7 @@
46
         }
47
     }
48
 
49
-    ogs_assert(xact->target_nf_type);
50
-    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, xact->target_nf_type);
51
-    if (!nf_instance) {
52
-        ogs_error("(NF discover) No %s",
53
-                OpenAPI_nf_type_ToString(xact->target_nf_type));
54
-    } else {
55
-        ogs_assert(true == ausf_sbi_send(nf_instance, xact));
56
-    }
57
+    ogs_sbi_select_nf(sbi_object, target_nf_type, discovery_option);
58
+
59
+    ogs_expect(true == ausf_sbi_send_request(sbi_object, target_nf_type, xact));
60
 }
61
open5gs_2.4.8.202207240002.tar.xz/src/ausf/sbi-path.c -> open5gs_2.4.8.202207250002.tar.xz/src/ausf/sbi-path.c Changed
94
 
1
@@ -79,9 +79,6 @@
2
     ogs_sbi_nf_instance_t *nf_instance = NULL;
3
     ogs_sbi_nf_service_t *service = NULL;
4
 
5
-    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
6
-        return OGS_ERROR;
7
-
8
     /* Add SELF NF instance */
9
     nf_instance = ogs_sbi_self()->nf_instance;
10
     ogs_assert(nf_instance);
11
@@ -114,6 +111,16 @@
12
         }
13
     }
14
 
15
+    /* Timer expiration handler of client wait timer */
16
+    ogs_sbi_self()->client_wait_expire = ausf_timer_sbi_client_wait_expire;
17
+
18
+    /* NF register state in NF state machine */
19
+    ogs_sbi_self()->nf_state_registered =
20
+        (ogs_fsm_handler_t)ausf_nf_state_registered;
21
+
22
+    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
23
+        return OGS_ERROR;
24
+
25
     return OGS_OK;
26
 }
27
 
28
@@ -123,25 +130,44 @@
29
     ogs_sbi_server_stop_all();
30
 }
31
 
32
-bool ausf_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact)
33
+bool ausf_sbi_send_request(
34
+        ogs_sbi_object_t *sbi_object,
35
+        OpenAPI_nf_type_e target_nf_type,
36
+        void *data)
37
 {
38
-    return ogs_sbi_send(nf_instance, client_cb, xact);
39
+    ogs_sbi_nf_instance_t *nf_instance = NULL;
40
+
41
+    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, target_nf_type);
42
+    if (!nf_instance) {
43
+        ogs_error("(NF discover) No %s",
44
+                OpenAPI_nf_type_ToString(target_nf_type));
45
+        return false;
46
+    }
47
+
48
+    return ogs_sbi_send_request(nf_instance, client_cb, data);
49
 }
50
 
51
-bool ausf_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
52
-        ausf_ue_t *ausf_ue, ogs_sbi_stream_t *stream, void *data,
53
-        ogs_sbi_request_t *(*build)(ausf_ue_t *ausf_ue, void *data))
54
+bool ausf_sbi_discover_and_send(
55
+        OpenAPI_nf_type_e target_nf_type,
56
+        ogs_sbi_discovery_option_t *discovery_option,
57
+        ogs_sbi_request_t *(*build)(ausf_ue_t *ausf_ue, void *data),
58
+        ausf_ue_t *ausf_ue, ogs_sbi_stream_t *stream, void *data)
59
 {
60
     ogs_sbi_xact_t *xact = NULL;
61
+    OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL;
62
+
63
+    ogs_assert(ogs_sbi_self()->nf_instance);
64
+    requester_nf_type = ogs_sbi_self()->nf_instance->nf_type;
65
+    ogs_assert(requester_nf_type);
66
 
67
     ogs_assert(target_nf_type);
68
     ogs_assert(ausf_ue);
69
     ogs_assert(stream);
70
     ogs_assert(build);
71
 
72
-    xact = ogs_sbi_xact_add(target_nf_type, &ausf_ue->sbi,
73
-            (ogs_sbi_build_f)build, ausf_ue, data,
74
-            ausf_timer_sbi_client_wait_expire);
75
+    xact = ogs_sbi_xact_add(
76
+            &ausf_ue->sbi, target_nf_type, discovery_option,
77
+            (ogs_sbi_build_f)build, ausf_ue, data);
78
     if (!xact) {
79
         ogs_error("ausf_sbi_discover_and_send() failed");
80
         ogs_assert(true ==
81
@@ -153,8 +179,10 @@
82
 
83
     xact->assoc_stream = stream;
84
 
85
-    if (ogs_sbi_discover_and_send(xact,
86
-            (ogs_fsm_handler_t)ausf_nf_state_registered, client_cb) != true) {
87
+    if (ogs_sbi_discover_and_send(
88
+            &ausf_ue->sbi,
89
+            target_nf_type, requester_nf_type, discovery_option,
90
+            client_cb, xact) != true) {
91
         ogs_error("ausf_sbi_discover_and_send() failed");
92
         ogs_sbi_xact_remove(xact);
93
         ogs_assert(true ==
94
open5gs_2.4.8.202207240002.tar.xz/src/ausf/sbi-path.h -> open5gs_2.4.8.202207250002.tar.xz/src/ausf/sbi-path.h Changed
21
 
1
@@ -30,10 +30,15 @@
2
 int ausf_sbi_open(void);
3
 void ausf_sbi_close(void);
4
 
5
-bool ausf_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact);
6
-bool ausf_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
7
-        ausf_ue_t *ausf_ue, ogs_sbi_stream_t *stream, void *data,
8
-        ogs_sbi_request_t *(*build)(ausf_ue_t *ausf_ue, void *data));
9
+bool ausf_sbi_send_request(
10
+        ogs_sbi_object_t *sbi_object,
11
+        OpenAPI_nf_type_e target_nf_type,
12
+        void *data);
13
+bool ausf_sbi_discover_and_send(
14
+        OpenAPI_nf_type_e target_nf_type,
15
+        ogs_sbi_discovery_option_t *discovery_option,
16
+        ogs_sbi_request_t *(*build)(ausf_ue_t *ausf_ue, void *data),
17
+        ausf_ue_t *ausf_ue, ogs_sbi_stream_t *stream, void *data);
18
 
19
 #ifdef __cplusplus
20
 }
21
open5gs_2.4.8.202207240002.tar.xz/src/bsf/context.c -> open5gs_2.4.8.202207250002.tar.xz/src/bsf/context.c Changed
13
 
1
@@ -323,11 +323,3 @@
2
     return ogs_hash_get(self.ipv6prefix_hash,
3
             &ipv6prefix, (ipv6prefix.len >> 3) + 1);
4
 }
5
-
6
-void bsf_sess_select_nf(bsf_sess_t *sess, OpenAPI_nf_type_e nf_type)
7
-{
8
-    ogs_assert(sess);
9
-    ogs_assert(nf_type);
10
-
11
-    ogs_sbi_select_nf(&sess->sbi, nf_type, bsf_nf_state_registered);
12
-}
13
open5gs_2.4.8.202207240002.tar.xz/src/bsf/context.h -> open5gs_2.4.8.202207250002.tar.xz/src/bsf/context.h Changed
10
 
1
@@ -114,8 +114,6 @@
2
 bsf_sess_t *bsf_sess_find_by_ipv4addr(char *ipv4addr_string);
3
 bsf_sess_t *bsf_sess_find_by_ipv6prefix(char *ipv6prefix_string);
4
 
5
-void bsf_sess_select_nf(bsf_sess_t *sess, OpenAPI_nf_type_e nf_type);
6
-
7
 #ifdef __cplusplus
8
 }
9
 #endif
10
open5gs_2.4.8.202207240002.tar.xz/src/bsf/nnrf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/bsf/nnrf-handler.c Changed
61
 
1
@@ -253,16 +253,22 @@
2
         ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg)
3
 {
4
     ogs_sbi_object_t *sbi_object = NULL;
5
+    OpenAPI_nf_type_e target_nf_type = 0;
6
+    ogs_sbi_discovery_option_t *discovery_option = NULL;
7
     ogs_sbi_nf_instance_t *nf_instance = NULL;
8
 
9
     OpenAPI_search_result_t *SearchResult = NULL;
10
     OpenAPI_lnode_t *node = NULL;
11
     bool handled;
12
 
13
+    ogs_assert(recvmsg);
14
     ogs_assert(xact);
15
     sbi_object = xact->sbi_object;
16
     ogs_assert(sbi_object);
17
-    ogs_assert(recvmsg);
18
+    target_nf_type = xact->target_nf_type;
19
+    ogs_assert(target_nf_type);
20
+
21
+    discovery_option = xact->discovery_option;
22
 
23
     SearchResult = recvmsg->SearchResult;
24
     if (!SearchResult) {
25
@@ -297,8 +303,6 @@
26
         }
27
 
28
         if (NF_INSTANCE_IS_OTHERS(nf_instance->id)) {
29
-            bsf_sess_t *sess = NULL;
30
-
31
             handled = ogs_sbi_nnrf_handle_nf_profile(
32
                         nf_instance, NFProfile, NULL, NULL);
33
             if (!handled) {
34
@@ -315,10 +319,6 @@
35
                 continue;
36
             }
37
 
38
-            sess = (bsf_sess_t *)sbi_object;
39
-            ogs_assert(sess);
40
-            bsf_sess_select_nf(sess, nf_instance->nf_type);
41
-
42
             /* TIME : Update validity from NRF */
43
             if (SearchResult->is_validity_period &&
44
                 SearchResult->validity_period) {
45
@@ -337,12 +337,7 @@
46
         }
47
     }
48
 
49
-    ogs_assert(xact->target_nf_type);
50
-    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, xact->target_nf_type);
51
-    if (!nf_instance) {
52
-        ogs_error("(NF discover) No %s",
53
-                OpenAPI_nf_type_ToString(xact->target_nf_type));
54
-    } else {
55
-        bsf_sbi_send(nf_instance, xact);
56
-    }
57
+    ogs_sbi_select_nf(sbi_object, target_nf_type, discovery_option);
58
+
59
+    ogs_expect(true == bsf_sbi_send_request(sbi_object, target_nf_type, xact));
60
 }
61
open5gs_2.4.8.202207240002.tar.xz/src/bsf/sbi-path.c -> open5gs_2.4.8.202207250002.tar.xz/src/bsf/sbi-path.c Changed
94
 
1
@@ -79,9 +79,6 @@
2
     ogs_sbi_nf_instance_t *nf_instance = NULL;
3
     ogs_sbi_nf_service_t *service = NULL;
4
 
5
-    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
6
-        return OGS_ERROR;
7
-
8
     /* Add SELF NF instance */
9
     nf_instance = ogs_sbi_self()->nf_instance;
10
     ogs_assert(nf_instance);
11
@@ -114,6 +111,16 @@
12
         }
13
     }
14
 
15
+    /* Timer expiration handler of client wait timer */
16
+    ogs_sbi_self()->client_wait_expire = bsf_timer_sbi_client_wait_expire;
17
+
18
+    /* NF register state in NF state machine */
19
+    ogs_sbi_self()->nf_state_registered =
20
+        (ogs_fsm_handler_t)bsf_nf_state_registered;
21
+
22
+    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
23
+        return OGS_ERROR;
24
+
25
     return OGS_OK;
26
 }
27
 
28
@@ -123,26 +130,43 @@
29
     ogs_sbi_server_stop_all();
30
 }
31
 
32
-bool bsf_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact)
33
+bool bsf_sbi_send_request(
34
+        ogs_sbi_object_t *sbi_object,
35
+        OpenAPI_nf_type_e target_nf_type,
36
+        void *data)
37
 {
38
-    return ogs_sbi_send(nf_instance, client_cb, xact);
39
+    ogs_sbi_nf_instance_t *nf_instance = NULL;
40
+
41
+    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, target_nf_type);
42
+    if (!nf_instance) {
43
+        ogs_error("(NF discover) No %s",
44
+                OpenAPI_nf_type_ToString(target_nf_type));
45
+        return false;
46
+    }
47
+
48
+    return ogs_sbi_send_request(nf_instance, client_cb, data);
49
 }
50
 
51
-bool bsf_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
52
-        bsf_sess_t *sess, ogs_sbi_stream_t *stream, void *data,
53
-        ogs_sbi_request_t *(*build)(bsf_sess_t *sess, void *data))
54
+bool bsf_sbi_discover_and_send(
55
+        OpenAPI_nf_type_e target_nf_type,
56
+        ogs_sbi_discovery_option_t *discovery_option,
57
+        ogs_sbi_request_t *(*build)(bsf_sess_t *sess, void *data),
58
+        bsf_sess_t *sess, ogs_sbi_stream_t *stream, void *data)
59
 {
60
     ogs_sbi_xact_t *xact = NULL;
61
+    OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL;
62
 
63
-    ogs_assert(target_nf_type);
64
+    ogs_assert(ogs_sbi_self()->nf_instance);
65
+    requester_nf_type = ogs_sbi_self()->nf_instance->nf_type;
66
+    ogs_assert(requester_nf_type);
67
 
68
     ogs_assert(sess);
69
     ogs_assert(stream);
70
     ogs_assert(build);
71
 
72
-    xact = ogs_sbi_xact_add(target_nf_type, &sess->sbi,
73
-            (ogs_sbi_build_f)build, sess, data,
74
-            bsf_timer_sbi_client_wait_expire);
75
+    xact = ogs_sbi_xact_add(
76
+            &sess->sbi, target_nf_type, discovery_option,
77
+            (ogs_sbi_build_f)build, sess, data);
78
     if (!xact) {
79
         ogs_error("bsf_sbi_discover_and_send() failed");
80
         ogs_assert(true ==
81
@@ -154,8 +178,10 @@
82
 
83
     xact->assoc_stream = stream;
84
 
85
-    if (ogs_sbi_discover_and_send(xact,
86
-            (ogs_fsm_handler_t)bsf_nf_state_registered, client_cb) != true) {
87
+    if (ogs_sbi_discover_and_send(
88
+            &sess->sbi,
89
+            target_nf_type, requester_nf_type, discovery_option,
90
+            client_cb, xact) != true) {
91
         ogs_error("bsf_sbi_discover_and_send() failed");
92
         ogs_sbi_xact_remove(xact);
93
         ogs_assert(true ==
94
open5gs_2.4.8.202207240002.tar.xz/src/bsf/sbi-path.h -> open5gs_2.4.8.202207250002.tar.xz/src/bsf/sbi-path.h Changed
22
 
1
@@ -29,11 +29,15 @@
2
 int bsf_sbi_open(void);
3
 void bsf_sbi_close(void);
4
 
5
-bool bsf_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact);
6
-
7
-bool bsf_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
8
-        bsf_sess_t *sess, ogs_sbi_stream_t *stream, void *data,
9
-        ogs_sbi_request_t *(*build)(bsf_sess_t *sess, void *data));
10
+bool bsf_sbi_send_request(
11
+        ogs_sbi_object_t *sbi_object,
12
+        OpenAPI_nf_type_e target_nf_type,
13
+        void *data);
14
+bool bsf_sbi_discover_and_send(
15
+        OpenAPI_nf_type_e target_nf_type,
16
+        ogs_sbi_discovery_option_t *discovery_option,
17
+        ogs_sbi_request_t *(*build)(bsf_sess_t *sess, void *data),
18
+        bsf_sess_t *sess, ogs_sbi_stream_t *stream, void *data);
19
 
20
 void bsf_sbi_send_response(ogs_sbi_stream_t *stream, int status);
21
 
22
open5gs_2.4.8.202207240002.tar.xz/src/mme/mme-context.h -> open5gs_2.4.8.202207250002.tar.xz/src/mme/mme-context.h Changed
10
 
1
@@ -422,6 +422,8 @@
2
     /* HSS Info */
3
     ogs_bitrate_t   ambr; /* UE-AMBR */
4
     uint32_t        network_access_mode; /* Permitted EPS Attach Type */
5
+    uint8_t         charging_characteristicsOGS_CHRGCHARS_LEN; /* Subscription Level Charging Characteristics */
6
+    bool            charging_characteristics_presence;
7
 
8
     uint32_t        context_identifier; /* default APN */
9
 
10
open5gs_2.4.8.202207240002.tar.xz/src/mme/mme-fd-path.c -> open5gs_2.4.8.202207250002.tar.xz/src/mme/mme-fd-path.c Changed
65
 
1
@@ -593,6 +593,8 @@
2
 {
3
     int ret;
4
 
5
+    char bufOGS_CHRGCHARS_LEN;
6
+
7
     struct sess_state *sess_data = NULL;
8
     struct timespec ts;
9
     struct session *session;
10
@@ -795,6 +797,26 @@
11
             ogs_warn("no subscribed Network-Access-Mode, defaulting to PACKET_AND_CIRCUIT (0)");
12
         }
13
 
14
+        /* AVP: '3GPP-Charging-Characteristics'(13)
15
+            * For GGSN, it contains the charging characteristics for 
16
+            * this PDP Context received in the Create PDP Context 
17
+            * Request Message (only available in R99 and later releases). 
18
+            * For PGW, it contains the charging characteristics for the 
19
+            * IP-CAN bearer.
20
+            * Reference: 3GPP TS 29.061 16.4.7.2 13
21
+            */
22
+        ret = fd_avp_search_avp(avp, ogs_diam_s6a_3gpp_charging_characteristics, &avpch1);
23
+        ogs_assert(ret == 0);
24
+        if (avpch1) {
25
+            ret = fd_msg_avp_hdr(avpch1, &hdr);
26
+            memcpy(mme_ue->charging_characteristics,
27
+                OGS_HEX(hdr->avp_value->os.data, (int)hdr->avp_value->os.len, buf), OGS_CHRGCHARS_LEN);
28
+            mme_ue->charging_characteristics_presence = true;
29
+        } else {
30
+            memcpy(mme_ue->charging_characteristics, (uint8_t *)"\x00\x00", OGS_CHRGCHARS_LEN);
31
+            mme_ue->charging_characteristics_presence = false;
32
+        }        
33
+
34
         /* AVP: 'AMBR'(1435)
35
          * The Amber AVP contains the Max-Requested-Bandwidth-UL and
36
          * Max-Requested-Bandwidth-DL AVPs.
37
@@ -984,6 +1006,27 @@
38
                         error++;
39
                     }
40
 
41
+                    /* AVP: '3GPP-Charging-Characteristics'(13)
42
+                     * For GGSN, it contains the charging characteristics for 
43
+                     * this PDP Context received in the Create PDP Context 
44
+                     * Request Message (only available in R99 and later releases). 
45
+                     * For PGW, it contains the charging characteristics for the 
46
+                     * IP-CAN bearer.
47
+                     * Reference: 3GPP TS 29.061 16.4.7.2 13
48
+                     */
49
+                    ret = fd_avp_search_avp(avpch2, ogs_diam_s6a_3gpp_charging_characteristics,
50
+                            &avpch3);
51
+                    ogs_assert(ret == 0);
52
+                    if (avpch3) {
53
+                        ret = fd_msg_avp_hdr(avpch3, &hdr);
54
+                        memcpy(session->charging_characteristics,
55
+                            OGS_HEX(hdr->avp_value->os.data, (int)hdr->avp_value->os.len, buf), OGS_CHRGCHARS_LEN);
56
+                        session->charging_characteristics_presence = true;
57
+                    } else {
58
+                        memcpy(session->charging_characteristics, (uint8_t *)"\x00\x00", OGS_CHRGCHARS_LEN);
59
+                        session->charging_characteristics_presence = false;
60
+                    }
61
+
62
                     /* AVP: 'Served-Party-IP-Address'(848)
63
                      * The Served-Party-IP-Address AVP holds the IP address of
64
                      * either the calling or called party, depending on whether
65
open5gs_2.4.8.202207240002.tar.xz/src/mme/mme-s11-build.c -> open5gs_2.4.8.202207250002.tar.xz/src/mme/mme-s11-build.c Changed
20
 
1
@@ -330,9 +330,15 @@
2
     req->ue_time_zone.data = &ue_timezone;
3
     req->ue_time_zone.len = sizeof(ue_timezone);
4
 
5
-    req->charging_characteristics.presence = 1;
6
-    req->charging_characteristics.data = (uint8_t *)"\x54\x00";
7
-    req->charging_characteristics.len = 2;
8
+    if (session->charging_characteristics_presence == true) {
9
+        req->charging_characteristics.presence = 1;
10
+        req->charging_characteristics.data = session->charging_characteristics;
11
+        req->charging_characteristics.len = OGS_CHRGCHARS_LEN;
12
+    } else if (mme_ue->charging_characteristics_presence == true) {
13
+        req->charging_characteristics.presence = 1;
14
+        req->charging_characteristics.data = mme_ue->charging_characteristics;
15
+        req->charging_characteristics.len = OGS_CHRGCHARS_LEN;
16
+    }
17
 
18
     gtp_message.h.type = type;
19
     return ogs_gtp2_build_msg(&gtp_message);
20
open5gs_2.4.8.202207240002.tar.xz/src/mme/mme-s6a-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/mme/mme-s6a-handler.c Changed
13
 
1
@@ -91,6 +91,11 @@
2
 
3
         memcpy(&mme_ue->sessioni.smf_ip, &slice_data->sessioni.smf_ip,
4
                 sizeof(mme_ue->sessioni.smf_ip));
5
+
6
+        memcpy(&mme_ue->sessioni.charging_characteristics, &slice_data->sessioni.charging_characteristics,
7
+                sizeof(mme_ue->sessioni.charging_characteristics));
8
+        mme_ue->sessioni.charging_characteristics_presence =
9
+            slice_data->sessioni.charging_characteristics_presence;
10
     }
11
 
12
     mme_ue->num_of_session = i;
13
open5gs_2.4.8.202207240002.tar.xz/src/nrf/nnrf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/nrf/nnrf-handler.c Changed
48
 
1
@@ -400,6 +400,7 @@
2
     ogs_sbi_message_t sendmsg;
3
     ogs_sbi_response_t *response = NULL;
4
     ogs_sbi_nf_instance_t *nf_instance = NULL;
5
+    ogs_sbi_discovery_option_t *discovery_option = NULL;
6
 
7
     OpenAPI_search_result_t *SearchResult = NULL;
8
     int i;
9
@@ -437,12 +438,36 @@
10
     SearchResult->nf_instances = OpenAPI_list_create();
11
     ogs_assert(SearchResult->nf_instances);
12
 
13
+    if (recvmsg->param.discovery_option)
14
+        discovery_option = recvmsg->param.discovery_option;
15
+
16
+    if (discovery_option) {
17
+        if (discovery_option->target_nf_instance_id) {
18
+            ogs_debug("target-nf-instance-id%s",
19
+                discovery_option->target_nf_instance_id);
20
+        }
21
+        if (discovery_option->requester_nf_instance_id) {
22
+            ogs_debug("requester-nf-instance-id%s",
23
+                discovery_option->requester_nf_instance_id);
24
+        }
25
+        if (discovery_option->num_of_service_names) {
26
+            for (i = 0; i < discovery_option->num_of_service_names; i++)
27
+                ogs_debug("%d service-names%s", i,
28
+                    discovery_option->service_namesi);
29
+        }
30
+    }
31
+
32
     i = 0;
33
     ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) {
34
         if (nf_instance->nf_type != recvmsg->param.target_nf_type)
35
             continue;
36
-        if (nf_instance->nf_type == recvmsg->param.requester_nf_type)
37
-            continue;
38
+
39
+        if (discovery_option) {
40
+            if (discovery_option->target_nf_instance_id &&
41
+                strcmp(nf_instance->id,
42
+                    discovery_option->target_nf_instance_id) != 0)
43
+                continue;
44
+        }
45
 
46
         if (!recvmsg->param.limit ||
47
              (recvmsg->param.limit && i < recvmsg->param.limit)) {
48
open5gs_2.4.8.202207240002.tar.xz/src/nrf/sbi-path.c -> open5gs_2.4.8.202207250002.tar.xz/src/nrf/sbi-path.c Changed
28
 
1
@@ -82,9 +82,6 @@
2
 {
3
     ogs_sbi_nf_instance_t *nf_instance = NULL;
4
 
5
-    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
6
-        return OGS_ERROR;
7
-
8
     /* Initialize SCP NF Instance */
9
     nf_instance = ogs_sbi_self()->scp_instance;
10
     if (nf_instance) {
11
@@ -96,6 +93,16 @@
12
         client->cb = client_notify_cb;
13
     }
14
 
15
+    /* Timer expiration handler of client wait timer */
16
+    ogs_sbi_self()->client_wait_expire = nrf_timer_sbi_client_wait_expire;
17
+
18
+    /* NF register state in NF state machine */
19
+    ogs_sbi_self()->nf_state_registered =
20
+        (ogs_fsm_handler_t)nrf_nf_state_registered;
21
+
22
+    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
23
+        return OGS_ERROR;
24
+
25
     return OGS_OK;
26
 }
27
 
28
open5gs_2.4.8.202207240002.tar.xz/src/nrf/timer.c -> open5gs_2.4.8.202207250002.tar.xz/src/nrf/timer.c Changed
10
 
1
@@ -82,3 +82,8 @@
2
 {
3
     timer_send_event(NRF_TIMER_SUBSCRIPTION_VALIDITY, data);
4
 }
5
+
6
+void nrf_timer_sbi_client_wait_expire(void *data)
7
+{
8
+    timer_send_event(NRF_TIMER_SBI_CLIENT_WAIT, data);
9
+}
10
open5gs_2.4.8.202207240002.tar.xz/src/nrf/timer.h -> open5gs_2.4.8.202207250002.tar.xz/src/nrf/timer.h Changed
17
 
1
@@ -32,6 +32,7 @@
2
 
3
     NRF_TIMER_NF_INSTANCE_NO_HEARTBEAT,
4
     NRF_TIMER_SUBSCRIPTION_VALIDITY,
5
+    NRF_TIMER_SBI_CLIENT_WAIT,
6
 
7
     MAX_NUM_OF_NRF_TIMER,
8
 
9
@@ -48,6 +49,7 @@
10
 
11
 void nrf_timer_nf_instance_no_heartbeat(void *data);
12
 void nrf_timer_subscription_validity(void *data);
13
+void nrf_timer_sbi_client_wait_expire(void *data);
14
 
15
 #ifdef __cplusplus
16
 }
17
open5gs_2.4.8.202207240002.tar.xz/src/nssf/sbi-path.c -> open5gs_2.4.8.202207250002.tar.xz/src/nssf/sbi-path.c Changed
28
 
1
@@ -79,9 +79,6 @@
2
     ogs_sbi_nf_instance_t *nf_instance = NULL;
3
     ogs_sbi_nf_service_t *service = NULL;
4
 
5
-    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
6
-        return OGS_ERROR;
7
-
8
     /* Add SELF NF instance */
9
     nf_instance = ogs_sbi_self()->nf_instance;
10
     ogs_assert(nf_instance);
11
@@ -114,6 +111,16 @@
12
         }
13
     }
14
 
15
+    /* Timer expiration handler of client wait timer */
16
+    ogs_sbi_self()->client_wait_expire = nssf_timer_sbi_client_wait_expire;
17
+
18
+    /* NF register state in NF state machine */
19
+    ogs_sbi_self()->nf_state_registered =
20
+        (ogs_fsm_handler_t)nssf_nf_state_registered;
21
+
22
+    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
23
+        return OGS_ERROR;
24
+
25
     return OGS_OK;
26
 }
27
 
28
open5gs_2.4.8.202207240002.tar.xz/src/nssf/timer.c -> open5gs_2.4.8.202207250002.tar.xz/src/nssf/timer.c Changed
10
 
1
@@ -94,3 +94,8 @@
2
 {
3
     sbi_timer_send_event(NSSF_TIMER_SUBSCRIPTION_VALIDITY, data);
4
 }
5
+
6
+void nssf_timer_sbi_client_wait_expire(void *data)
7
+{
8
+    sbi_timer_send_event(NSSF_TIMER_SBI_CLIENT_WAIT, data);
9
+}
10
open5gs_2.4.8.202207240002.tar.xz/src/nssf/timer.h -> open5gs_2.4.8.202207250002.tar.xz/src/nssf/timer.h Changed
17
 
1
@@ -35,6 +35,7 @@
2
     NSSF_TIMER_NF_INSTANCE_NO_HEARTBEAT,
3
     NSSF_TIMER_NF_INSTANCE_VALIDITY,
4
     NSSF_TIMER_SUBSCRIPTION_VALIDITY,
5
+    NSSF_TIMER_SBI_CLIENT_WAIT,
6
 
7
     MAX_NUM_OF_NSSF_TIMER,
8
 
9
@@ -47,6 +48,7 @@
10
 void nssf_timer_nf_instance_no_heartbeat(void *data);
11
 void nssf_timer_nf_instance_validity(void *data);
12
 void nssf_timer_subscription_validity(void *data);
13
+void nssf_timer_sbi_client_wait_expire(void *data);
14
 
15
 #ifdef __cplusplus
16
 }
17
open5gs_2.4.8.202207240002.tar.xz/src/pcf/context.c -> open5gs_2.4.8.202207250002.tar.xz/src/pcf/context.c Changed
24
 
1
@@ -499,22 +499,6 @@
2
     return ogs_pool_cycle(&pcf_sess_pool, sess);
3
 }
4
 
5
-void pcf_ue_select_nf(pcf_ue_t *pcf_ue, OpenAPI_nf_type_e nf_type)
6
-{
7
-    ogs_assert(pcf_ue);
8
-    ogs_assert(nf_type);
9
-
10
-    ogs_sbi_select_nf(&pcf_ue->sbi, nf_type, pcf_nf_state_registered);
11
-}
12
-
13
-void pcf_sess_select_nf(pcf_sess_t *sess, OpenAPI_nf_type_e nf_type)
14
-{
15
-    ogs_assert(sess);
16
-    ogs_assert(nf_type);
17
-
18
-    ogs_sbi_select_nf(&sess->sbi, nf_type, pcf_nf_state_registered);
19
-}
20
-
21
 pcf_app_t *pcf_app_add(pcf_sess_t *sess)
22
 {
23
     pcf_app_t *app = NULL;
24
open5gs_2.4.8.202207240002.tar.xz/src/pcf/context.h -> open5gs_2.4.8.202207250002.tar.xz/src/pcf/context.h Changed
11
 
1
@@ -184,9 +184,6 @@
2
 pcf_ue_t *pcf_ue_cycle(pcf_ue_t *pcf_ue);
3
 pcf_sess_t *pcf_sess_cycle(pcf_sess_t *sess);
4
 
5
-void pcf_ue_select_nf(pcf_ue_t *pcf_ue, OpenAPI_nf_type_e nf_type);
6
-void pcf_sess_select_nf(pcf_sess_t *sess, OpenAPI_nf_type_e nf_type);
7
-
8
 pcf_app_t *pcf_app_add(pcf_sess_t *sess);
9
 int pcf_app_remove(pcf_app_t *app);
10
 void pcf_app_remove_all(pcf_sess_t *sess);
11
open5gs_2.4.8.202207240002.tar.xz/src/pcf/nnrf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/pcf/nnrf-handler.c Changed
97
 
1
@@ -253,18 +253,23 @@
2
         ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg)
3
 {
4
     ogs_sbi_object_t *sbi_object = NULL;
5
-    pcf_ue_t *pcf_ue = NULL;
6
-    pcf_sess_t *sess = NULL;
7
+    OpenAPI_nf_type_e target_nf_type = 0;
8
+    ogs_sbi_discovery_option_t *discovery_option = NULL;
9
+
10
     ogs_sbi_nf_instance_t *nf_instance = NULL;
11
 
12
     OpenAPI_search_result_t *SearchResult = NULL;
13
     OpenAPI_lnode_t *node = NULL;
14
     bool handled;
15
 
16
+    ogs_assert(recvmsg);
17
     ogs_assert(xact);
18
     sbi_object = xact->sbi_object;
19
     ogs_assert(sbi_object);
20
-    ogs_assert(recvmsg);
21
+    target_nf_type = xact->target_nf_type;
22
+    ogs_assert(target_nf_type);
23
+
24
+    discovery_option = xact->discovery_option;
25
 
26
     SearchResult = recvmsg->SearchResult;
27
     if (!SearchResult) {
28
@@ -299,9 +304,6 @@
29
         }
30
 
31
         if (NF_INSTANCE_IS_OTHERS(nf_instance->id)) {
32
-            pcf_ue_t *pcf_ue = NULL;
33
-            pcf_sess_t *sess = NULL;
34
-
35
             handled = ogs_sbi_nnrf_handle_nf_profile(
36
                         nf_instance, NFProfile, NULL, NULL);
37
             if (!handled) {
38
@@ -318,23 +320,6 @@
39
                 continue;
40
             }
41
 
42
-            switch(sbi_object->type) {
43
-            case OGS_SBI_OBJ_UE_TYPE:
44
-                pcf_ue = (pcf_ue_t *)sbi_object;
45
-                ogs_assert(pcf_ue);
46
-                pcf_ue_select_nf(pcf_ue, nf_instance->nf_type);
47
-                break;
48
-            case OGS_SBI_OBJ_SESS_TYPE:
49
-                sess = (pcf_sess_t *)sbi_object;
50
-                ogs_assert(sess);
51
-                pcf_sess_select_nf(sess, nf_instance->nf_type);
52
-                break;
53
-            default:
54
-                ogs_fatal("(NF discover search result) Not implemented %d",
55
-                            sbi_object->type);
56
-                ogs_assert_if_reached();
57
-            }
58
-
59
             /* TIME : Update validity from NRF */
60
             if (SearchResult->is_validity_period &&
61
                 SearchResult->validity_period) {
62
@@ -353,31 +338,7 @@
63
         }
64
     }
65
 
66
-    ogs_assert(xact->target_nf_type);
67
-    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, xact->target_nf_type);
68
-    if (!nf_instance) {
69
-        ogs_assert(sbi_object->type > OGS_SBI_OBJ_BASE &&
70
-                    sbi_object->type < OGS_SBI_OBJ_TOP);
71
-        switch(sbi_object->type) {
72
-        case OGS_SBI_OBJ_UE_TYPE:
73
-            pcf_ue = (pcf_ue_t *)sbi_object;
74
-            ogs_assert(pcf_ue);
75
-            ogs_error("%s (NF discover) No %s", pcf_ue->supi,
76
-                    OpenAPI_nf_type_ToString(xact->target_nf_type));
77
-            break;
78
-        case OGS_SBI_OBJ_SESS_TYPE:
79
-            sess = (pcf_sess_t *)sbi_object;
80
-            ogs_assert(sess);
81
-            ogs_error("%d (NF discover) No %s", sess->psi,
82
-                    OpenAPI_nf_type_ToString(xact->target_nf_type));
83
-            break;
84
-        default:
85
-            ogs_fatal("(NF discover) Not implemented %s:%d",
86
-                OpenAPI_nf_type_ToString(xact->target_nf_type),
87
-                sbi_object->type);
88
-            ogs_assert_if_reached();
89
-        }
90
-    } else {
91
-        ogs_assert(true == pcf_sbi_send(nf_instance, xact));
92
-    }
93
+    ogs_sbi_select_nf(sbi_object, target_nf_type, discovery_option);
94
+
95
+    ogs_expect(true == pcf_sbi_send_request(sbi_object, target_nf_type, xact));
96
 }
97
open5gs_2.4.8.202207240002.tar.xz/src/pcf/npcf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/pcf/npcf-handler.c Changed
35
 
1
@@ -148,8 +148,8 @@
2
                 pcf_ue->subscribed_ue_ambr, PolicyAssociationRequest->ue_ambr);
3
 
4
     ogs_assert(true ==
5
-        pcf_ue_sbi_discover_and_send(OpenAPI_nf_type_UDR, pcf_ue, stream, NULL,
6
-            pcf_nudr_dr_build_query_am_data));
7
+        pcf_ue_sbi_discover_and_send(OpenAPI_nf_type_UDR, NULL,
8
+            pcf_nudr_dr_build_query_am_data, pcf_ue, stream, NULL));
9
 
10
     return true;
11
 }
12
@@ -298,8 +298,8 @@
13
             sess->subscribed_default_qos, SmPolicyContextData->subs_def_qos);
14
 
15
     ogs_assert(true ==
16
-        pcf_sess_sbi_discover_and_send(OpenAPI_nf_type_UDR, sess, stream, NULL,
17
-            pcf_nudr_dr_build_query_sm_data));
18
+        pcf_sess_sbi_discover_and_send(OpenAPI_nf_type_UDR, NULL,
19
+            pcf_nudr_dr_build_query_sm_data, sess, stream, NULL));
20
 
21
     return true;
22
 
23
@@ -352,9 +352,8 @@
24
         ogs_assert(true == ogs_sbi_server_send_response(stream, response));
25
     } else {
26
         ogs_assert(true ==
27
-                pcf_sess_sbi_discover_and_send(
28
-                    OpenAPI_nf_type_BSF, sess, stream, NULL,
29
-                    pcf_nbsf_management_build_de_register));
30
+            pcf_sess_sbi_discover_and_send(OpenAPI_nf_type_BSF, NULL,
31
+                pcf_nbsf_management_build_de_register, sess, stream, NULL));
32
     }
33
 
34
     return true;
35
open5gs_2.4.8.202207240002.tar.xz/src/pcf/nudr-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/pcf/nudr-handler.c Changed
13
 
1
@@ -194,9 +194,8 @@
2
         }
3
 
4
         ogs_assert(true ==
5
-            pcf_sess_sbi_discover_and_send(
6
-                OpenAPI_nf_type_BSF, sess, stream, NULL,
7
-                pcf_nbsf_management_build_register));
8
+            pcf_sess_sbi_discover_and_send(OpenAPI_nf_type_BSF, NULL,
9
+                pcf_nbsf_management_build_register, sess, stream, NULL));
10
 
11
         return true;
12
 
13
open5gs_2.4.8.202207240002.tar.xz/src/pcf/sbi-path.c -> open5gs_2.4.8.202207250002.tar.xz/src/pcf/sbi-path.c Changed
157
 
1
@@ -79,9 +79,6 @@
2
     ogs_sbi_nf_instance_t *nf_instance = NULL;
3
     ogs_sbi_nf_service_t *service = NULL;
4
 
5
-    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
6
-        return OGS_ERROR;
7
-
8
     /* Add SELF NF instance */
9
     nf_instance = ogs_sbi_self()->nf_instance;
10
     ogs_assert(nf_instance);
11
@@ -127,6 +124,16 @@
12
         }
13
     }
14
 
15
+    /* Timer expiration handler of client wait timer */
16
+    ogs_sbi_self()->client_wait_expire = pcf_timer_sbi_client_wait_expire;
17
+
18
+    /* NF register state in NF state machine */
19
+    ogs_sbi_self()->nf_state_registered =
20
+        (ogs_fsm_handler_t)pcf_nf_state_registered;
21
+
22
+    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
23
+        return OGS_ERROR;
24
+
25
     return OGS_OK;
26
 }
27
 
28
@@ -136,31 +143,76 @@
29
     ogs_sbi_server_stop_all();
30
 }
31
 
32
-bool pcf_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact)
33
+bool pcf_sbi_send_request(
34
+        ogs_sbi_object_t *sbi_object,
35
+        OpenAPI_nf_type_e target_nf_type,
36
+        void *data)
37
 {
38
-    return ogs_sbi_send(nf_instance, client_cb, xact);
39
+    ogs_sbi_nf_instance_t *nf_instance = NULL;
40
+
41
+    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, target_nf_type);
42
+    if (!nf_instance) {
43
+        pcf_ue_t *pcf_ue = NULL;
44
+        pcf_sess_t *sess = NULL;
45
+
46
+        ogs_assert(sbi_object->type > OGS_SBI_OBJ_BASE &&
47
+                    sbi_object->type < OGS_SBI_OBJ_TOP);
48
+        switch(sbi_object->type) {
49
+        case OGS_SBI_OBJ_UE_TYPE:
50
+            pcf_ue = (pcf_ue_t *)sbi_object;
51
+            ogs_assert(pcf_ue);
52
+            ogs_error("%s (NF discover) No %s", pcf_ue->supi,
53
+                    OpenAPI_nf_type_ToString(target_nf_type));
54
+            break;
55
+        case OGS_SBI_OBJ_SESS_TYPE:
56
+            sess = (pcf_sess_t *)sbi_object;
57
+            ogs_assert(sess);
58
+            ogs_error("%d (NF discover) No %s", sess->psi,
59
+                    OpenAPI_nf_type_ToString(target_nf_type));
60
+            break;
61
+        default:
62
+            ogs_fatal("(NF discover) Not implemented %s:%d",
63
+                OpenAPI_nf_type_ToString(target_nf_type),
64
+                sbi_object->type);
65
+            ogs_assert_if_reached();
66
+        }
67
+
68
+        return false;
69
+    }
70
+
71
+    return ogs_sbi_send_request(nf_instance, client_cb, data);
72
 }
73
 
74
-static bool pcf_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
75
-        ogs_sbi_object_t *sbi_object, ogs_sbi_stream_t *stream,
76
-        ogs_sbi_build_f build, void *context, void *data)
77
+static bool pcf_sbi_discover_and_send(
78
+        ogs_sbi_object_t *sbi_object,
79
+        OpenAPI_nf_type_e target_nf_type,
80
+        ogs_sbi_discovery_option_t *discovery_option,
81
+        ogs_sbi_build_f build,
82
+        void *context, ogs_sbi_stream_t *stream, void *data)
83
 {
84
     ogs_sbi_xact_t *xact = NULL;
85
+    OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL;
86
+
87
+    ogs_assert(ogs_sbi_self()->nf_instance);
88
+    requester_nf_type = ogs_sbi_self()->nf_instance->nf_type;
89
+    ogs_assert(requester_nf_type);
90
 
91
     ogs_assert(target_nf_type);
92
     ogs_assert(sbi_object);
93
     ogs_assert(stream);
94
     ogs_assert(build);
95
 
96
-    xact = ogs_sbi_xact_add(target_nf_type, sbi_object,
97
-                            build, context, data,
98
-                            pcf_timer_sbi_client_wait_expire);
99
+    xact = ogs_sbi_xact_add(
100
+            sbi_object, target_nf_type, discovery_option,
101
+            build, context, data);
102
     ogs_expect_or_return_val(xact, false);
103
 
104
     xact->assoc_stream = stream;
105
 
106
-    if (ogs_sbi_discover_and_send(xact,
107
-            (ogs_fsm_handler_t)pcf_nf_state_registered, client_cb) != true) {
108
+    if (ogs_sbi_discover_and_send(
109
+            sbi_object,
110
+            target_nf_type, requester_nf_type, discovery_option,
111
+            client_cb, xact) != true) {
112
         ogs_error("ogs_sbi_discover_and_send() failed");
113
         ogs_sbi_xact_remove(xact);
114
         return false;
115
@@ -169,12 +221,15 @@
116
     return true;
117
 }
118
 
119
-bool pcf_ue_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
120
-        pcf_ue_t *pcf_ue, ogs_sbi_stream_t *stream, void *data,
121
-        ogs_sbi_request_t *(*build)(pcf_ue_t *pcf_ue, void *data))
122
+bool pcf_ue_sbi_discover_and_send(
123
+        OpenAPI_nf_type_e target_nf_type,
124
+        ogs_sbi_discovery_option_t *discovery_option,
125
+        ogs_sbi_request_t *(*build)(pcf_ue_t *pcf_ue, void *data),
126
+        pcf_ue_t *pcf_ue, ogs_sbi_stream_t *stream, void *data)
127
 {
128
-    if (pcf_sbi_discover_and_send(target_nf_type, &pcf_ue->sbi, stream,
129
-                (ogs_sbi_build_f)build, pcf_ue, data) != true) {
130
+    if (pcf_sbi_discover_and_send(
131
+                &pcf_ue->sbi, target_nf_type, discovery_option,
132
+                (ogs_sbi_build_f)build, pcf_ue, stream, data) != true) {
133
         ogs_error("pcf_ue_sbi_discover_and_send() failed");
134
         ogs_assert(true ==
135
             ogs_sbi_server_send_error(stream,
136
@@ -186,12 +241,15 @@
137
     return true;
138
 }
139
 
140
-bool pcf_sess_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
141
-        pcf_sess_t *sess, ogs_sbi_stream_t *stream, void *data,
142
-        ogs_sbi_request_t *(*build)(pcf_sess_t *sess, void *data))
143
+bool pcf_sess_sbi_discover_and_send(
144
+        OpenAPI_nf_type_e target_nf_type,
145
+        ogs_sbi_discovery_option_t *discovery_option,
146
+        ogs_sbi_request_t *(*build)(pcf_sess_t *sess, void *data),
147
+        pcf_sess_t *sess, ogs_sbi_stream_t *stream, void *data)
148
 {
149
-    if (pcf_sbi_discover_and_send(target_nf_type, &sess->sbi, stream,
150
-                (ogs_sbi_build_f)build, sess, data) != true) {
151
+    if (pcf_sbi_discover_and_send(
152
+                &sess->sbi, target_nf_type, discovery_option,
153
+                (ogs_sbi_build_f)build, sess, stream, data) != true) {
154
         ogs_error("pcf_sess_sbi_discover_and_send() failed");
155
         ogs_assert(true ==
156
             ogs_sbi_server_send_error(stream,
157
open5gs_2.4.8.202207240002.tar.xz/src/pcf/sbi-path.h -> open5gs_2.4.8.202207250002.tar.xz/src/pcf/sbi-path.h Changed
29
 
1
@@ -34,13 +34,20 @@
2
 int pcf_sbi_open(void);
3
 void pcf_sbi_close(void);
4
 
5
-bool pcf_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact);
6
-bool pcf_ue_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
7
-        pcf_ue_t *pcf_ue, ogs_sbi_stream_t *stream, void *data,
8
-        ogs_sbi_request_t *(*build)(pcf_ue_t *pcf_ue, void *data));
9
-bool pcf_sess_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
10
-        pcf_sess_t *sess, ogs_sbi_stream_t *stream, void *data,
11
-        ogs_sbi_request_t *(*build)(pcf_sess_t *sess, void *data));
12
+bool pcf_sbi_send_request(
13
+        ogs_sbi_object_t *sbi_object,
14
+        OpenAPI_nf_type_e target_nf_type,
15
+        void *data);
16
+bool pcf_ue_sbi_discover_and_send(
17
+        OpenAPI_nf_type_e target_nf_type,
18
+        ogs_sbi_discovery_option_t *discovery_option,
19
+        ogs_sbi_request_t *(*build)(pcf_ue_t *pcf_ue, void *data),
20
+        pcf_ue_t *pcf_ue, ogs_sbi_stream_t *stream, void *data);
21
+bool pcf_sess_sbi_discover_and_send(
22
+        OpenAPI_nf_type_e target_nf_type,
23
+        ogs_sbi_discovery_option_t *discovery_option,
24
+        ogs_sbi_request_t *(*build)(pcf_sess_t *sess, void *data),
25
+        pcf_sess_t *sess, ogs_sbi_stream_t *stream, void *data);
26
 
27
 bool pcf_sbi_send_am_policy_control_notify(pcf_ue_t *pcf_ue);
28
 bool pcf_sbi_send_smpolicycontrol_update_notify(
29
open5gs_2.4.8.202207240002.tar.xz/src/scp/context.c -> open5gs_2.4.8.202207250002.tar.xz/src/scp/context.c Changed
13
 
1
@@ -153,11 +153,3 @@
2
 {
3
     return ogs_pool_find(&scp_conn_pool, index);
4
 }
5
-
6
-void scp_conn_select_nf(scp_conn_t *sess, OpenAPI_nf_type_e nf_type)
7
-{
8
-    ogs_assert(sess);
9
-    ogs_assert(nf_type);
10
-
11
-    ogs_sbi_select_nf(&sess->sbi, nf_type, scp_nf_state_registered);
12
-}
13
open5gs_2.4.8.202207240002.tar.xz/src/scp/context.h -> open5gs_2.4.8.202207250002.tar.xz/src/scp/context.h Changed
10
 
1
@@ -79,8 +79,6 @@
2
 
3
 scp_conn_t *scp_conn_find(uint32_t index);
4
 
5
-void scp_conn_select_nf(scp_conn_t *sess, OpenAPI_nf_type_e nf_type);
6
-
7
 #ifdef __cplusplus
8
 }
9
 #endif
10
open5gs_2.4.8.202207240002.tar.xz/src/scp/nf-sm.c -> open5gs_2.4.8.202207250002.tar.xz/src/scp/nf-sm.c Changed
49
 
1
@@ -229,6 +229,47 @@
2
                         nf_instance->time.heartbeat_interval +
3
                         ogs_app()->time.nf_instance.no_heartbeat_margin));
4
             }
5
+
6
+            ogs_assert(true ==
7
+                ogs_nnrf_nfm_send_nf_status_subscribe(client,
8
+                    ogs_sbi_self()->nf_instance->nf_type,
9
+                    ogs_sbi_self()->nf_instance->id,
10
+                    OpenAPI_nf_type_AMF));
11
+            ogs_assert(true ==
12
+                ogs_nnrf_nfm_send_nf_status_subscribe(client,
13
+                    ogs_sbi_self()->nf_instance->nf_type,
14
+                    ogs_sbi_self()->nf_instance->id,
15
+                    OpenAPI_nf_type_AUSF));
16
+            ogs_assert(true ==
17
+                ogs_nnrf_nfm_send_nf_status_subscribe(client,
18
+                    ogs_sbi_self()->nf_instance->nf_type,
19
+                    ogs_sbi_self()->nf_instance->id,
20
+                    OpenAPI_nf_type_BSF));
21
+            ogs_assert(true ==
22
+                ogs_nnrf_nfm_send_nf_status_subscribe(client,
23
+                    ogs_sbi_self()->nf_instance->nf_type,
24
+                    ogs_sbi_self()->nf_instance->id,
25
+                    OpenAPI_nf_type_NSSF));
26
+            ogs_assert(true ==
27
+                ogs_nnrf_nfm_send_nf_status_subscribe(client,
28
+                    ogs_sbi_self()->nf_instance->nf_type,
29
+                    ogs_sbi_self()->nf_instance->id,
30
+                    OpenAPI_nf_type_PCF));
31
+            ogs_assert(true ==
32
+                ogs_nnrf_nfm_send_nf_status_subscribe(client,
33
+                    ogs_sbi_self()->nf_instance->nf_type,
34
+                    ogs_sbi_self()->nf_instance->id,
35
+                    OpenAPI_nf_type_SMF));
36
+            ogs_assert(true ==
37
+                ogs_nnrf_nfm_send_nf_status_subscribe(client,
38
+                    ogs_sbi_self()->nf_instance->nf_type,
39
+                    ogs_sbi_self()->nf_instance->id,
40
+                    OpenAPI_nf_type_UDM));
41
+            ogs_assert(true ==
42
+                ogs_nnrf_nfm_send_nf_status_subscribe(client,
43
+                    ogs_sbi_self()->nf_instance->nf_type,
44
+                    ogs_sbi_self()->nf_instance->id,
45
+                    OpenAPI_nf_type_UDR));
46
         }
47
 
48
         break;
49
open5gs_2.4.8.202207240002.tar.xz/src/scp/nnrf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/scp/nnrf-handler.c Changed
61
 
1
@@ -253,16 +253,22 @@
2
         ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg)
3
 {
4
     ogs_sbi_object_t *sbi_object = NULL;
5
+    OpenAPI_nf_type_e target_nf_type = 0;
6
+    ogs_sbi_discovery_option_t *discovery_option = NULL;
7
     ogs_sbi_nf_instance_t *nf_instance = NULL;
8
 
9
     OpenAPI_search_result_t *SearchResult = NULL;
10
     OpenAPI_lnode_t *node = NULL;
11
     bool handled;
12
 
13
+    ogs_assert(recvmsg);
14
     ogs_assert(xact);
15
     sbi_object = xact->sbi_object;
16
     ogs_assert(sbi_object);
17
-    ogs_assert(recvmsg);
18
+    target_nf_type = xact->target_nf_type;
19
+    ogs_assert(target_nf_type);
20
+
21
+    discovery_option = xact->discovery_option;
22
 
23
     SearchResult = recvmsg->SearchResult;
24
     if (!SearchResult) {
25
@@ -297,8 +303,6 @@
26
         }
27
 
28
         if (NF_INSTANCE_IS_OTHERS(nf_instance->id)) {
29
-            scp_conn_t *conn = NULL;
30
-
31
             handled = ogs_sbi_nnrf_handle_nf_profile(
32
                         nf_instance, NFProfile, NULL, NULL);
33
             if (!handled) {
34
@@ -315,10 +319,6 @@
35
                 continue;
36
             }
37
 
38
-            conn = (scp_conn_t *)sbi_object;
39
-            ogs_assert(conn);
40
-            scp_conn_select_nf(conn, nf_instance->nf_type);
41
-
42
             /* TIME : Update validity from NRF */
43
             if (SearchResult->is_validity_period &&
44
                 SearchResult->validity_period) {
45
@@ -337,11 +337,12 @@
46
         }
47
     }
48
 
49
-    ogs_assert(xact->target_nf_type);
50
-    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, xact->target_nf_type);
51
+    ogs_sbi_select_nf(sbi_object, target_nf_type, discovery_option);
52
+
53
+    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, target_nf_type);
54
     if (!nf_instance) {
55
         ogs_error("(NF discover) No %s",
56
-                OpenAPI_nf_type_ToString(xact->target_nf_type));
57
+                OpenAPI_nf_type_ToString(target_nf_type));
58
     } else {
59
         scp_sbi_send(nf_instance, xact);
60
     }
61
open5gs_2.4.8.202207240002.tar.xz/src/scp/sbi-path.c -> open5gs_2.4.8.202207250002.tar.xz/src/scp/sbi-path.c Changed
129
 
1
@@ -29,9 +29,6 @@
2
 {
3
     ogs_sbi_nf_instance_t *nf_instance = NULL;
4
 
5
-    if (ogs_sbi_server_start_all(request_handler) != OGS_OK)
6
-        return OGS_ERROR;
7
-
8
     /* Add SELF NF instance */
9
     nf_instance = ogs_sbi_self()->nf_instance;
10
     ogs_assert(nf_instance);
11
@@ -65,6 +62,16 @@
12
         scp_nf_fsm_init(nf_instance);
13
     }
14
 
15
+    /* Timer expiration handler of client wait timer */
16
+    ogs_sbi_self()->client_wait_expire = scp_timer_sbi_client_wait_expire;
17
+
18
+    /* NF register state in NF state machine */
19
+    ogs_sbi_self()->nf_state_registered =
20
+        (ogs_fsm_handler_t)scp_nf_state_registered;
21
+
22
+    if (ogs_sbi_server_start_all(request_handler) != OGS_OK)
23
+        return OGS_ERROR;
24
+
25
     return OGS_OK;
26
 }
27
 
28
@@ -266,35 +273,25 @@
29
             return OGS_ERROR;
30
         }
31
     } else {
32
-        ogs_sbi_message_t message;
33
+        scp_event_t *e = NULL;
34
+        int rv;
35
 
36
-        ogs_error("Unknown HTTP Headers");
37
-        ogs_error("  %s:%s", source->h.method, source->h.uri);
38
-        for (hi = ogs_hash_first(source->http.headers);
39
-                hi; hi = ogs_hash_next(hi)) {
40
-            char *key = (char *)ogs_hash_this_key(hi);
41
-            char *val = ogs_hash_this_val(hi);
42
-            ogs_error("  %s:%s", key, val);
43
-        }
44
+        ogs_assert(source);
45
+        ogs_assert(data);
46
 
47
-        rv = ogs_sbi_parse_request(&message, source);
48
+        e = scp_event_new(SCP_EVT_SBI_SERVER);
49
+        ogs_assert(e);
50
+
51
+        e->sbi.request = source;
52
+        e->sbi.data = data;
53
+
54
+        rv = ogs_queue_push(ogs_app()->queue, e);
55
         if (rv != OGS_OK) {
56
-            ogs_error("cannot parse HTTP sbi_message");
57
-            ogs_assert(true ==
58
-                ogs_sbi_server_send_error(
59
-                    stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST,
60
-                    NULL, "cannot parse HTTP sbi_message", NULL));
61
+            ogs_error("ogs_queue_push() failed:%d", (int)rv);
62
+            ogs_sbi_request_free(source);
63
+            scp_event_free(e);
64
             return OGS_ERROR;
65
         }
66
-
67
-        ogs_assert(true ==
68
-            ogs_sbi_server_send_error(
69
-                stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST,
70
-                &message, "SCP - HTTP Client", NULL));
71
-
72
-        ogs_sbi_message_free(&message);
73
-
74
-        return OGS_OK;
75
     }
76
 
77
     return OGS_OK;
78
@@ -366,24 +363,29 @@
79
 
80
 bool scp_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact)
81
 {
82
-    return ogs_sbi_send(nf_instance, client_cb, xact);
83
+    return ogs_sbi_send_request(nf_instance, client_cb, xact);
84
 }
85
 
86
-bool scp_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
87
-        scp_conn_t *conn, ogs_sbi_stream_t *stream, void *data,
88
-        ogs_sbi_request_t *(*build)(scp_conn_t *conn, void *data))
89
+bool scp_sbi_discover_and_send(
90
+        OpenAPI_nf_type_e target_nf_type,
91
+        ogs_sbi_discovery_option_t *discovery_option,
92
+        ogs_sbi_request_t *(*build)(scp_conn_t *conn, void *data),
93
+        scp_conn_t *conn, ogs_sbi_stream_t *stream, void *data)
94
 {
95
     ogs_sbi_xact_t *xact = NULL;
96
+    OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL;
97
 
98
-    ogs_assert(target_nf_type);
99
+    ogs_assert(ogs_sbi_self()->nf_instance);
100
+    requester_nf_type = ogs_sbi_self()->nf_instance->nf_type;
101
+    ogs_assert(requester_nf_type);
102
 
103
     ogs_assert(conn);
104
     ogs_assert(stream);
105
     ogs_assert(build);
106
 
107
-    xact = ogs_sbi_xact_add(target_nf_type, &conn->sbi,
108
-            (ogs_sbi_build_f)build, conn, data,
109
-            scp_timer_sbi_client_wait_expire);
110
+    xact = ogs_sbi_xact_add(
111
+            &conn->sbi, target_nf_type, discovery_option,
112
+            (ogs_sbi_build_f)build, conn, data);
113
     if (!xact) {
114
         ogs_error("scp_sbi_discover_and_send() failed");
115
         ogs_assert(true ==
116
@@ -395,8 +397,10 @@
117
 
118
     xact->assoc_stream = stream;
119
 
120
-    if (ogs_sbi_discover_and_send(xact,
121
-            (ogs_fsm_handler_t)scp_nf_state_registered, client_cb) != true) {
122
+    if (ogs_sbi_discover_and_send(
123
+            &conn->sbi,
124
+            target_nf_type, requester_nf_type, discovery_option,
125
+            client_cb, xact) != true) {
126
         ogs_error("scp_sbi_discover_and_send() failed");
127
         ogs_sbi_xact_remove(xact);
128
         ogs_assert(true ==
129
open5gs_2.4.8.202207240002.tar.xz/src/scp/sbi-path.h -> open5gs_2.4.8.202207250002.tar.xz/src/scp/sbi-path.h Changed
16
 
1
@@ -31,9 +31,11 @@
2
 
3
 bool scp_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact);
4
 
5
-bool scp_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
6
-        scp_conn_t *conn, ogs_sbi_stream_t *stream, void *data,
7
-        ogs_sbi_request_t *(*build)(scp_conn_t *conn, void *data));
8
+bool scp_sbi_discover_and_send(
9
+        OpenAPI_nf_type_e target_nf_type,
10
+        ogs_sbi_discovery_option_t *discovery_option,
11
+        ogs_sbi_request_t *(*build)(scp_conn_t *conn, void *data),
12
+        scp_conn_t *conn, ogs_sbi_stream_t *stream, void *data);
13
 
14
 #ifdef __cplusplus
15
 }
16
open5gs_2.4.8.202207240002.tar.xz/src/smf/context.c -> open5gs_2.4.8.202207250002.tar.xz/src/smf/context.c Changed
25
 
1
@@ -80,7 +80,7 @@
2
     ogs_log_install_domain(&__smf_log_domain, "smf", ogs_core()->log.level);
3
     ogs_log_install_domain(&__gsm_log_domain, "gsm", ogs_core()->log.level);
4
 
5
-    ogs_pool_init(&smf_gtp_node_pool, ogs_app()->pool.gtp_node);
6
+    ogs_pool_init(&smf_gtp_node_pool, ogs_app()->pool.nf);
7
     ogs_pool_init(&smf_ue_pool, ogs_app()->max.ue);
8
     ogs_pool_init(&smf_sess_pool, ogs_app()->pool.sess);
9
     ogs_pool_init(&smf_bearer_pool, ogs_app()->pool.bearer);
10
@@ -2528,14 +2528,6 @@
11
     return ogs_pool_cycle(&smf_bearer_pool, qos_flow);
12
 }
13
 
14
-void smf_sess_select_nf(smf_sess_t *sess, OpenAPI_nf_type_e nf_type)
15
-{
16
-    ogs_assert(sess);
17
-    ogs_assert(nf_type);
18
-
19
-    ogs_sbi_select_nf(&sess->sbi, nf_type, smf_nf_state_registered);
20
-}
21
-
22
 smf_pf_t *smf_pf_add(smf_bearer_t *bearer)
23
 {
24
     smf_sess_t *sess = NULL;
25
open5gs_2.4.8.202207240002.tar.xz/src/smf/context.h -> open5gs_2.4.8.202207250002.tar.xz/src/smf/context.h Changed
10
 
1
@@ -502,8 +502,6 @@
2
 smf_bearer_t *smf_qos_flow_cycle(smf_bearer_t *qos_flow);
3
 smf_bearer_t *smf_bearer_cycle(smf_bearer_t *bearer);
4
 
5
-void smf_sess_select_nf(smf_sess_t *sess, OpenAPI_nf_type_e nf_type);
6
-
7
 smf_pf_t *smf_pf_add(smf_bearer_t *bearer);
8
 int smf_pf_remove(smf_pf_t *pf);
9
 void smf_pf_remove_all(smf_bearer_t *bearer);
10
open5gs_2.4.8.202207240002.tar.xz/src/smf/gsm-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/smf/gsm-handler.c Changed
14
 
1
@@ -67,9 +67,9 @@
2
     }
3
 
4
     ogs_assert(true ==
5
-        smf_sbi_discover_and_send(OpenAPI_nf_type_UDM, sess, stream,
6
-                0, (char *)OGS_SBI_RESOURCE_NAME_SM_DATA,
7
-                smf_nudm_sdm_build_get));
8
+        smf_sbi_discover_and_send(OpenAPI_nf_type_UDM, NULL,
9
+            smf_nudm_sdm_build_get,
10
+            sess, stream, 0, (char *)OGS_SBI_RESOURCE_NAME_SM_DATA));
11
 
12
     return OGS_OK;
13
 }
14
open5gs_2.4.8.202207240002.tar.xz/src/smf/gsm-sm.c -> open5gs_2.4.8.202207250002.tar.xz/src/smf/gsm-sm.c Changed
15
 
1
@@ -996,9 +996,10 @@
2
                     NGAP_CauseNas_normal_release;
3
 
4
                 ogs_assert(true ==
5
-                    smf_sbi_discover_and_send(OpenAPI_nf_type_PCF, sess, stream,
6
-                        OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED, &param,
7
-                        smf_npcf_smpolicycontrol_build_delete));
8
+                    smf_sbi_discover_and_send(OpenAPI_nf_type_PCF, NULL,
9
+                        smf_npcf_smpolicycontrol_build_delete,
10
+                        sess, stream,
11
+                        OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED, &param));
12
             } else {
13
                 ogs_error("%s:%d No PolicyAssociationId",
14
                         smf_ue->supi, sess->psi);
15
open5gs_2.4.8.202207240002.tar.xz/src/smf/nnrf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/smf/nnrf-handler.c Changed
133
 
1
@@ -253,16 +253,22 @@
2
         ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg)
3
 {
4
     ogs_sbi_object_t *sbi_object = NULL;
5
+    OpenAPI_nf_type_e target_nf_type = 0;
6
+    ogs_sbi_discovery_option_t *discovery_option = NULL;
7
     ogs_sbi_nf_instance_t *nf_instance = NULL;
8
 
9
     OpenAPI_search_result_t *SearchResult = NULL;
10
     OpenAPI_lnode_t *node = NULL;
11
     bool handled;
12
 
13
+    ogs_assert(recvmsg);
14
     ogs_assert(xact);
15
     sbi_object = xact->sbi_object;
16
     ogs_assert(sbi_object);
17
-    ogs_assert(recvmsg);
18
+    target_nf_type = xact->target_nf_type;
19
+    ogs_assert(target_nf_type);
20
+
21
+    discovery_option = xact->discovery_option;
22
 
23
     SearchResult = recvmsg->SearchResult;
24
     if (!SearchResult) {
25
@@ -297,8 +303,6 @@
26
         }
27
 
28
         if (NF_INSTANCE_IS_OTHERS(nf_instance->id)) {
29
-            smf_sess_t *sess = NULL;
30
-
31
             handled = ogs_sbi_nnrf_handle_nf_profile(
32
                         nf_instance, NFProfile, NULL, NULL);
33
             if (!handled) {
34
@@ -315,10 +319,6 @@
35
                 continue;
36
             }
37
 
38
-            sess = (smf_sess_t *)sbi_object;
39
-            ogs_assert(sess);
40
-            smf_sess_select_nf(sess, nf_instance->nf_type);
41
-
42
             /* TIME : Update validity from NRF */
43
             if (SearchResult->is_validity_period &&
44
                 SearchResult->validity_period) {
45
@@ -337,85 +337,7 @@
46
         }
47
     }
48
 
49
-    ogs_assert(xact->target_nf_type);
50
-    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, xact->target_nf_type);
51
-    if (!nf_instance) {
52
-        ogs_error("(NF discover) No %s",
53
-                OpenAPI_nf_type_ToString(xact->target_nf_type));
54
-    } else {
55
-        ogs_assert(true == smf_sbi_send(nf_instance, xact));
56
-    }
57
-}
58
-
59
-void smf_nnrf_handle_nf_profile_retrieve(
60
-        ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg)
61
-{
62
-    ogs_sbi_object_t *sbi_object = NULL;
63
-    ogs_sbi_nf_instance_t *nf_instance = NULL;
64
-
65
-    OpenAPI_nf_profile_t *NFProfile = NULL;
66
-    bool handled;
67
+    ogs_sbi_select_nf(sbi_object, target_nf_type, discovery_option);
68
 
69
-    ogs_assert(xact);
70
-    sbi_object = xact->sbi_object;
71
-    ogs_assert(sbi_object);
72
-    ogs_assert(recvmsg);
73
-
74
-    NFProfile = recvmsg->NFProfile;
75
-    if (!NFProfile) {
76
-        ogs_error("No NFProfile");
77
-        return;
78
-    }
79
-
80
-    nf_instance = ogs_sbi_nf_instance_find(NFProfile->nf_instance_id);
81
-    if (!nf_instance) {
82
-        nf_instance = ogs_sbi_nf_instance_add();
83
-        ogs_assert(nf_instance);
84
-        ogs_sbi_nf_instance_set_id(nf_instance, NFProfile->nf_instance_id);
85
-
86
-        smf_nf_fsm_init(nf_instance);
87
-
88
-        ogs_info("%s (NF-discover) NF registered", nf_instance->id);
89
-    } else {
90
-        nf_instance->reference_count++;
91
-
92
-        OGS_FSM_TRAN(&nf_instance->sm, smf_nf_state_registered);
93
-        ogs_fsm_dispatch(&nf_instance->sm, NULL);
94
-
95
-        ogs_warn("%s (NF-discover) NF has already been added",
96
-                NFProfile->nf_instance_id);
97
-    }
98
-
99
-    if (NF_INSTANCE_IS_OTHERS(nf_instance->id)) {
100
-        smf_sess_t *sess = NULL;
101
-
102
-        handled = ogs_sbi_nnrf_handle_nf_profile(
103
-                    nf_instance, NFProfile, NULL, NULL);
104
-        if (!handled) {
105
-            ogs_error("ogs_sbi_nnrf_handle_nf_profile() failed %s",
106
-                    nf_instance->id);
107
-            SMF_NF_INSTANCE_CLEAR("NRF-discover", nf_instance);
108
-            return;
109
-        }
110
-
111
-        handled = ogs_sbi_client_associate(nf_instance);
112
-        if (!handled) {
113
-            ogs_error("%s Cannot assciate NF EndPoint", nf_instance->id);
114
-            SMF_NF_INSTANCE_CLEAR("NRF-discover", nf_instance);
115
-            return;
116
-        }
117
-
118
-        sess = (smf_sess_t *)sbi_object;
119
-        ogs_assert(sess);
120
-        smf_sess_select_nf(sess, nf_instance->nf_type);
121
-
122
-        ogs_info("%s (NF-discover) NF Profile updated", nf_instance->id);
123
-    }
124
-
125
-    if (!nf_instance) {
126
-        ogs_error("(NF discover) No %s",
127
-                OpenAPI_nf_type_ToString(xact->target_nf_type));
128
-    } else {
129
-        ogs_assert(true == smf_sbi_send(nf_instance, xact));
130
-    }
131
+    ogs_expect(true == smf_sbi_send_request(sbi_object, target_nf_type, xact));
132
 }
133
open5gs_2.4.8.202207240002.tar.xz/src/smf/nnrf-handler.h -> open5gs_2.4.8.202207250002.tar.xz/src/smf/nnrf-handler.h Changed
10
 
1
@@ -36,8 +36,6 @@
2
 
3
 void smf_nnrf_handle_nf_discover(
4
         ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg);
5
-void smf_nnrf_handle_nf_profile_retrieve(
6
-        ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg);
7
 
8
 #ifdef __cplusplus
9
 }
10
open5gs_2.4.8.202207240002.tar.xz/src/smf/npcf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/smf/npcf-handler.c Changed
14
 
1
@@ -683,9 +683,9 @@
2
 
3
     memset(&param, 0, sizeof(param));
4
     ogs_assert(true ==
5
-        smf_sbi_discover_and_send(OpenAPI_nf_type_PCF, sess, NULL,
6
-            OGS_PFCP_DELETE_TRIGGER_PCF_INITIATED, &param,
7
-            smf_npcf_smpolicycontrol_build_delete));
8
+        smf_sbi_discover_and_send(OpenAPI_nf_type_PCF, NULL,
9
+            smf_npcf_smpolicycontrol_build_delete,
10
+            sess, NULL, OGS_PFCP_DELETE_TRIGGER_PCF_INITIATED, &param));
11
 
12
     return true;
13
 }
14
open5gs_2.4.8.202207240002.tar.xz/src/smf/nsmf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/smf/nsmf-handler.c Changed
29
 
1
@@ -590,9 +590,10 @@
2
                 param.ue_timezone = true;
3
 
4
                 ogs_assert(true ==
5
-                    smf_sbi_discover_and_send(OpenAPI_nf_type_PCF, sess, stream,
6
-                        OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT, &param,
7
-                        smf_npcf_smpolicycontrol_build_delete));
8
+                    smf_sbi_discover_and_send(OpenAPI_nf_type_PCF, NULL,
9
+                        smf_npcf_smpolicycontrol_build_delete,
10
+                        sess, stream,
11
+                        OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT, &param));
12
             }
13
         } else {
14
             ogs_error("No PolicyAssociationId");
15
@@ -665,9 +666,10 @@
16
 
17
     if (sess->policy_association_id) {
18
         ogs_assert(true ==
19
-            smf_sbi_discover_and_send(OpenAPI_nf_type_PCF, sess, stream,
20
-                OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT, &param,
21
-                smf_npcf_smpolicycontrol_build_delete));
22
+            smf_sbi_discover_and_send(OpenAPI_nf_type_PCF, NULL,
23
+                smf_npcf_smpolicycontrol_build_delete,
24
+                sess, stream,
25
+                OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT, &param));
26
     } else {
27
         ogs_error("No PolicyAssociationId");
28
         ogs_assert(true ==
29
open5gs_2.4.8.202207240002.tar.xz/src/smf/nudm-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/smf/nudm-handler.c Changed
12
 
1
@@ -288,8 +288,8 @@
2
     ogs_free(sendmsg.http.location);
3
 
4
     ogs_assert(true ==
5
-        smf_sbi_discover_and_send(OpenAPI_nf_type_PCF, sess, stream,
6
-            0, NULL, smf_npcf_smpolicycontrol_build_create));
7
+        smf_sbi_discover_and_send(OpenAPI_nf_type_PCF, NULL,
8
+            smf_npcf_smpolicycontrol_build_create, sess, stream, 0, NULL));
9
 
10
     return true;
11
 
12
open5gs_2.4.8.202207240002.tar.xz/src/smf/sbi-path.c -> open5gs_2.4.8.202207250002.tar.xz/src/smf/sbi-path.c Changed
152
 
1
@@ -81,9 +81,6 @@
2
     ogs_sbi_nf_instance_t *nf_instance = NULL;
3
     ogs_sbi_nf_service_t *service = NULL;
4
 
5
-    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
6
-        return OGS_ERROR;
7
-
8
     /* Add SELF NF instance */
9
     nf_instance = ogs_sbi_self()->nf_instance;
10
     ogs_assert(nf_instance);
11
@@ -116,6 +113,16 @@
12
         }
13
     }
14
 
15
+    /* Timer expiration handler of client wait timer */
16
+    ogs_sbi_self()->client_wait_expire = smf_timer_sbi_client_wait_expire;
17
+
18
+    /* NF register state in NF state machine */
19
+    ogs_sbi_self()->nf_state_registered =
20
+        (ogs_fsm_handler_t)smf_nf_state_registered;
21
+
22
+    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
23
+        return OGS_ERROR;
24
+
25
     return OGS_OK;
26
 }
27
 
28
@@ -125,29 +132,47 @@
29
     ogs_sbi_server_stop_all();
30
 }
31
 
32
-bool smf_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact)
33
+bool smf_sbi_send_request(
34
+        ogs_sbi_object_t *sbi_object,
35
+        OpenAPI_nf_type_e target_nf_type,
36
+        void *data)
37
 {
38
-    return ogs_sbi_send(nf_instance, client_cb, xact);
39
+    ogs_sbi_nf_instance_t *nf_instance = NULL;
40
+
41
+    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, target_nf_type);
42
+    if (!nf_instance) {
43
+        ogs_error("(NF discover) No %s",
44
+                OpenAPI_nf_type_ToString(target_nf_type));
45
+        return false;
46
+    }
47
+
48
+    return ogs_sbi_send_request(nf_instance, client_cb, data);
49
 }
50
 
51
-bool smf_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
52
-        smf_sess_t *sess, ogs_sbi_stream_t *stream, int state, void *data,
53
-        ogs_sbi_request_t *(*build)(smf_sess_t *sess, void *data))
54
+bool smf_sbi_discover_and_send(
55
+        OpenAPI_nf_type_e target_nf_type,
56
+        ogs_sbi_discovery_option_t *discovery_option,
57
+        ogs_sbi_request_t *(*build)(smf_sess_t *sess, void *data),
58
+        smf_sess_t *sess, ogs_sbi_stream_t *stream, int state, void *data)
59
 {
60
-    ogs_sbi_xact_t *xact = NULL;
61
     smf_ue_t *smf_ue = NULL;
62
+    ogs_sbi_xact_t *xact = NULL;
63
 
64
-    ogs_assert(target_nf_type);
65
+    OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL;
66
 
67
     ogs_assert(sess);
68
     smf_ue = sess->smf_ue;
69
     ogs_assert(smf_ue);
70
 
71
+    ogs_assert(ogs_sbi_self()->nf_instance);
72
+    requester_nf_type = ogs_sbi_self()->nf_instance->nf_type;
73
+    ogs_assert(requester_nf_type);
74
+
75
     ogs_assert(build);
76
 
77
-    xact = ogs_sbi_xact_add(target_nf_type, &sess->sbi,
78
-            (ogs_sbi_build_f)build, sess, data,
79
-            smf_timer_sbi_client_wait_expire);
80
+    xact = ogs_sbi_xact_add(
81
+            &sess->sbi, target_nf_type, discovery_option,
82
+            (ogs_sbi_build_f)build, sess, data);
83
     if (!xact) {
84
         ogs_error("smf_sbi_discover_and_send() failed");
85
         ogs_assert(true ==
86
@@ -160,8 +185,10 @@
87
     xact->state = state;
88
     xact->assoc_stream = stream;
89
 
90
-    if (ogs_sbi_discover_and_send(xact,
91
-            (ogs_fsm_handler_t)smf_nf_state_registered, client_cb) != true) {
92
+    if (ogs_sbi_discover_and_send(
93
+            &sess->sbi,
94
+            target_nf_type, requester_nf_type, discovery_option,
95
+            client_cb, xact) != true) {
96
         ogs_error("smf_sbi_discover_and_send() failed");
97
         ogs_sbi_xact_remove(xact);
98
 
99
@@ -179,8 +206,12 @@
100
 void smf_namf_comm_send_n1_n2_message_transfer(
101
         smf_sess_t *sess, smf_n1_n2_message_transfer_param_t *param)
102
 {
103
-    ogs_sbi_xact_t *xact = NULL;
104
     smf_ue_t *smf_ue = NULL;
105
+    ogs_sbi_xact_t *xact = NULL;
106
+
107
+    OpenAPI_nf_type_e target_nf_type = OpenAPI_nf_type_NULL;
108
+    OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL;
109
+    ogs_sbi_discovery_option_t *discovery_option = NULL;
110
 
111
     ogs_assert(param);
112
     ogs_assert(param->state);
113
@@ -190,9 +221,21 @@
114
     smf_ue = sess->smf_ue;
115
     ogs_assert(smf_ue);
116
 
117
-    xact = ogs_sbi_xact_add(OpenAPI_nf_type_AMF, &sess->sbi,
118
+    ogs_assert(ogs_sbi_self()->nf_instance);
119
+    requester_nf_type = ogs_sbi_self()->nf_instance->nf_type;
120
+    ogs_assert(requester_nf_type);
121
+
122
+    target_nf_type = OpenAPI_nf_type_AMF;
123
+
124
+    discovery_option = ogs_sbi_discovery_option_new();
125
+    ogs_assert(discovery_option);
126
+    ogs_sbi_discovery_option_set_target_nf_instance_id(
127
+            discovery_option, sess->serving_nf_id);
128
+
129
+    xact = ogs_sbi_xact_add(
130
+            &sess->sbi, target_nf_type, discovery_option,
131
             (ogs_sbi_build_f)smf_namf_comm_build_n1_n2_message_transfer,
132
-            sess, param, smf_timer_sbi_client_wait_expire);
133
+            sess, param);
134
     if (!xact) {
135
         ogs_error("smf_namf_comm_send_n1_n2_message_transfer() failed");
136
         return;
137
@@ -200,10 +243,10 @@
138
 
139
     xact->state = param->state;
140
 
141
-    if (ogs_sbi_discover_by_nf_instanceid_and_send(xact,
142
-            (ogs_fsm_handler_t)smf_nf_state_registered, client_cb,
143
-            sess->serving_nf_id) != true)
144
-    {
145
+    if (ogs_sbi_discover_and_send(
146
+            &sess->sbi,
147
+            target_nf_type, requester_nf_type, discovery_option,
148
+            client_cb, xact) != true) {
149
         ogs_error("smf_namf_comm_send_n1_n2_message_transfer() failed");
150
         ogs_sbi_xact_remove(xact);
151
     }
152
open5gs_2.4.8.202207240002.tar.xz/src/smf/sbi-path.h -> open5gs_2.4.8.202207250002.tar.xz/src/smf/sbi-path.h Changed
22
 
1
@@ -34,11 +34,15 @@
2
 int smf_sbi_open(void);
3
 void smf_sbi_close(void);
4
 
5
-bool smf_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact);
6
-
7
-bool smf_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
8
-        smf_sess_t *sess, ogs_sbi_stream_t *stream, int state, void *data,
9
-        ogs_sbi_request_t *(*build)(smf_sess_t *sess, void *data));
10
+bool smf_sbi_send_request(
11
+        ogs_sbi_object_t *sbi_object,
12
+        OpenAPI_nf_type_e target_nf_type,
13
+        void *data);
14
+bool smf_sbi_discover_and_send(
15
+        OpenAPI_nf_type_e target_nf_type,
16
+        ogs_sbi_discovery_option_t *discovery_option,
17
+        ogs_sbi_request_t *(*build)(smf_sess_t *sess, void *data),
18
+        smf_sess_t *sess, ogs_sbi_stream_t *stream, int state, void *data);
19
 
20
 void smf_namf_comm_send_n1_n2_message_transfer(
21
         smf_sess_t *sess, smf_n1_n2_message_transfer_param_t *param);
22
open5gs_2.4.8.202207240002.tar.xz/src/smf/smf-sm.c -> open5gs_2.4.8.202207250002.tar.xz/src/smf/smf-sm.c Changed
34
 
1
@@ -658,27 +658,12 @@
2
 
3
             SWITCH(sbi_message.h.resource.component0)
4
             CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES)
5
+                nf_instance = e->sbi.data;
6
+                ogs_assert(nf_instance);
7
+                ogs_assert(OGS_FSM_STATE(&nf_instance->sm));
8
 
9
-                SWITCH(sbi_message.h.method)
10
-                CASE(OGS_SBI_HTTP_METHOD_GET)
11
-                    sbi_xact = e->sbi.data;
12
-                    ogs_assert(sbi_xact);
13
-
14
-                    if (sbi_message.res_status == OGS_SBI_HTTP_STATUS_OK)
15
-                        smf_nnrf_handle_nf_profile_retrieve(
16
-                            sbi_xact, &sbi_message);
17
-                    else
18
-                        ogs_error("HTTP response error %d",
19
-                                sbi_message.res_status);
20
-                    break;
21
-                DEFAULT
22
-                    nf_instance = e->sbi.data;
23
-                    ogs_assert(nf_instance);
24
-                    ogs_assert(OGS_FSM_STATE(&nf_instance->sm));
25
-
26
-                    e->sbi.message = &sbi_message;
27
-                    ogs_fsm_dispatch(&nf_instance->sm, e);
28
-                END
29
+                e->sbi.message = &sbi_message;
30
+                ogs_fsm_dispatch(&nf_instance->sm, e);
31
                 break;
32
 
33
             CASE(OGS_SBI_RESOURCE_NAME_SUBSCRIPTIONS)
34
open5gs_2.4.8.202207240002.tar.xz/src/udm/context.c -> open5gs_2.4.8.202207250002.tar.xz/src/udm/context.c Changed
13
 
1
@@ -229,11 +229,3 @@
2
 {
3
     return ogs_pool_cycle(&udm_ue_pool, udm_ue);
4
 }
5
-
6
-void udm_ue_select_nf(udm_ue_t *udm_ue, OpenAPI_nf_type_e nf_type)
7
-{
8
-    ogs_assert(udm_ue);
9
-    ogs_assert(nf_type);
10
-
11
-    ogs_sbi_select_nf(&udm_ue->sbi, nf_type, udm_nf_state_registered);
12
-}
13
open5gs_2.4.8.202207240002.tar.xz/src/udm/context.h -> open5gs_2.4.8.202207250002.tar.xz/src/udm/context.h Changed
10
 
1
@@ -106,8 +106,6 @@
2
 
3
 udm_ue_t *udm_ue_cycle(udm_ue_t *udm_ue);
4
 
5
-void udm_ue_select_nf(udm_ue_t *udm_ue, OpenAPI_nf_type_e nf_type);
6
-
7
 #ifdef __cplusplus
8
 }
9
 #endif
10
open5gs_2.4.8.202207240002.tar.xz/src/udm/nnrf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/udm/nnrf-handler.c Changed
61
 
1
@@ -253,16 +253,22 @@
2
         ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg)
3
 {
4
     ogs_sbi_object_t *sbi_object = NULL;
5
+    OpenAPI_nf_type_e target_nf_type = 0;
6
+    ogs_sbi_discovery_option_t *discovery_option = NULL;
7
     ogs_sbi_nf_instance_t *nf_instance = NULL;
8
 
9
     OpenAPI_search_result_t *SearchResult = NULL;
10
     OpenAPI_lnode_t *node = NULL;
11
     bool handled;
12
 
13
+    ogs_assert(recvmsg);
14
     ogs_assert(xact);
15
     sbi_object = xact->sbi_object;
16
     ogs_assert(sbi_object);
17
-    ogs_assert(recvmsg);
18
+    target_nf_type = xact->target_nf_type;
19
+    ogs_assert(target_nf_type);
20
+
21
+    discovery_option = xact->discovery_option;
22
 
23
     SearchResult = recvmsg->SearchResult;
24
     if (!SearchResult) {
25
@@ -297,8 +303,6 @@
26
         }
27
 
28
         if (NF_INSTANCE_IS_OTHERS(nf_instance->id)) {
29
-            udm_ue_t *udm_ue = NULL;
30
-
31
             handled = ogs_sbi_nnrf_handle_nf_profile(
32
                         nf_instance, NFProfile, NULL, NULL);
33
             if (!handled) {
34
@@ -315,10 +319,6 @@
35
                 continue;
36
             }
37
 
38
-            udm_ue = (udm_ue_t *)sbi_object;
39
-            ogs_assert(udm_ue);
40
-            udm_ue_select_nf(udm_ue, nf_instance->nf_type);
41
-
42
             /* TIME : Update validity from NRF */
43
             if (SearchResult->is_validity_period &&
44
                 SearchResult->validity_period) {
45
@@ -337,12 +337,7 @@
46
         }
47
     }
48
 
49
-    ogs_assert(xact->target_nf_type);
50
-    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, xact->target_nf_type);
51
-    if (!nf_instance) {
52
-        ogs_error("(NF discover) No %s",
53
-                OpenAPI_nf_type_ToString(xact->target_nf_type));
54
-    } else {
55
-        ogs_assert(true == udm_sbi_send(nf_instance, xact));
56
-    }
57
+    ogs_sbi_select_nf(sbi_object, target_nf_type, discovery_option);
58
+
59
+    ogs_expect(true == udm_sbi_send_request(sbi_object, target_nf_type, xact));
60
 }
61
open5gs_2.4.8.202207240002.tar.xz/src/udm/nudm-handler.c -> open5gs_2.4.8.202207250002.tar.xz/src/udm/nudm-handler.c Changed
63
 
1
@@ -73,9 +73,10 @@
2
     ResynchronizationInfo = AuthenticationInfoRequest->resynchronization_info;
3
     if (!ResynchronizationInfo) {
4
 
5
-        ogs_assert(true == udm_sbi_discover_and_send(
6
-                    OpenAPI_nf_type_UDR, udm_ue, stream, NULL,
7
-                    udm_nudr_dr_build_authentication_subscription));
8
+        ogs_assert(true ==
9
+            udm_sbi_discover_and_send(OpenAPI_nf_type_UDR, NULL,
10
+                udm_nudr_dr_build_authentication_subscription,
11
+                udm_ue, stream, NULL));
12
 
13
     } else {
14
         uint8_t randOGS_RAND_LEN;
15
@@ -162,9 +163,9 @@
16
         ogs_uint64_to_buffer(sqn, OGS_SQN_LEN, udm_ue->sqn);
17
 
18
         ogs_assert(true ==
19
-            udm_sbi_discover_and_send(OpenAPI_nf_type_UDR,
20
-                udm_ue, stream, udm_ue->sqn,
21
-                udm_nudr_dr_build_authentication_subscription));
22
+            udm_sbi_discover_and_send(OpenAPI_nf_type_UDR, NULL,
23
+                udm_nudr_dr_build_authentication_subscription,
24
+                udm_ue, stream, udm_ue->sqn));
25
     }
26
 
27
     return true;
28
@@ -232,8 +233,9 @@
29
             udm_ue->auth_event, message->AuthEvent);
30
 
31
     ogs_assert(true ==
32
-        udm_sbi_discover_and_send(OpenAPI_nf_type_UDR, udm_ue, stream, NULL,
33
-            udm_nudr_dr_build_update_authentication_status));
34
+        udm_sbi_discover_and_send(OpenAPI_nf_type_UDR, NULL,
35
+            udm_nudr_dr_build_update_authentication_status,
36
+            udm_ue, stream, NULL));
37
 
38
     return true;
39
 }
40
@@ -330,8 +332,8 @@
41
                 message->Amf3GppAccessRegistration);
42
 
43
     ogs_assert(true ==
44
-        udm_sbi_discover_and_send(OpenAPI_nf_type_UDR, udm_ue, stream, NULL,
45
-            udm_nudr_dr_build_update_amf_context));
46
+        udm_sbi_discover_and_send(OpenAPI_nf_type_UDR, NULL,
47
+            udm_nudr_dr_build_update_amf_context, udm_ue, stream, NULL));
48
 
49
     return true;
50
 }
51
@@ -437,8 +439,9 @@
52
     }
53
 
54
     ogs_assert(true ==
55
-        udm_sbi_discover_and_send(OpenAPI_nf_type_UDR, udm_ue, stream,
56
-            PatchItemList, udm_nudr_dr_build_patch_amf_context));
57
+        udm_sbi_discover_and_send(OpenAPI_nf_type_UDR, NULL,
58
+            udm_nudr_dr_build_patch_amf_context,
59
+            udm_ue, stream, PatchItemList));
60
 
61
     return true;
62
 }
63
open5gs_2.4.8.202207240002.tar.xz/src/udm/sbi-path.c -> open5gs_2.4.8.202207250002.tar.xz/src/udm/sbi-path.c Changed
94
 
1
@@ -79,9 +79,6 @@
2
     ogs_sbi_nf_instance_t *nf_instance = NULL;
3
     ogs_sbi_nf_service_t *service = NULL;
4
 
5
-    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
6
-        return OGS_ERROR;
7
-
8
     /* Add SELF NF instance */
9
     nf_instance = ogs_sbi_self()->nf_instance;
10
     ogs_assert(nf_instance);
11
@@ -129,6 +126,16 @@
12
         }
13
     }
14
 
15
+    /* Timer expiration handler of client wait timer */
16
+    ogs_sbi_self()->client_wait_expire = udm_timer_sbi_client_wait_expire;
17
+
18
+    /* NF register state in NF state machine */
19
+    ogs_sbi_self()->nf_state_registered =
20
+        (ogs_fsm_handler_t)udm_nf_state_registered;
21
+
22
+    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
23
+        return OGS_ERROR;
24
+
25
     return OGS_OK;
26
 }
27
 
28
@@ -138,25 +145,44 @@
29
     ogs_sbi_server_stop_all();
30
 }
31
 
32
-bool udm_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact)
33
+bool udm_sbi_send_request(
34
+        ogs_sbi_object_t *sbi_object,
35
+        OpenAPI_nf_type_e target_nf_type,
36
+        void *data)
37
 {
38
-    return ogs_sbi_send(nf_instance, client_cb, xact);
39
+    ogs_sbi_nf_instance_t *nf_instance = NULL;
40
+
41
+    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, target_nf_type);
42
+    if (!nf_instance) {
43
+        ogs_error("(NF discover) No %s",
44
+                OpenAPI_nf_type_ToString(target_nf_type));
45
+        return false;
46
+    }
47
+
48
+    return ogs_sbi_send_request(nf_instance, client_cb, data);
49
 }
50
 
51
-bool udm_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
52
-        udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, void *data,
53
-        ogs_sbi_request_t *(*build)(udm_ue_t *udm_ue, void *data))
54
+bool udm_sbi_discover_and_send(
55
+        OpenAPI_nf_type_e target_nf_type,
56
+        ogs_sbi_discovery_option_t *discovery_option,
57
+        ogs_sbi_request_t *(*build)(udm_ue_t *udm_ue, void *data),
58
+        udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, void *data)
59
 {
60
     ogs_sbi_xact_t *xact = NULL;
61
+    OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL;
62
+
63
+    ogs_assert(ogs_sbi_self()->nf_instance);
64
+    requester_nf_type = ogs_sbi_self()->nf_instance->nf_type;
65
+    ogs_assert(requester_nf_type);
66
 
67
     ogs_assert(target_nf_type);
68
     ogs_assert(udm_ue);
69
     ogs_assert(stream);
70
     ogs_assert(build);
71
 
72
-    xact = ogs_sbi_xact_add(target_nf_type, &udm_ue->sbi,
73
-            (ogs_sbi_build_f)build, udm_ue, data,
74
-            udm_timer_sbi_client_wait_expire);
75
+    xact = ogs_sbi_xact_add(
76
+            &udm_ue->sbi, target_nf_type, discovery_option,
77
+            (ogs_sbi_build_f)build, udm_ue, data);
78
     if (!xact) {
79
         ogs_error("udm_sbi_discover_and_send() failed");
80
         ogs_assert(true ==
81
@@ -168,8 +194,10 @@
82
 
83
     xact->assoc_stream = stream;
84
 
85
-    if (ogs_sbi_discover_and_send(xact,
86
-            (ogs_fsm_handler_t)udm_nf_state_registered, client_cb) != true) {
87
+    if (ogs_sbi_discover_and_send(
88
+            &udm_ue->sbi,
89
+            target_nf_type, requester_nf_type, discovery_option,
90
+            client_cb, xact) != true) {
91
         ogs_error("udm_sbi_discover_and_send() failed");
92
         ogs_sbi_xact_remove(xact);
93
         ogs_assert(true ==
94
open5gs_2.4.8.202207240002.tar.xz/src/udm/sbi-path.h -> open5gs_2.4.8.202207250002.tar.xz/src/udm/sbi-path.h Changed
21
 
1
@@ -30,10 +30,15 @@
2
 int udm_sbi_open(void);
3
 void udm_sbi_close(void);
4
 
5
-bool udm_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact);
6
-bool udm_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
7
-        udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, void *data,
8
-        ogs_sbi_request_t *(*build)(udm_ue_t *udm_ue, void *data));
9
+bool udm_sbi_send_request(
10
+        ogs_sbi_object_t *sbi_object,
11
+        OpenAPI_nf_type_e target_nf_type,
12
+        void *data);
13
+bool udm_sbi_discover_and_send(
14
+        OpenAPI_nf_type_e target_nf_type,
15
+        ogs_sbi_discovery_option_t *discovery_option,
16
+        ogs_sbi_request_t *(*build)(udm_ue_t *udm_ue, void *data),
17
+        udm_ue_t *udm_ue, ogs_sbi_stream_t *stream, void *data);
18
 
19
 #ifdef __cplusplus
20
 }
21
open5gs_2.4.8.202207240002.tar.xz/src/udm/ue-sm.c -> open5gs_2.4.8.202207250002.tar.xz/src/udm/ue-sm.c Changed
14
 
1
@@ -143,9 +143,9 @@
2
                 CASE(OGS_SBI_RESOURCE_NAME_SMF_SELECT_DATA)
3
                 CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
4
                     ogs_assert(true ==
5
-                        udm_sbi_discover_and_send(
6
-                            OpenAPI_nf_type_UDR, udm_ue, stream, message,
7
-                            udm_nudr_dr_build_query_subscription_provisioned));
8
+                        udm_sbi_discover_and_send(OpenAPI_nf_type_UDR, NULL,
9
+                            udm_nudr_dr_build_query_subscription_provisioned,
10
+                            udm_ue, stream, message));
11
                     break;
12
 
13
                 CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA)
14
open5gs_2.4.8.202207240002.tar.xz/src/udr/sbi-path.c -> open5gs_2.4.8.202207250002.tar.xz/src/udr/sbi-path.c Changed
28
 
1
@@ -79,9 +79,6 @@
2
     ogs_sbi_nf_instance_t *nf_instance = NULL;
3
     ogs_sbi_nf_service_t *service = NULL;
4
 
5
-    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
6
-        return OGS_ERROR;
7
-
8
     /* Add SELF NF instance */
9
     nf_instance = ogs_sbi_self()->nf_instance;
10
     ogs_assert(nf_instance);
11
@@ -116,6 +113,16 @@
12
         }
13
     }
14
 
15
+    /* Timer expiration handler of client wait timer */
16
+    ogs_sbi_self()->client_wait_expire = udr_timer_sbi_client_wait_expire;
17
+
18
+    /* NF register state in NF state machine */
19
+    ogs_sbi_self()->nf_state_registered =
20
+        (ogs_fsm_handler_t)udr_nf_state_registered;
21
+
22
+    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
23
+        return OGS_ERROR;
24
+
25
     return OGS_OK;
26
 }
27
 
28
open5gs_2.4.8.202207240002.tar.xz/src/udr/timer.c -> open5gs_2.4.8.202207250002.tar.xz/src/udr/timer.c Changed
10
 
1
@@ -94,3 +94,8 @@
2
 {
3
     sbi_timer_send_event(UDR_TIMER_SUBSCRIPTION_VALIDITY, data);
4
 }
5
+
6
+void udr_timer_sbi_client_wait_expire(void *data)
7
+{
8
+    sbi_timer_send_event(UDR_TIMER_SBI_CLIENT_WAIT, data);
9
+}
10
open5gs_2.4.8.202207240002.tar.xz/src/udr/timer.h -> open5gs_2.4.8.202207250002.tar.xz/src/udr/timer.h Changed
17
 
1
@@ -35,6 +35,7 @@
2
     UDR_TIMER_NF_INSTANCE_NO_HEARTBEAT,
3
     UDR_TIMER_NF_INSTANCE_VALIDITY,
4
     UDR_TIMER_SUBSCRIPTION_VALIDITY,
5
+    UDR_TIMER_SBI_CLIENT_WAIT,
6
 
7
     MAX_NUM_OF_UDR_TIMER,
8
 
9
@@ -47,6 +48,7 @@
10
 void udr_timer_nf_instance_no_heartbeat(void *data);
11
 void udr_timer_nf_instance_validity(void *data);
12
 void udr_timer_subscription_validity(void *data);
13
+void udr_timer_sbi_client_wait_expire(void *data);
14
 
15
 #ifdef __cplusplus
16
 }
17
open5gs_2.4.8.202207240002.tar.xz/tests/af/af-sm.c -> open5gs_2.4.8.202207250002.tar.xz/tests/af/af-sm.c Changed
12
 
1
@@ -455,8 +455,8 @@
2
 
3
         switch(e->local_id) {
4
         case AF_LOCAL_DISCOVER_AND_SEND:
5
-            af_sbi_discover_and_send(e->local.target_nf_type,
6
-                    e->sess, e->local.data, e->local.build);
7
+            af_sbi_discover_and_send(e->local.target_nf_type, NULL,
8
+                    e->local.build, e->sess, e->local.data);
9
             break;
10
         case AF_LOCAL_SEND_TO_PCF:
11
             af_sbi_send_to_pcf(e->sess, e->local.data, e->local.build);
12
open5gs_2.4.8.202207240002.tar.xz/tests/af/context.c -> open5gs_2.4.8.202207250002.tar.xz/tests/af/context.c Changed
16
 
1
@@ -262,14 +262,6 @@
2
                         pcf_app_session_id, strlen(pcf_app_session_id));
3
 }
4
 
5
-void af_sess_select_nf(af_sess_t *sess, OpenAPI_nf_type_e nf_type)
6
-{
7
-    ogs_assert(sess);
8
-    ogs_assert(nf_type);
9
-
10
-    ogs_sbi_select_nf(&sess->sbi, nf_type, af_nf_state_registered);
11
-}
12
-
13
 static ogs_sbi_client_t *find_client_by_fqdn(char *fqdn, int port)
14
 {
15
     int rv;
16
open5gs_2.4.8.202207240002.tar.xz/tests/af/context.h -> open5gs_2.4.8.202207250002.tar.xz/tests/af/context.h Changed
10
 
1
@@ -113,8 +113,6 @@
2
 af_sess_t *af_sess_find_by_af_app_session_id(char *af_app_session_id);
3
 af_sess_t *af_sess_find_by_pcf_app_session_id(char *pcf_app_session_id);
4
 
5
-void af_sess_select_nf(af_sess_t *sess, OpenAPI_nf_type_e nf_type);
6
-
7
 void af_sess_associate_pcf_client(af_sess_t *sess);
8
 
9
 #ifdef __cplusplus
10
open5gs_2.4.8.202207240002.tar.xz/tests/af/nnrf-handler.c -> open5gs_2.4.8.202207250002.tar.xz/tests/af/nnrf-handler.c Changed
61
 
1
@@ -257,16 +257,22 @@
2
         ogs_sbi_xact_t *xact, ogs_sbi_message_t *recvmsg)
3
 {
4
     ogs_sbi_object_t *sbi_object = NULL;
5
+    OpenAPI_nf_type_e target_nf_type = 0;
6
+    ogs_sbi_discovery_option_t *discovery_option = NULL;
7
     ogs_sbi_nf_instance_t *nf_instance = NULL;
8
 
9
     OpenAPI_search_result_t *SearchResult = NULL;
10
     OpenAPI_lnode_t *node = NULL;
11
     bool handled;
12
 
13
+    ogs_assert(recvmsg);
14
     ogs_assert(xact);
15
     sbi_object = xact->sbi_object;
16
     ogs_assert(sbi_object);
17
-    ogs_assert(recvmsg);
18
+    target_nf_type = xact->target_nf_type;
19
+    ogs_assert(target_nf_type);
20
+
21
+    discovery_option = xact->discovery_option;
22
 
23
     SearchResult = recvmsg->SearchResult;
24
     if (!SearchResult) {
25
@@ -301,8 +307,6 @@
26
         }
27
 
28
         if (NF_INSTANCE_IS_OTHERS(nf_instance->id)) {
29
-            af_sess_t *sess = NULL;
30
-
31
             handled = ogs_sbi_nnrf_handle_nf_profile(
32
                         nf_instance, NFProfile, NULL, NULL);
33
             if (!handled) {
34
@@ -319,10 +323,6 @@
35
                 continue;
36
             }
37
 
38
-            sess = (af_sess_t *)sbi_object;
39
-            ogs_assert(sess);
40
-            af_sess_select_nf(sess, nf_instance->nf_type);
41
-
42
             /* TIME : Update validity from NRF */
43
             if (SearchResult->validity_period) {
44
                 nf_instance->time.validity_duration =
45
@@ -340,12 +340,7 @@
46
         }
47
     }
48
 
49
-    ogs_assert(xact->target_nf_type);
50
-    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, xact->target_nf_type);
51
-    if (!nf_instance) {
52
-        ogs_error("(NF discover) No %s",
53
-                OpenAPI_nf_type_ToString(xact->target_nf_type));
54
-    } else {
55
-        af_sbi_send(nf_instance, xact);
56
-    }
57
+    ogs_sbi_select_nf(sbi_object, target_nf_type, discovery_option);
58
+
59
+    ogs_expect(true == af_sbi_send_request(sbi_object, target_nf_type, xact));
60
 }
61
open5gs_2.4.8.202207240002.tar.xz/tests/af/sbi-path.c -> open5gs_2.4.8.202207250002.tar.xz/tests/af/sbi-path.c Changed
93
 
1
@@ -79,9 +79,6 @@
2
     ogs_sbi_nf_instance_t *nf_instance = NULL;
3
     ogs_sbi_nf_service_t *service = NULL;
4
 
5
-    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
6
-        return OGS_ERROR;
7
-
8
     /* Add SELF NF instance */
9
     nf_instance = ogs_sbi_self()->nf_instance;
10
     ogs_assert(nf_instance);
11
@@ -112,6 +109,17 @@
12
         }
13
     }
14
 
15
+    /* Timer expiration handler of client wait timer */
16
+    ogs_sbi_self()->client_wait_expire = af_timer_sbi_client_wait_expire;
17
+
18
+    /* NF register state in NF state machine */
19
+    ogs_sbi_self()->nf_state_registered =
20
+        (ogs_fsm_handler_t)af_nf_state_registered;
21
+
22
+    if (ogs_sbi_server_start_all(server_cb) != OGS_OK)
23
+        return OGS_ERROR;
24
+
25
+
26
     return OGS_OK;
27
 }
28
 
29
@@ -136,32 +144,53 @@
30
             client, client->cb, request, nf_instance);
31
 }
32
 
33
-void af_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact)
34
+bool af_sbi_send_request(
35
+        ogs_sbi_object_t *sbi_object,
36
+        OpenAPI_nf_type_e target_nf_type,
37
+        void *data)
38
 {
39
-    ogs_sbi_send(nf_instance, client_cb, xact);
40
+    ogs_sbi_nf_instance_t *nf_instance = NULL;
41
+
42
+    nf_instance = OGS_SBI_NF_INSTANCE(sbi_object, target_nf_type);
43
+    if (!nf_instance) {
44
+        ogs_error("(NF discover) No %s",
45
+                OpenAPI_nf_type_ToString(target_nf_type));
46
+        return false;
47
+    }
48
+
49
+    return ogs_sbi_send_request(nf_instance, client_cb, data);
50
 }
51
 
52
-void af_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
53
-        af_sess_t *sess, void *data,
54
-        ogs_sbi_request_t *(*build)(af_sess_t *sess, void *data))
55
+void af_sbi_discover_and_send(
56
+        OpenAPI_nf_type_e target_nf_type,
57
+        ogs_sbi_discovery_option_t *discovery_option,
58
+        ogs_sbi_request_t *(*build)(af_sess_t *sess, void *data),
59
+        af_sess_t *sess, void *data)
60
 {
61
     ogs_sbi_xact_t *xact = NULL;
62
+    OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL;
63
+
64
+    ogs_assert(ogs_sbi_self()->nf_instance);
65
+    requester_nf_type = ogs_sbi_self()->nf_instance->nf_type;
66
+    ogs_assert(requester_nf_type);
67
 
68
     ogs_assert(target_nf_type);
69
 
70
     ogs_assert(sess);
71
     ogs_assert(build);
72
 
73
-    xact = ogs_sbi_xact_add(target_nf_type, &sess->sbi,
74
-            (ogs_sbi_build_f)build, sess, data,
75
-            af_timer_sbi_client_wait_expire);
76
+    xact = ogs_sbi_xact_add(
77
+            &sess->sbi, target_nf_type, discovery_option,
78
+            (ogs_sbi_build_f)build, sess, data);
79
     if (!xact) {
80
         ogs_error("af_sbi_discover_and_send() failed");
81
         return;
82
     }
83
 
84
-    if (ogs_sbi_discover_and_send(xact,
85
-            (ogs_fsm_handler_t)af_nf_state_registered, client_cb) != true) {
86
+    if (ogs_sbi_discover_and_send(
87
+            &sess->sbi,
88
+            target_nf_type, requester_nf_type, discovery_option,
89
+            client_cb, xact) != true) {
90
         ogs_error("af_sbi_discover_and_send() failed");
91
         return;
92
     }
93
open5gs_2.4.8.202207240002.tar.xz/tests/af/sbi-path.h -> open5gs_2.4.8.202207250002.tar.xz/tests/af/sbi-path.h Changed
22
 
1
@@ -33,11 +33,15 @@
2
 
3
 bool af_nnrf_nfm_send_nf_register(ogs_sbi_nf_instance_t *nf_instance);
4
 
5
-void af_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_xact_t *xact);
6
-
7
-void af_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
8
-        af_sess_t *sess, void *data,
9
-        ogs_sbi_request_t *(*build)(af_sess_t *sess, void *data));
10
+bool af_sbi_send_request(
11
+        ogs_sbi_object_t *sbi_object,
12
+        OpenAPI_nf_type_e target_nf_type,
13
+        void *data);
14
+void af_sbi_discover_and_send(
15
+        OpenAPI_nf_type_e target_nf_type,
16
+        ogs_sbi_discovery_option_t *discovery_option,
17
+        ogs_sbi_request_t *(*build)(af_sess_t *sess, void *data),
18
+        af_sess_t *sess, void *data);
19
 
20
 void af_sbi_send_to_pcf(
21
         af_sess_t *sess, void *data,
22
open5gs_2.4.8.202207240002.tar.xz/tests/app/5gc-init.c -> open5gs_2.4.8.202207250002.tar.xz/tests/app/5gc-init.c Changed
11
 
1
@@ -101,8 +101,8 @@
2
     if (udm_thread) ogs_thread_destroy(udm_thread);
3
     if (ausf_thread) ogs_thread_destroy(ausf_thread);
4
 
5
-    if (nrf_thread) ogs_thread_destroy(nrf_thread);
6
     if (scp_thread) ogs_thread_destroy(scp_thread);
7
+    if (nrf_thread) ogs_thread_destroy(nrf_thread);
8
 }
9
 
10
 void test_5gc_init(void)
11
open5gs_2.4.8.202207240002.tar.xz/tests/app/app-init.c -> open5gs_2.4.8.202207250002.tar.xz/tests/app/app-init.c Changed
12
 
1
@@ -123,8 +123,9 @@
2
 
3
     if (hss_thread) ogs_thread_destroy(hss_thread);
4
     if (pcrf_thread) ogs_thread_destroy(pcrf_thread);
5
-    if (nrf_thread) ogs_thread_destroy(nrf_thread);
6
+
7
     if (scp_thread) ogs_thread_destroy(scp_thread);
8
+    if (nrf_thread) ogs_thread_destroy(nrf_thread);
9
 }
10
 
11
 void test_app_init(void)
12