d51194938cd10d2ea8268b50b759d2d1dc63fbf5
[it/test.git] / simulators / e2sim / src / E2AP / e2ap_message_handler.cpp
1 /*****************************************************************************\r
2 #                                                                            *\r
3 # Copyright 2019 AT&T Intellectual Property                                  *\r
4 # Copyright 2019 Nokia                                                       *\r
5 #                                                                            *\r
6 # Licensed under the Apache License, Version 2.0 (the "License");            *\r
7 # you may not use this file except in compliance with the License.           *\r
8 # You may obtain a copy of the License at                                    *\r
9 #                                                                            *\r
10 #      http://www.apache.org/licenses/LICENSE-2.0                            *\r
11 #                                                                            *\r
12 # Unless required by applicable law or agreed to in writing, software        *\r
13 # distributed under the License is distributed on an "AS IS" BASIS,          *\r
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *\r
15 # See the License for the specific language governing permissions and        *\r
16 # limitations under the License.                                             *\r
17 #                                                                            *\r
18 ******************************************************************************/\r
19 #include "e2ap_message_handler.hpp"\r
20 \r
21 void e2ap_handle_sctp_data(int &socket_fd, sctp_buffer_t &data)\r
22 {\r
23   //decode the data into E2AP-PDU\r
24   e2ap_pdu_t* pdu = new_e2ap_pdu();\r
25 \r
26   e2ap_decode_pdu(pdu, data.buffer, data.len);\r
27 \r
28   e2ap_print_pdu(pdu);\r
29 \r
30   int index = e2ap_get_index(pdu);\r
31   int procedureCode = e2ap_get_procedureCode(pdu);\r
32 \r
33   LOG_I("[E2AP] Unpacked E2AP-PDU: index = %d, procedureCode = %d\n", index, procedureCode);\r
34 \r
35   switch(procedureCode)\r
36   {\r
37     case 6: //X2Setup\r
38       switch(index)\r
39       {\r
40         case 1: //initiatingMessage\r
41           LOG_D("[E2AP] Received X2-SETUP-REQUEST");\r
42           e2ap_handle_X2SetupRequest(pdu, socket_fd);\r
43           break;\r
44 \r
45         case 2: //successfulOutcome\r
46           LOG_D("[E2AP] Received X2-SETUP-RESPONSE");\r
47           //e2ap_handle_X2SetupResponse(pdu, socket_fd);\r
48           break;\r
49 \r
50         case 3:\r
51           break;\r
52 \r
53         default:\r
54           LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU", index);\r
55           break;\r
56       }\r
57       break;\r
58 \r
59     case 36: //ENDCX2Setup\r
60       switch(index)\r
61       {\r
62         case 1: //initiatingMessage\r
63           LOG_D("[E2AP] Received ENDC-X2-SETUP-REQUEST");\r
64           e2ap_handle_ENDCX2SetupRequest(pdu, socket_fd);\r
65           break;\r
66 \r
67         case 2: //successfulOutcome\r
68           LOG_D("[E2AP] Received ENDC-X2-SETUP-RESPONSE");\r
69           //x2ap_handle_X2SetupResponse(pdu, socket_fd);\r
70           break;\r
71 \r
72         case 3:\r
73           LOG_D("[E2AP] Received ENDC-X2-SETUP-FAILURE");\r
74           break;\r
75 \r
76         default:\r
77           LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU", index);\r
78           break;\r
79       }\r
80       break;\r
81 \r
82     case 201: //RIC SUBSCRIPTION\r
83       switch(index)\r
84       {\r
85         case 1: //initiatingMessage\r
86           LOG_D("[E2AP] Received RIC-SUBSCRIPTION-REQUEST");\r
87           e2ap_handle_RICSubscriptionRequest(pdu, socket_fd);\r
88           break;\r
89 \r
90         case 2:\r
91           LOG_D("[E2AP] Received RIC-SUBSCRIPTION-RESPONSE");\r
92           break;\r
93 \r
94         case 3:\r
95           LOG_D("[E2AP] Received RIC-SUBSCRIPTION-FAILURE");\r
96           break;\r
97 \r
98         default:\r
99         LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU", index);\r
100         break;\r
101       }\r
102       break;\r
103 \r
104     default:\r
105       LOG_E("[E2AP] No available handler for procedureCode=%d", procedureCode);\r
106       break;\r
107   }\r
108 }\r
109 \r
110 void e2ap_handle_X2SetupRequest(e2ap_pdu_t* pdu, int &socket_fd)\r
111 {\r
112   /*\r
113   Simply send back X2SetupResponse\r
114   Todo: add more handling options (failure, duplicated request, etc.)\r
115   */\r
116 \r
117   e2ap_pdu_t* res_pdu = new_e2ap_pdu();\r
118   eNB_config cfg;\r
119 \r
120   e2ap_create_X2SetupResponse(res_pdu, cfg);\r
121   LOG_D("[E2AP] Created X2-SETUP-RESPONSE")\r
122 \r
123   e2ap_print_pdu(res_pdu);\r
124 \r
125   //encode response pdu into buffer\r
126   sctp_buffer_t res_data;\r
127   e2ap_encode_pdu(res_pdu, res_data.buffer, sizeof(res_data.buffer), res_data.len);\r
128 \r
129   //send response data over sctp\r
130   if(sctp_send_data(socket_fd, res_data) > 0) {\r
131     LOG_I("[SCTP] Sent X2-SETUP-RESPONSE");\r
132   } else {\r
133     LOG_E("[SCTP] Unable to send X2-SETUP-RESPONSE to peer");\r
134   }\r
135 }\r
136 \r
137 void e2ap_handle_X2SetupResponse(e2ap_pdu_t* pdu, int &socket_fd)\r
138 {\r
139   ;\r
140 }\r
141 \r
142 void e2ap_handle_ENDCX2SetupRequest(e2ap_pdu_t* pdu, int &socket_fd)\r
143 {\r
144   /*\r
145   Simply send back ENDCX2SetupResponse\r
146   Todo: add more handling options (failure, duplicated request, etc.)\r
147   */\r
148 \r
149   e2ap_pdu_t* res_pdu = new_e2ap_pdu();\r
150   gNB_config gnb_cfg;\r
151 \r
152   e2ap_create_ENDCX2SetupResponse(res_pdu, gnb_cfg);\r
153   LOG_D("[E2AP] Created ENDC-X2-SETUP-RESPONSE");\r
154 \r
155   e2ap_print_pdu(res_pdu);\r
156 \r
157   sctp_buffer_t data;\r
158   e2ap_encode_pdu(res_pdu, data.buffer, sizeof(data.buffer), data.len);\r
159 \r
160   //send response data over sctp\r
161   if(sctp_send_data(socket_fd, data) > 0) {\r
162     LOG_I("[SCTP] Sent ENDC-X2-SETUP-RESPONSE");\r
163   } else {\r
164     LOG_E("[SCTP] Unable to send ENDC-X2-SETUP-RESPONSE to peer");\r
165   }\r
166 }\r
167 \r
168 void e2ap_handle_RICSubscriptionRequest(e2ap_pdu_t* pdu, int &socket_fd)\r
169 {\r
170   RICsubscription_params_t params;\r
171   e2ap_parse_RICsubscriptionRequest(pdu, params);\r
172 \r
173   /* Example handling logic\r
174   - Accept if request id is even-numbered -> send back response\r
175     in this case, accept every other actions\r
176 \r
177   - Reject if request id is odd-numbered -> send back failure\r
178   */\r
179 \r
180   e2ap_pdu_t* res_pdu = new_e2ap_pdu();\r
181   bool is_failure = false;\r
182 \r
183   if(params.request_id % 2 == 0)\r
184   {\r
185     for(size_t i = 0; i < params.actionList.size(); i++)\r
186     {\r
187       if(i%2 == 0){\r
188         params.actionList[i].isAdmitted = true;\r
189       } else {\r
190         params.actionList[i].isAdmitted = false;\r
191         params.actionList[i].notAdmitted_cause = RICcause_radioNetwork;\r
192         params.actionList[i].notAdmitted_subCause = 5;\r
193       }\r
194     }\r
195 \r
196     e2ap_create_RICsubscriptionResponse(res_pdu, params);\r
197     LOG_I("[E2AP] Created RIC-SUBSCRIPTION-RESPONSE");\r
198   }\r
199   else\r
200   {\r
201     is_failure = true;\r
202 \r
203     for(size_t i = 0; i < params.actionList.size(); i++)\r
204     {\r
205       params.actionList[i].isAdmitted = false;\r
206       params.actionList[i].notAdmitted_cause = RICcause_radioNetwork;\r
207       params.actionList[i].notAdmitted_subCause = 5;\r
208     }\r
209 \r
210     e2ap_create_RICsubscriptionFailure(res_pdu, params);\r
211     LOG_I("[E2AP] Created RIC-SUBSCRIPTION-FAILURE");\r
212   }\r
213 \r
214   e2ap_print_pdu(res_pdu);\r
215 \r
216   //Encode into buffer\r
217   sctp_buffer_t data;\r
218   e2ap_encode_pdu(res_pdu, data.buffer, sizeof(data.buffer), data.len);\r
219 \r
220   //send response data over sctp\r
221   if(sctp_send_data(socket_fd, data) > 0)\r
222   {\r
223     if(is_failure) {\r
224       LOG_I("[SCTP] Sent RIC-SUBSCRIPTION-FAILURE");\r
225     }\r
226     else {\r
227       LOG_I("[SCTP] Sent RIC-SUBSCRIPTION-RESPONSE");\r
228     }\r
229   }\r
230   else\r
231   {\r
232     if(is_failure) {\r
233       LOG_I("[SCTP] Unable to send RIC-SUBSCRIPTION-FAILURE");\r
234     }\r
235     else {\r
236       LOG_E("[SCTP] Unable to send RIC-SUBSCRIPTION-RESPONSE");\r
237     }\r
238   }\r
239 \r
240 }\r