efdf1750cac8ff7332f61c1155a8ce67a2e49e7e
[sim/e2-interface.git] / e2sim / e2apv1sim / src / E2AP / e2ap_message_handler.cpp
1 \r
2 \r
3 /*****************************************************************************\r
4 #                                                                            *\r
5 # Copyright 2019 AT&T Intellectual Property                                  *\r
6 # Copyright 2019 Nokia                                                       *\r
7 #                                                                            *\r
8 # Licensed under the Apache License, Version 2.0 (the "License");            *\r
9 # you may not use this file except in compliance with the License.           *\r
10 # You may obtain a copy of the License at                                    *\r
11 #                                                                            *\r
12 #      http://www.apache.org/licenses/LICENSE-2.0                            *\r
13 #                                                                            *\r
14 # Unless required by applicable law or agreed to in writing, software        *\r
15 # distributed under the License is distributed on an "AS IS" BASIS,          *\r
16 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *\r
17 # See the License for the specific language governing permissions and        *\r
18 # limitations under the License.                                             *\r
19 #                                                                            *\r
20 ******************************************************************************/\r
21 #include "e2ap_message_handler.hpp"\r
22 #include <unistd.h>\r
23 //#include <iostream>\r
24 //#include <vector>\r
25 #include "encode_e2apv1.hpp"\r
26 \r
27 \r
28 \r
29 void e2ap_handle_sctp_data(int &socket_fd, sctp_buffer_t &data, bool xmlenc)\r
30 {\r
31   fprintf(stderr, "in e2ap_handle_sctp_data()\n");\r
32   //decode the data into E2AP-PDU\r
33   E2AP_PDU_t* pdu = (E2AP_PDU_t*)calloc(1, sizeof(E2AP_PDU));\r
34   ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, pdu);\r
35 \r
36   fprintf(stderr, "decoding...\n");\r
37 \r
38   asn_transfer_syntax syntax;\r
39   \r
40   if (!xmlenc) \r
41     syntax = ATS_ALIGNED_BASIC_PER;\r
42   else\r
43     syntax = ATS_BASIC_XER;\r
44 \r
45   //  e2ap_asn1c_decode_pdu(pdu, data.buffer, data.len);\r
46 \r
47   auto rval = asn_decode(nullptr, syntax, &asn_DEF_E2AP_PDU, (void **) &pdu,\r
48                     data.buffer, data.len);\r
49   \r
50 \r
51   int index = (int)pdu->present;\r
52   fprintf(stderr, "length of data %d\n", rval.consumed);\r
53   fprintf(stderr, "result %d\n", rval.code);\r
54   fprintf(stderr, "index is %d\n", index);\r
55   \r
56   fprintf(stderr, "showing xer of data\n");  \r
57   \r
58   xer_fprint(stderr, &asn_DEF_E2AP_PDU, pdu);\r
59   \r
60   int procedureCode = e2ap_asn1c_get_procedureCode(pdu);\r
61   index = (int)pdu->present;\r
62 \r
63   LOG_D("[E2AP] Unpacked E2AP-PDU: index = %d, procedureCode = %d\n",\r
64                             index, procedureCode);\r
65 \r
66   switch(procedureCode)\r
67     {\r
68       \r
69     case ProcedureCode_id_E2setup:\r
70       switch(index)\r
71         {\r
72         case E2AP_PDU_PR_initiatingMessage:\r
73           e2ap_handle_E2SetupRequest(pdu, socket_fd);     \r
74           LOG_I("[E2AP] Received SETUP-REQUEST");\r
75           break;\r
76           \r
77         case E2AP_PDU_PR_successfulOutcome:\r
78           LOG_I("[E2AP] Received SETUP-RESPONSE-SUCCESS");\r
79           break;\r
80           \r
81         case E2AP_PDU_PR_unsuccessfulOutcome:\r
82           LOG_I("[E2AP] Received SETUP-RESPONSE-FAILURE");\r
83           break;\r
84           \r
85         default:\r
86           LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU", index);\r
87           break;\r
88         }\r
89       break;    \r
90       \r
91     case ProcedureCode_id_Reset: //reset = 7\r
92       switch(index)\r
93         {\r
94         case E2AP_PDU_PR_initiatingMessage:\r
95           LOG_I("[E2AP] Received RESET-REQUEST");\r
96           break;\r
97           \r
98         case E2AP_PDU_PR_successfulOutcome:\r
99           break;\r
100           \r
101         case E2AP_PDU_PR_unsuccessfulOutcome:\r
102           break;\r
103           \r
104         default:\r
105           LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU", index);\r
106           break;\r
107         }\r
108       break;\r
109       \r
110     case ProcedureCode_id_RICsubscription: //RIC SUBSCRIPTION = 201\r
111       switch(index)\r
112         {\r
113         case E2AP_PDU_PR_initiatingMessage: //initiatingMessage\r
114           LOG_I("[E2AP] Received RIC-SUBSCRIPTION-REQUEST");\r
115           e2ap_handle_RICSubscriptionRequest(pdu, socket_fd);\r
116           //          e2ap_handle_RICSubscriptionRequest_securityDemo(pdu, socket_fd);\r
117           break;\r
118           \r
119         case E2AP_PDU_PR_successfulOutcome:\r
120           LOG_I("[E2AP] Received RIC-SUBSCRIPTION-RESPONSE");\r
121           break;\r
122           \r
123         case E2AP_PDU_PR_unsuccessfulOutcome:\r
124           LOG_I("[E2AP] Received RIC-SUBSCRIPTION-FAILURE");\r
125           break;\r
126           \r
127         default:\r
128           LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU", index);\r
129           break;\r
130         }\r
131       break;\r
132 \r
133     case ProcedureCode_id_RICindication: // 205\r
134       switch(index)\r
135         {\r
136         case E2AP_PDU_PR_initiatingMessage: //initiatingMessage\r
137           LOG_I("[E2AP] Received RIC-INDICATION-REQUEST");\r
138           // e2ap_handle_RICSubscriptionRequest(pdu, socket_fd);\r
139           break;\r
140         case E2AP_PDU_PR_successfulOutcome:\r
141           LOG_I("[E2AP] Received RIC-INDICATION-RESPONSE");\r
142           break;\r
143           \r
144         case E2AP_PDU_PR_unsuccessfulOutcome:\r
145           LOG_I("[E2AP] Received RIC-INDICATION-FAILURE");\r
146           break;\r
147           \r
148         default:\r
149           LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU %d", index,\r
150                                     (int)ProcedureCode_id_RICindication);\r
151           break;\r
152         }\r
153       break;\r
154       \r
155     default:\r
156       \r
157       LOG_E("[E2AP] No available handler for procedureCode=%d", procedureCode);\r
158 \r
159       break;\r
160     }\r
161 }\r
162 \r
163 void e2ap_handle_E2SetupRequest(E2AP_PDU_t* pdu, int &socket_fd) {\r
164 \r
165   \r
166   E2AP_PDU_t* res_pdu = (E2AP_PDU_t*)calloc(1, sizeof(E2AP_PDU));\r
167   generate_e2apv1_setup_response(res_pdu);\r
168 \r
169   \r
170   LOG_D("[E2AP] Created E2-SETUP-RESPONSE");\r
171 \r
172   e2ap_asn1c_print_pdu(res_pdu);\r
173 \r
174 \r
175   auto buffer_size = MAX_SCTP_BUFFER;\r
176   unsigned char buffer[MAX_SCTP_BUFFER];\r
177   \r
178   sctp_buffer_t data;\r
179   auto er = asn_encode_to_buffer(nullptr, ATS_BASIC_XER, &asn_DEF_E2AP_PDU, res_pdu, buffer, buffer_size);\r
180 \r
181   data.len = er.encoded;\r
182   fprintf(stderr, "er encoded is %d\n", er.encoded);  \r
183   \r
184   //data.len = e2ap_asn1c_encode_pdu(res_pdu, &buf);\r
185   memcpy(data.buffer, buffer, er.encoded);\r
186 \r
187   //send response data over sctp\r
188   if(sctp_send_data(socket_fd, data) > 0) {\r
189     LOG_I("[SCTP] Sent E2-SETUP-RESPONSE");\r
190   } else {\r
191     LOG_E("[SCTP] Unable to send E2-SETUP-RESPONSE to peer");\r
192   }\r
193 \r
194   sleep(5);\r
195 \r
196   //Sending Subscription Request\r
197 \r
198   E2AP_PDU_t* pdu_sub = (E2AP_PDU_t*)calloc(1,sizeof(E2AP_PDU));\r
199 \r
200   generate_e2apv1_subscription_request(pdu_sub);\r
201 \r
202   xer_fprint(stderr, &asn_DEF_E2AP_PDU, pdu_sub);\r
203 \r
204   auto buffer_size2 = MAX_SCTP_BUFFER;\r
205   unsigned char buffer2[MAX_SCTP_BUFFER];\r
206   \r
207   sctp_buffer_t data2;\r
208 \r
209   auto er2 = asn_encode_to_buffer(nullptr, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, pdu_sub, buffer2, buffer_size2);\r
210   \r
211   data2.len = er2.encoded;\r
212   memcpy(data2.buffer, buffer2, er2.encoded);\r
213   \r
214   fprintf(stderr, "er encded is %d\n", er2.encoded);\r
215 \r
216   if(sctp_send_data(socket_fd, data2) > 0) {\r
217     LOG_I("[SCTP] Sent E2-SUBSCRIPTION-REQUEST");\r
218   } else {\r
219     LOG_E("[SCTP] Unable to send E2-SUBSCRIPTION-REQUEST to peer");\r
220   }  \r
221 \r
222 \r
223 }\r
224 \r
225 \r
226 void e2ap_handle_RICSubscriptionRequest(E2AP_PDU_t* pdu, int &socket_fd)\r
227 {\r
228 \r
229   //Send back Subscription Success Response\r
230 \r
231   E2AP_PDU_t* pdu_resp = (E2AP_PDU_t*)calloc(1,sizeof(E2AP_PDU));\r
232 \r
233   generate_e2apv1_subscription_response(pdu_resp, pdu);\r
234 \r
235   fprintf(stderr, "Subscription Response\n");\r
236 \r
237   xer_fprint(stderr, &asn_DEF_E2AP_PDU, pdu_resp);\r
238 \r
239   auto buffer_size2 = MAX_SCTP_BUFFER;\r
240   unsigned char buffer2[MAX_SCTP_BUFFER];\r
241   \r
242   sctp_buffer_t data2;\r
243 \r
244   auto er2 = asn_encode_to_buffer(nullptr, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, pdu_resp, buffer2, buffer_size2);\r
245   data2.len = er2.encoded;\r
246 \r
247   fprintf(stderr, "er encded is %d\n", er2.encoded);\r
248 \r
249   memcpy(data2.buffer, buffer2, er2.encoded);\r
250 \r
251   if(sctp_send_data(socket_fd, data2) > 0) {\r
252     LOG_I("[SCTP] Sent RIC-SUBSCRIPTION-RESPONSE");\r
253   } else {\r
254     LOG_E("[SCTP] Unable to send RIC-SUBSCRIPTION-RESPONSE to peer");\r
255   }\r
256   \r
257   \r
258   //Send back an Indication\r
259 \r
260   E2AP_PDU_t* pdu_ind = (E2AP_PDU_t*)calloc(1,sizeof(E2AP_PDU));\r
261 \r
262   generate_e2apv1_indication_request(pdu_ind);\r
263 \r
264   xer_fprint(stderr, &asn_DEF_E2AP_PDU, pdu_ind);\r
265 \r
266   auto buffer_size = MAX_SCTP_BUFFER;\r
267   unsigned char buffer[MAX_SCTP_BUFFER];\r
268   \r
269   sctp_buffer_t data;\r
270 \r
271   auto er = asn_encode_to_buffer(nullptr, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, pdu_ind, buffer, buffer_size);\r
272   data.len = er.encoded;\r
273 \r
274   fprintf(stderr, "er encded is %d\n", er.encoded);\r
275 \r
276   memcpy(data.buffer, buffer, er.encoded);\r
277 \r
278   if(sctp_send_data(socket_fd, data) > 0) {\r
279     LOG_I("[SCTP] Sent RIC-INDICATION-REQUEST");\r
280   } else {\r
281     LOG_E("[SCTP] Unable to send RIC-INDICATION-REQUEST to peer");\r
282   }  \r
283 \r
284 }\r
285 \r
286 \r
287 \r
288 \r