blob: 2bc716ae01d84f04db1b87c4f92d8a9f01118b90 [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 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#ifndef __S6A_FD_H__
19#define __S6A_FD_H__
20
21#include <stdlib.h>
22#include <string.h>
23#include <ctype.h>
24#include <stdio.h>
25#include <stdbool.h>
26#include <ctype.h>
27#include <freeDiameter/freeDiameter-host.h>
28#include <freeDiameter/libfdproto.h>
29#include <freeDiameter/libfdcore.h>
30
31#include "err_codes.h"
32#include "s6a.h"
33
34/*Update location request(ULR) flag bitfields*/
35/* Single-Registration-Indication -------1*/
36#define ULR_FLAG_SINGLE_REG_IND (1)
37/*S6a/S6d-Indicator: ------1-*/
38#define ULR_FLAG_S6AS6D_IND (1<<1)
39/*Skip-Subscriber-Data: -----1--*/
40#define ULR_FLAGS_SKIP_SUB_DATA (1<<2)
41/*GPRS-Subscription-Data-Indicator:----1---*/
42#define ULR_FLAGS_GPRS_SUBS_DATA_IBND (1<<3)
43/*Node-Type-Indicator: ---1----*/
44#define ULR_FLAGS_NODE_TYPE_IIND (1<<4)
45/*Initial-Attach-Indicator: --1-----*/
46#define ULR_FLAG_INIT_ATCH_IND (1<<5)
47/*PS-LCS-Not-Supported-By-UE: -1------*/
48#define ULR_FLAG_PS_LCS_NOT_SUPPORTED_BY_UE (1<<6)
49/*SMS-Only-Indication: 1-------*/
50#define ULR_FLAG_SMS_ONLY_IND (1<<7)
51
52#define S6A_RAT_EUTRAN 1004
53
54#define FD_DICT_SEARCH(dict, cond, id, obj) \
55 CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, dict, cond,\
56 (void*)id, &obj, ENOENT),\
57 return S6A_FD_DICTSRCH_FAILED)
58
59/**
60 * @brief Freediameter result
61 */
62struct fd_result {
63 bool present;
64 unsigned int vendor_id;
65 unsigned int result_code;
66};
67
68/**
69 * @brief Freediameter disctionary objects user in s6a transactions
70 */
71struct fd_dict_objects {
72 /*s6a and app id*/
73 struct dict_object *vendor_id;
74 struct dict_object *s6a_app;
75
76 /*Message types*/
77 struct dict_object *AIR; /*Authentication-Information-Request*/
78 struct dict_object *AIA; /*Authentication-information-Answer*/
79 struct dict_object *ULR; /*Update-Location-Request*/
80 struct dict_object *ULA; /*Update-Location-Answer*/
81 struct dict_object *PUR; /*Purge-Request*/
82 struct dict_object *PUA; /*Purge-Answer*/
83 //NI Detach
84 struct dict_object *CLR; /*Cancel-Location-Request*/
85 struct dict_object *CLA; /*Cancel-Location-Answer*/
86 //NI Detach
87
88 /*common s6a requst header*/
89 struct dict_object *auth_app_id;
90 struct dict_object *sess_id;
91 struct dict_object *org_host; //NI Detach
92 struct dict_object *org_realm; //NI Detach
93 struct dict_object *dest_host;
94 struct dict_object *dest_realm;
95 struct dict_object *auth_sess_state;
96 struct dict_object *res_code;
97 struct dict_object *exp_res;
98 struct dict_object *user_name;
99
100 /*AIR elements*/
101 struct dict_object *visited_PLMN_id;
102 struct dict_object *req_EUTRAN_auth_info;
103 struct dict_object *no_of_req_vectors;
104 struct dict_object *immediate_resp_pref;
105
106 /*AIA elements*/
107 struct dict_object *auth_info;
108 struct dict_object *E_UTRAN_vector;
109 struct dict_object *RAND;
110 struct dict_object *XRES;
111 struct dict_object *AUTN;
112 struct dict_object *KASME;
113
114 /*ULR elements*/
115 struct dict_object *RAT_type;
116 struct dict_object *ULR_flags;
117
118 /*ULA elements*/
119 struct dict_object *ULA_flags;
120 struct dict_object *subscription_data;
121 struct dict_object *subscriber_status;
122 struct dict_object *MSISDN;
123 struct dict_object *net_access_mode;
124 struct dict_object *access_restriction_data;
125 struct dict_object *AMBR;
126 struct dict_object *max_req_bandwidth_UL;
127 struct dict_object *max_req_bandwidth_DL;
128 struct dict_object *APN_config_profile;
129 struct dict_object *ctx_id;
130 struct dict_object *additional_ctx_id;
131 struct dict_object *all_APN_configs_included_ind;
132 struct dict_object *APN_config;
133 struct dict_object *PDN_type;
134 struct dict_object *PDN_GW_alloc_type;
135 struct dict_object *specific_APN_info;
136 struct dict_object *non_IP_PDN_type_ind;
137 struct dict_object *non_IP_data_delivery_mech;
138 struct dict_object *SCEF_ID;
139 struct dict_object *priority_Level;
140 struct dict_object *location_area_id;
141 struct dict_object *tracking_area_id;
142 struct dict_object *subsc_periodic_RAU_TAU_tmr;
143
144 /*PUR elements*/
145 struct dict_object *PUR_flags;
146 struct dict_object *reg_subs_zone_code;
147
148 //NI Detach
149 /*CLR elements*/
150 struct dict_object *cancellation_type;
151};
152
153/**
154 * @brief Freediameter dictionary data storage
155 */
156struct fd_dict_data {
157 /* S6A AVP data */
158 struct dict_application_data app_s6a_data;
159 struct dict_vendor_data vendor_data;
160
161 /*Common s6a elements*/
162 struct dict_avp_data res_code;
163 struct dict_avp_data exp_res;
164 struct dict_avp_data exp_res_code;
165 struct dict_avp_data vendor_specific_app_id;
166 struct dict_avp_data auth_app_id;
167 struct dict_avp_data acct_app_id;
168 struct dict_avp_data vendor_id;
169 struct dict_avp_data sess_id;
170 struct dict_avp_data auth_sess_state;
171 struct dict_avp_data org_host;
172 struct dict_avp_data org_realm;
173 struct dict_avp_data dest_host;
174 struct dict_avp_data dest_realm;
175 struct dict_avp_data user_name;
176 struct dict_avp_data visited_PLMN_id;
177 struct dict_avp_data req_EUTRAN_auth_info;
178 struct dict_avp_data no_of_req_vectors;
179 struct dict_avp_data immediate_resp_pref;
180
181 /*AIA data*/
182 struct dict_avp_data auth_info;
183 struct dict_avp_data E_UTRAN_vector;
184 struct dict_avp_data RAND;
185 struct dict_avp_data XRES;
186 struct dict_avp_data AUTN;
187 struct dict_avp_data KASME;
188
189 /*ULR data*/
190 struct dict_avp_data RAT_type;
191 struct dict_avp_data ULR_flags;
192
193 /*ULA data*/
194 struct dict_avp_data ULA_flags;
195 struct dict_avp_data subscription_data;
196 struct dict_avp_data subscriber_status;
197 struct dict_avp_data MSISDN;
198 struct dict_avp_data net_access_mode;
199 struct dict_avp_data access_restriction_data;
200 struct dict_avp_data AMBR;
201 struct dict_avp_data max_req_bandwidth_UL;
202 struct dict_avp_data max_req_bandwidth_DL;
203 struct dict_avp_data APN_config_profile;
204 struct dict_avp_data ctx_id;
205 struct dict_avp_data additional_ctx_id;
206 struct dict_avp_data all_APN_configs_included_ind;
207 struct dict_avp_data APN_config;
208 struct dict_avp_data PDN_type;
209 struct dict_avp_data PDN_GW_alloc_type;
210 struct dict_avp_data specific_APN_info;
211 struct dict_avp_data non_IP_PDN_type_ind;
212 struct dict_avp_data non_IP_data_delivery_mech;
213 struct dict_avp_data SCEF_ID;
214 struct dict_avp_data priority_Level;
215 struct dict_avp_data location_area_id;
216 struct dict_avp_data tracking_area_id;
217 struct dict_avp_data subsc_periodic_RAU_TAU_tmr;
218
219 /*PUR flags*/
220 struct dict_avp_data PUR_flags;
221 struct dict_avp_data reg_subs_zone_code;
222
223 //NI Detach
224 /*CLR Data*/
225 struct dict_avp_data cancellation_type;
226};
227
228/**
229 * @brief Initialize freediameter parser, callbacks, dictionary etc.
230 * @params none
231 * @return int as success/fail
232 */
233int
234s6a_fd_init();
235
236/**
237 * @brief Initialize freediameter dictionary
238 * @param none
239 * @return int as success/fail
240 */
241int
242s6a_fd_objs_init();
243
244/**
245 * @brief Initialize freediameter dictionary data objects
246 * @param none
247 * @return int as success/fail
248 */
249int
250s6a_fd_data_init();
251
252/**
253 * @brief Initialize freediameter API callbacks for response handling
254 * @param none
255 * @return int as success/fail
256 */
257int
258s6a_fd_cb_reg();
259
260/**
261 * @brief extract ue index from session id of freediameter
262 * @param[in] sid - session id
263 * @param[in] sidlen - Session Id length
264 * @return UE index extracted out of session id
265 */
266int
267get_ue_idx_from_fd_resp(unsigned char *sid, int sidlen);
268
269/**
270 * @brief Cression session id, append ue index to session id
271 * @param[in, out] s6a_sess - session information
272 * @param[in] ue_idx to append to session id
273 * @return int as success/fail
274 */
275short
276create_fd_sess_id(struct s6a_sess_info *s6a_sess, int ue_idx);
277
278int
279aia_resp_callback(struct msg **msg, struct avp *avp, struct session *sess,
280 void *data, enum disp_action *act);
281
282int
283ula_resp_callback(struct msg **msg, struct avp *avp, struct session *sess,
284 void *data, enum disp_action *act);
285
286//NI Detach
287int
288clr_resp_callback(struct msg **msg, struct avp *avp, struct session *sess,
289 void *data, enum disp_action *act);
290
291
292#if 0
293int
294purge_resp_callback(struct msg **msg, struct avp *avp, struct session *sess,
295 void *data, enum disp_action *act);
296#endif
297
298/**
299 * @brief Dumo freediameter message on console
300 * @param msg - Freediameter message structure
301 * @return void
302 */
303void
304dump_fd_msg(struct msg *msg);
305
306/**
307 * brief add AVl object to freediameter message
308 * @param[in] avp value to add
309 * @param[in] ditionary object for reference
310 * @param[out] frediameter message where avp is added
311 * @return int as success/fail
312 */
313int
314add_fd_msg(union avp_value *val, struct dict_object * obj,
315struct msg **msg_buf);
316
317void
318handle_perf_hss_aia(int ue_idx, struct hss_aia_msg *aia);
319
320void
321handle_perf_hss_ula(int ue_idx, struct hss_ula_msg *ula);
322
323void
324handle_perf_hss_purge_resp(int ue_idx);
325
326//NI Detach
327void
328handle_perf_hss_clr(int ue_idx, struct hss_clr_msg *clr);
329
330short
331parse_fd_result(struct avp *avp, struct fd_result *res);
332
333#endif /* __S6A_FD_H__ */