blob: b93623f278e6ddafe598ecebe924a11883029623 [file] [log] [blame]
anjana_sreekumar@infosys.com991c2062020-01-08 11:42:57 +05301/*
2 * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
3 * Copyright (c) 2017 Intel Corporation
4 * Copyright (c) 2019, Infosys Ltd.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19#include <freeDiameter/freeDiameter-host.h>
20#include <freeDiameter/libfdcore.h>
21#include <freeDiameter/libfdproto.h>
22
23#include "log.h"
24#include "s6a.h"
25#include "s6a_fd.h"
26
27/**Globals and externs**/
28extern struct fd_dict_objects g_fd_dict_objs;
29extern struct fd_dict_data g_fd_dict_data;
30extern bool g_nolog;
31extern enum log_levels g_log_level;
32/**Globals and externs**/
33
34/**
35 * @brief Add element to freediameter message
36 * ready
37 * @param[in] val - AVP value to be added
38 * @param[in] obj - Disctionary object
39 * @param[in/out] msg_bufi
40 * @return int Sucess or failure code
41 */
42int
43add_fd_msg(union avp_value *val, struct dict_object * obj,
44 struct msg **msg_buf)
45{
46 struct avp *avp_val = NULL;
47
48 CHECK_FCT_DO(fd_msg_avp_new(obj, 0, &avp_val), return S6A_FD_ERROR);
49
50 CHECK_FCT_DO(fd_msg_avp_setvalue(avp_val, val), return S6A_FD_ERROR);
51
52 CHECK_FCT_DO(fd_msg_avp_add(*msg_buf, MSG_BRW_LAST_CHILD, avp_val),
53 return S6A_FD_ERROR);
54
55 return SUCCESS;
56}
57
58/**
59 * @brief Dumo freediameter message buffer
60 * ready
61 * @param[in] Freediameter message to print
62 * @return void
63 */
64void
65dump_fd_msg(struct msg *msg)
66{
67 //char *buf = NULL;
68 //int len = 0;
69
70 g_nolog = true;
71
72 if (g_nolog) return;
73
74 //TODO: correct - fprintf(stderr, "%s\n", fd_msg_dump_treeview(&buf, &len, NULL, msg,
75 // fd_g_config->cnf_dict, 0, 1));
76 //free(buf);
77}
78
79/**
80 * @brief Extract last integeger representing ue index from session ID
81 * @param[in] sid - session id
82 * @param[in] sidlen - session id len
83 * @return int - eror code
84 */
85int
86get_ue_idx_from_fd_resp(unsigned char *sid, int sidlen)
87{
88 int index = -1;
89 char *tmp = strrchr((char *)sid, ';');
90
91 index = strtol(++tmp, NULL, 10);
92 log_msg(LOG_INFO, "Received resp for index %d\n", index);
93 return index;
94}
95
96/**
97 * @brief Initialize free diameter vendor info
98 * @param None
99 * @return int - eror code
100 */
101int
102s6a_fd_init()
103{
104 //TODO: check vendor id
105 vendor_id_t vendor_id = 10415;
106
107 FD_DICT_SEARCH(DICT_VENDOR, VENDOR_BY_ID, &vendor_id, g_fd_dict_objs.vendor_id);
108
109 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.vendor_id, &g_fd_dict_data.vendor_data),
110 return S6A_FD_ERROR);
111
112 return SUCCESS;
113}
114
115/**
116 * @brief Initialize freediameter dictionary objects
117 * @param None
118 * @return int - error code
119 */
120int
121s6a_fd_objs_init()
122{
123 //TODO: Check app id
124 application_id_t app_s6a = 16777251;
125
126 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Result-Code",
127 g_fd_dict_objs.res_code);
128
129 FD_DICT_SEARCH(DICT_APPLICATION, APPLICATION_BY_ID, &app_s6a,
130 g_fd_dict_objs.s6a_app);
131
132 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Experimental-Result",
133 g_fd_dict_objs.exp_res);
134
135 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Auth-Application-Id",
136 g_fd_dict_objs.auth_app_id);
137
138 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Session-Id",
139 g_fd_dict_objs.sess_id);
140
141 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Auth-Session-State",
142 g_fd_dict_objs.auth_sess_state);
143
144 //NI Detach
145 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Origin-Host",
146 g_fd_dict_objs.org_host);
147
148 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Origin-Realm",
149 g_fd_dict_objs.org_realm);
150 //NI Detach
151
152 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Destination-Host",
153 g_fd_dict_objs.dest_host);
154
155 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Destination-Realm",
156 g_fd_dict_objs.dest_realm);
157
158 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "User-Name",
159 g_fd_dict_objs.user_name);
160
161 /*search and map avp names to elements*/
162 FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME,
163 "Authentication-Information-Request",
164 g_fd_dict_objs.AIR);
165
166 FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME,
167 "Authentication-Information-Answer",
168 g_fd_dict_objs.AIA);
169
170 FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Update-Location-Request",
171 g_fd_dict_objs.ULR);
172
173 FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Update-Location-Answer",
174 g_fd_dict_objs.ULA);
175
176 FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Purge-UE-Request",
177 g_fd_dict_objs.PUR);
178
179 FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Purge-UE-Answer",
180 g_fd_dict_objs.PUA);
181
182 //NI Detach
183 FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Cancel-Location-Request",
184 g_fd_dict_objs.CLR);
185
186 FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Cancel-Location-Answer",
187 g_fd_dict_objs.CLA);
188 //NI Detach
189
190
191 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Visited-PLMN-Id",
192 g_fd_dict_objs.visited_PLMN_id);
193
194 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
195 "Requested-EUTRAN-Authentication-Info",
196 g_fd_dict_objs.req_EUTRAN_auth_info);
197
198 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
199 "Number-Of-Requested-Vectors",
200 g_fd_dict_objs.no_of_req_vectors);
201
202 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
203 "Immediate-Response-Preferred",
204 g_fd_dict_objs.immediate_resp_pref);
205
206 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Authentication-Info",
207 g_fd_dict_objs.auth_info);
208
209 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "E-UTRAN-Vector",
210 g_fd_dict_objs.E_UTRAN_vector);
211
212 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RAND",
213 g_fd_dict_objs.RAND);
214
215 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "XRES",
216 g_fd_dict_objs.XRES);
217
218 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "AUTN",
219 g_fd_dict_objs.AUTN);
220
221 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "KASME",
222 g_fd_dict_objs.KASME);
223
224 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RAT-Type",
225 g_fd_dict_objs.RAT_type);
226
227 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "ULR-Flags",
228 g_fd_dict_objs.ULR_flags);
229
230 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "ULA-Flags",
231 g_fd_dict_objs.ULA_flags);
232
233 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscription-Data",
234 g_fd_dict_objs.subscription_data);
235
236 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscriber-Status",
237 g_fd_dict_objs.subscriber_status);
238
239 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "MSISDN",
240 g_fd_dict_objs.MSISDN);
241
242 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Network-Access-Mode",
243 g_fd_dict_objs.net_access_mode);
244
245 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
246 "Access-Restriction-Data",
247 g_fd_dict_objs.access_restriction_data);
248
249 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "AMBR",
250 g_fd_dict_objs.AMBR);
251
252 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
253 "Max-Requested-Bandwidth-UL",
254 g_fd_dict_objs.max_req_bandwidth_UL);
255
256 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
257 "Max-Requested-Bandwidth-DL",
258 g_fd_dict_objs.max_req_bandwidth_DL);
259
260 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
261 "APN-Configuration-Profile",
262 g_fd_dict_objs.APN_config_profile);
263
264 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Context-Identifier",
265 g_fd_dict_objs.ctx_id);
266
267 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
268 "Additional-Context-Identifier",
269 g_fd_dict_objs.additional_ctx_id);
270
271 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
272 "All-APN-Configurations-Included-Indicator",
273 g_fd_dict_objs.all_APN_configs_included_ind);
274
275 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Configuration",
276 g_fd_dict_objs.APN_config);
277
278 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PDN-Type",
279 g_fd_dict_objs.PDN_type);
280
281 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
282 "PDN-GW-Allocation-Type",
283 g_fd_dict_objs.PDN_GW_alloc_type);
284
285 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Specific-APN-Info",
286 g_fd_dict_objs.specific_APN_info);
287
288 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
289 "Non-IP-PDN-Type-Indicator",
290 g_fd_dict_objs.non_IP_PDN_type_ind);
291
292 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
293 "Non-IP-Data-Delivery-Mechanism",
294 g_fd_dict_objs.non_IP_data_delivery_mech);
295
296 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "SCEF-ID",
297 g_fd_dict_objs.SCEF_ID);
298
299 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Priority-Level",
300 g_fd_dict_objs.priority_Level);
301
302 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Location-Area-Identity",
303 g_fd_dict_objs.location_area_id);
304
305 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Tracking-Area-Identity",
306 g_fd_dict_objs.tracking_area_id);
307
308 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
309 "Subscribed-Periodic-RAU-TAU-Timer",
310 g_fd_dict_objs.subsc_periodic_RAU_TAU_tmr);
311
312 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PUR-Flags",
313 g_fd_dict_objs.PUR_flags);
314
315 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
316 "Regional-Subscription-Zone-Code",
317 g_fd_dict_objs.reg_subs_zone_code);
318 //NI Detach
319 FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
320 "Cancellation-Type",
321 g_fd_dict_objs.cancellation_type);
322 return SUCCESS;
323}
324
325/**
326 * @brief Initialize freediameter data objects for the dictionary object
327 * initialized
328 * @param None
329 * @return int - error code
330 */
331int
332s6a_fd_data_init()
333{
334 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.s6a_app,
335 &g_fd_dict_data.app_s6a_data), return S6A_FD_ERROR);
336
337 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.res_code,
338 &g_fd_dict_data.res_code), return S6A_FD_ERROR);
339
340 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.exp_res,
341 &g_fd_dict_data.exp_res), return S6A_FD_ERROR);
342
343 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.auth_app_id,
344 &g_fd_dict_data.auth_app_id),
345 return S6A_FD_ERROR);
346
347 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.sess_id,
348 &g_fd_dict_data.sess_id), return S6A_FD_ERROR);
349
350 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.auth_sess_state,
351 &g_fd_dict_data.auth_sess_state),
352 return S6A_FD_ERROR);
353 //NI Detach
354 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.org_host,
355 &g_fd_dict_data.org_host), return S6A_FD_ERROR);
356
357 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.org_realm,
358 &g_fd_dict_data.org_realm), return S6A_FD_ERROR);
359 //NI Detach
360
361 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.dest_host,
362 &g_fd_dict_data.dest_host), return S6A_FD_ERROR);
363
364 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.dest_realm,
365 &g_fd_dict_data.dest_realm), return S6A_FD_ERROR);
366
367 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.user_name,
368 &g_fd_dict_data.user_name), return S6A_FD_ERROR);
369
370 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.visited_PLMN_id,
371 &g_fd_dict_data.visited_PLMN_id),
372 return S6A_FD_ERROR);
373
374 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.req_EUTRAN_auth_info,
375 &g_fd_dict_data.req_EUTRAN_auth_info),
376 return S6A_FD_ERROR);
377
378 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.no_of_req_vectors,
379 &g_fd_dict_data.no_of_req_vectors),
380 return S6A_FD_ERROR);
381
382 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.immediate_resp_pref,
383 &g_fd_dict_data.immediate_resp_pref),
384 return S6A_FD_ERROR);
385
386 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.auth_info,
387 &g_fd_dict_data.auth_info),
388 return S6A_FD_ERROR);
389
390 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.E_UTRAN_vector,
391 &g_fd_dict_data.E_UTRAN_vector),
392 return S6A_FD_ERROR);
393
394 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.RAND,
395 &g_fd_dict_data.RAND),
396 return S6A_FD_ERROR);
397
398 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.XRES,
399 &g_fd_dict_data.XRES),
400 return S6A_FD_ERROR);
401
402 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.AUTN,
403 &g_fd_dict_data.AUTN),
404 return S6A_FD_ERROR);
405
406 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.KASME,
407 &g_fd_dict_data.KASME),
408 return S6A_FD_ERROR);
409
410 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.RAT_type,
411 &g_fd_dict_data.RAT_type),
412 return S6A_FD_ERROR);
413
414 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.ULR_flags,
415 &g_fd_dict_data.ULR_flags),
416 return S6A_FD_ERROR);
417
418 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.ULA_flags,
419 &g_fd_dict_data.ULA_flags),
420 return S6A_FD_ERROR);
421
422 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.subscription_data,
423 &g_fd_dict_data.subscription_data),
424 return S6A_FD_ERROR);
425
426 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.subscriber_status,
427 &g_fd_dict_data.subscriber_status),
428 return S6A_FD_ERROR);
429
430 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.MSISDN,
431 &g_fd_dict_data.MSISDN),
432 return S6A_FD_ERROR);
433
434 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.net_access_mode,
435 &g_fd_dict_data.net_access_mode),
436 return S6A_FD_ERROR);
437
438 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.access_restriction_data,
439 &g_fd_dict_data.access_restriction_data),
440 return S6A_FD_ERROR);
441
442 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.AMBR,
443 &g_fd_dict_data.AMBR),
444 return S6A_FD_ERROR);
445
446 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.max_req_bandwidth_UL,
447 &g_fd_dict_data.max_req_bandwidth_UL),
448 return S6A_FD_ERROR);
449
450 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.max_req_bandwidth_DL,
451 &g_fd_dict_data.max_req_bandwidth_DL),
452 return S6A_FD_ERROR);
453
454 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.APN_config_profile,
455 &g_fd_dict_data.APN_config_profile),
456 return S6A_FD_ERROR);
457
458 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.ctx_id,
459 &g_fd_dict_data.ctx_id),
460 return S6A_FD_ERROR);
461
462 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.additional_ctx_id,
463 &g_fd_dict_data.additional_ctx_id),
464 return S6A_FD_ERROR);
465
466 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.all_APN_configs_included_ind,
467 &g_fd_dict_data.all_APN_configs_included_ind),
468 return S6A_FD_ERROR);
469
470 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.APN_config,
471 &g_fd_dict_data.APN_config),
472 return S6A_FD_ERROR);
473
474 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.PDN_type,
475 &g_fd_dict_data.PDN_type),
476 return S6A_FD_ERROR);
477
478 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.PDN_GW_alloc_type,
479 &g_fd_dict_data.PDN_GW_alloc_type),
480 return S6A_FD_ERROR);
481
482 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.specific_APN_info,
483 &g_fd_dict_data.specific_APN_info),
484 return S6A_FD_ERROR);
485
486 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.non_IP_PDN_type_ind,
487 &g_fd_dict_data.non_IP_PDN_type_ind),
488 return S6A_FD_ERROR);
489
490 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.non_IP_data_delivery_mech,
491 &g_fd_dict_data.non_IP_data_delivery_mech),
492 return S6A_FD_ERROR);
493
494 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.SCEF_ID,
495 &g_fd_dict_data.SCEF_ID),
496 return S6A_FD_ERROR);
497
498 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.priority_Level,
499 &g_fd_dict_data.priority_Level),
500 return S6A_FD_ERROR);
501
502 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.location_area_id,
503 &g_fd_dict_data.location_area_id),
504 return S6A_FD_ERROR);
505
506 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.tracking_area_id,
507 &g_fd_dict_data.tracking_area_id),
508 return S6A_FD_ERROR);
509
510 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.subsc_periodic_RAU_TAU_tmr,
511 &g_fd_dict_data.subsc_periodic_RAU_TAU_tmr),
512 return S6A_FD_ERROR);
513
514 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.PUR_flags,
515 &g_fd_dict_data.PUR_flags),
516 return S6A_FD_ERROR);
517
518 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.reg_subs_zone_code,
519 &g_fd_dict_data.reg_subs_zone_code),
520 return S6A_FD_ERROR);
521
522 CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.cancellation_type,
523 &g_fd_dict_data.cancellation_type),
524 return S6A_FD_ERROR);
525 return SUCCESS;
526}
527
528int
529s6a_fd_cb_reg(void)
530{
531 log_msg(LOG_INFO, "ANJANA s6a_fd_cb_reg.\n");
532
533 struct disp_when data;
534
535 memset(&data, 0, sizeof(data));
536 data.app = g_fd_dict_objs.s6a_app;
537
538 /* Register resp callbacks */
539 data.command = g_fd_dict_objs.AIA;
540 CHECK_FCT_DO(fd_disp_register(aia_resp_callback, DISP_HOW_CC, &data,
541 NULL, NULL),
542 return S6A_FD_ERROR);
543
544 data.command = g_fd_dict_objs.ULA;
545 CHECK_FCT_DO(fd_disp_register(ula_resp_callback, DISP_HOW_CC, &data,
546 NULL, NULL),
547 return S6A_FD_ERROR);
548
549#if 0
550 data.command = g_fd_dict_objs.PUA;
551 CHECK_FCT_DO(fd_disp_register(purge_resp_callback, DISP_HOW_CC, &data,
552 NULL, NULL),
553 return S6A_FD_ERROR);
554#endif
555 //NI Detach
556 data.command = g_fd_dict_objs.CLR;
557 CHECK_FCT_DO(fd_disp_register(clr_resp_callback, DISP_HOW_CC, &data,
558 NULL, NULL),
559 return S6A_FD_ERROR);
560
561 //NI Detach
562
563 CHECK_FCT_DO(fd_disp_app_support(g_fd_dict_objs.s6a_app,
564 g_fd_dict_objs.vendor_id, 1, 0),
565 return S6A_FD_ERROR);
566
567 return SUCCESS;
568}
569
570/**
571 * @brief Create session ID for every HSS request. Append UE ID to session ID
572 * initialized
573 * @param [out] session ID created
574 * @param [in] UE index to append to session ID
575 * @return int - error code
576 */
577short
578create_fd_sess_id(struct s6a_sess_info *s6a_sess,
579 int ue_idx)
580{
581 struct session *sess = NULL;
582 unsigned char *sess_id;
583 size_t sess_id_len;
584 char idx[10] = {0};
585
586 /* clear the session id if exists */
587 if (s6a_sess->sess_id_len > 0) {
588 int exist = false;
589 CHECK_FCT_DO(fd_sess_fromsid((unsigned char*)s6a_sess->sess_id,
590 s6a_sess->sess_id_len, &sess, &exist),
591 return S6A_FD_ERROR);
592
593 if (exist == 0) {
594 CHECK_FCT_DO(fd_sess_destroy(&sess), return S6A_FD_ERROR);
595 sess = NULL;
596 }
597 }
598
599 sprintf(idx, "%d", ue_idx);
600 if (sess == NULL) {
601 CHECK_FCT_DO(fd_sess_new(&sess, fd_g_config->cnf_diamid,
602 fd_g_config->cnf_diamid_len, (unsigned char*)idx, strlen(idx)),
603 return S6A_FD_ERROR);
604 }
605 CHECK_FCT_DO(fd_sess_getsid(sess, &sess_id, &sess_id_len),
606 return S6A_FD_ERROR);
607
608 s6a_sess->sess_id_len = (unsigned char)sess_id_len;
609 memcpy(s6a_sess->sess_id, sess_id, s6a_sess->sess_id_len);
610 s6a_sess->sess_id[s6a_sess->sess_id_len] = '\0';
611
612 return SUCCESS;
613}
614
615/**
616 * @brief Parse AVP received in freediameter response
617 * initialized
618 * @param [in]avp - AVP value receivned
619 * @param [out] result value parserd out of avp
620 * @return int - error code
621 */
622short
623parse_fd_result(struct avp *avp, struct fd_result *res)
624{
625 struct avp_hdr *hdr;
626 struct avp *child_avp = NULL;
627
628 CHECK_FCT_DO(fd_msg_avp_hdr(avp, &hdr), return S6A_FD_ERROR);
629 if (hdr->avp_code != g_fd_dict_data.exp_res.avp_code)
630 return S6A_FD_ERROR;
631
632 CHECK_FCT_DO(fd_msg_browse(avp, MSG_BRW_FIRST_CHILD, &child_avp, NULL),
633 return S6A_FD_ERROR);
634
635 while (child_avp) {
636 fd_msg_avp_hdr (child_avp, &hdr);
637
638 if (hdr->avp_code ==
639 g_fd_dict_data.exp_res_code.avp_code) {
640 res->result_code = hdr->avp_value->u32;
641 res->present = true;
642 } else if (hdr->avp_code == g_fd_dict_data.vendor_id.avp_code) {
643 res->vendor_id = hdr->avp_value->u32;
644 }
645
646 CHECK_FCT_DO(fd_msg_browse(child_avp, MSG_BRW_NEXT, &child_avp,
647 NULL),
648 return S6A_FD_ERROR);
649 }
650
651 return SUCCESS;
652}
653
654
655
656