diff --git a/src/modules/ims_ocs/ims_ocs_mod.c b/src/modules/ims_ocs/ims_ocs_mod.c index 65052990240..7ba2d935a5e 100644 --- a/src/modules/ims_ocs/ims_ocs_mod.c +++ b/src/modules/ims_ocs/ims_ocs_mod.c @@ -30,7 +30,7 @@ MODULE_VERSION -extern gen_lock_t* process_lock; /* lock on the process table */ +extern gen_lock_t *process_lock; /* lock on the process table */ struct cdp_binds cdpb; @@ -41,7 +41,7 @@ static int mod_init(void); static int mod_child_init(int); static void mod_destroy(void); -int * callback_singleton; /*< Callback singleton */ +int *callback_singleton; /*< Callback singleton */ int result_code = 0; int granted_units = 0; @@ -50,63 +50,58 @@ int final_unit = 0; int event_route_ccr_orig = 0; int event_route_ccr_term = 0; -static int w_ccr_result(struct sip_msg *msg, char* result, char* grantedunits, char* final); +static int w_ccr_result( + struct sip_msg *msg, char *result, char *grantedunits, char *final); -static cmd_export_t cmds[] = { - {"ccr_result", (cmd_function)w_ccr_result, 3, fixup_var_pve_str_12, 0, REQUEST_ROUTE}, - { 0, 0, 0, 0, 0, 0} -}; +static cmd_export_t cmds[] = {{"ccr_result", (cmd_function)w_ccr_result, 3, + fixup_var_pve_str_12, 0, REQUEST_ROUTE}, + {0, 0, 0, 0, 0, 0}}; -static param_export_t params[] = { - { 0, 0, 0} -}; +static param_export_t params[] = {{0, 0, 0}}; /** module exports */ -struct module_exports exports = { - "ims_ocs", - DEFAULT_DLFLAGS, /* dlopen flags */ - cmds, /* Exported functions */ - params, - 0, /* exported RPC methods */ - 0, /* exported pseudo-variables */ - 0, /* response handling function */ - mod_init, /* module initialization function */ - mod_child_init, /* per-child init function */ - mod_destroy -}; +struct module_exports exports = {"ims_ocs", DEFAULT_DLFLAGS, /* dlopen flags */ + cmds, /* Exported functions */ + params, 0, /* exported RPC methods */ + 0, /* exported pseudo-variables */ + 0, /* response handling function */ + mod_init, /* module initialization function */ + mod_child_init, /* per-child init function */ + mod_destroy}; /** * init module function */ -static int mod_init(void) { +static int mod_init(void) +{ LM_DBG("Loading...\n"); event_route_ccr_orig = route_get(&event_rt, "ocs:ccr-orig"); - if (event_route_ccr_orig < 0) { + if(event_route_ccr_orig < 0) { LM_ERR("No ocs:ccr-orig event route found\n"); goto error; } LM_DBG("Found Route ocs:ccr-orig: %i\n", event_route_ccr_orig); event_route_ccr_term = route_get(&event_rt, "ocs:ccr-term"); - if (event_route_ccr_term < 0) { + if(event_route_ccr_term < 0) { LM_INFO("No ocs:ccr-term event route found\n"); } LM_DBG("Found Route ocs:ccr-term: %i\n", event_route_ccr_term); - callback_singleton = shm_malloc(sizeof (int)); + callback_singleton = shm_malloc(sizeof(int)); *callback_singleton = 0; cdp_avp = 0; /* load the CDP API */ - if (load_cdp_api(&cdpb) != 0) { + if(load_cdp_api(&cdpb) != 0) { LM_ERR("can't load CDP API\n"); - goto error; - } + goto error; + } cdp_avp = load_cdp_avp(); - if (!cdp_avp) { + if(!cdp_avp) { LM_ERR("can't load CDP_AVP API\n"); goto error; } @@ -120,61 +115,71 @@ static int mod_init(void) { /** * Initializes the module in child. */ -static int mod_child_init(int rank) { - LM_DBG("Initialization of module in child [%d] \n", rank); - - /* don't do anything for main process and TCP manager process */ - if (rank == PROC_MAIN || rank == PROC_TCP_MAIN) { - return 0; - } - - lock_get(process_lock); - if ((*callback_singleton) == 0) { - *callback_singleton = 1; - cdpb.AAAAddRequestHandler(callback_cdp_request, NULL); - } - lock_release(process_lock); - - return 0; -} +static int mod_child_init(int rank) +{ + LM_DBG("Initialization of module in child [%d] \n", rank); + + /* don't do anything for main process and TCP manager process */ + if(rank == PROC_MAIN || rank == PROC_TCP_MAIN) { + return 0; + } + + lock_get(process_lock); + if((*callback_singleton) == 0) { + *callback_singleton = 1; + cdpb.AAAAddRequestHandler(callback_cdp_request, NULL); + } + lock_release(process_lock); + return 0; +} -static void mod_destroy(void) { +static void mod_destroy(void) +{ } -static int w_ccr_result(struct sip_msg *msg, char* result, char* grantedunits, char* final) { +static int w_ccr_result( + struct sip_msg *msg, char *result, char *grantedunits, char *final) +{ str s_result_code, s_granted_units, s_final_unit; - if (get_str_fparam(&s_result_code, msg, (fparam_t*)result) < 0) { - LM_ERR("failed to get Result\n"); - return -1; + if(get_str_fparam(&s_result_code, msg, (fparam_t *)result) < 0) { + LM_ERR("failed to get Result\n"); + return -1; } - if (str2sint(&s_result_code, &result_code) != 0) { - LM_DBG("Invalid result-code (%.*s)\n", s_result_code.len, s_result_code.s); + if(str2sint(&s_result_code, &result_code) != 0) { + LM_DBG("Invalid result-code (%.*s)\n", s_result_code.len, + s_result_code.s); } - LM_DBG("Got result: %i (%.*s)\n", result_code, s_result_code.len, s_result_code.s); + LM_DBG("Got result: %i (%.*s)\n", result_code, s_result_code.len, + s_result_code.s); - if (get_str_fparam(&s_granted_units, msg, (fparam_t*)grantedunits) < 0) { - LM_ERR("failed to get Granted Units\n"); - return -1; + if(get_str_fparam(&s_granted_units, msg, (fparam_t *)grantedunits) < 0) { + LM_ERR("failed to get Granted Units\n"); + return -1; } - if (str2sint(&s_granted_units, &granted_units) != 0) { - LM_DBG("Invalid Granted Units (%.*s)\n", s_granted_units.len, s_granted_units.s); + if(str2sint(&s_granted_units, &granted_units) != 0) { + LM_DBG("Invalid Granted Units (%.*s)\n", s_granted_units.len, + s_granted_units.s); } - LM_DBG("Got Granted Units: %i, %.*s\n", granted_units, s_granted_units.len, s_granted_units.s); + LM_DBG("Got Granted Units: %i, %.*s\n", granted_units, s_granted_units.len, + s_granted_units.s); - if (get_str_fparam(&s_final_unit, msg, (fparam_t*)final) < 0) { - LM_ERR("failed to get Final Unit\n"); - return -1; + if(get_str_fparam(&s_final_unit, msg, (fparam_t *) final) < 0) { + LM_ERR("failed to get Final Unit\n"); + return -1; } - if (str2sint(&s_final_unit, &final_unit) != 0) { - LM_DBG("Invalid Granted Units (%.*s)\n", s_final_unit.len, s_final_unit.s); + if(str2sint(&s_final_unit, &final_unit) != 0) { + LM_DBG("Invalid Granted Units (%.*s)\n", s_final_unit.len, + s_final_unit.s); } - LM_DBG("Got Final Unit: %i, %.*s\n", final_unit, s_final_unit.len, s_final_unit.s); + LM_DBG("Got Final Unit: %i, %.*s\n", final_unit, s_final_unit.len, + s_final_unit.s); return 1; } -AAAMessage* process_ccr(AAAMessage *ccr) { +AAAMessage *process_ccr(AAAMessage *ccr) +{ int backup_rt; struct run_act_ctx ctx; struct sip_msg *msg; @@ -185,32 +190,33 @@ AAAMessage* process_ccr(AAAMessage *ccr) { LM_DBG("Processing CCR"); - if ((isOrig(ccr) != 0) && (event_route_ccr_term < 0)) { + if((isOrig(ccr) != 0) && (event_route_ccr_term < 0)) { result_code = DIAMETER_SUCCESS; granted_units = 3600; final_unit = 0; } else { - if (faked_aaa_msg(ccr, &msg) != 0) { + if(faked_aaa_msg(ccr, &msg) != 0) { LM_ERR("Failed to build Fake-Message\n"); } backup_rt = get_route_type(); set_route_type(REQUEST_ROUTE); init_run_actions_ctx(&ctx); - if (isOrig(ccr) != 0) { + if(isOrig(ccr) != 0) { run_top_route(event_rt.rlist[event_route_ccr_term], msg, 0); } else { run_top_route(event_rt.rlist[event_route_ccr_orig], msg, 0); } - + set_route_type(backup_rt); free_sip_msg(msg); } - LM_DBG("Result-Code is %i, Granted Units %i (Final: %i)\n", result_code, granted_units, final_unit); + LM_DBG("Result-Code is %i, Granted Units %i (Final: %i)\n", result_code, + granted_units, final_unit); - if (result_code == 0) { + if(result_code == 0) { LM_ERR("event_route did not set Result-Code, aborting\n"); result_code = DIAMETER_UNABLE_TO_COMPLY; granted_units = 0; @@ -219,11 +225,12 @@ AAAMessage* process_ccr(AAAMessage *ccr) { AAAMessage *cca; cca = cdpb.AAACreateResponse(ccr); - if (!cca) return 0; + if(!cca) + return 0; ocs_build_answer(ccr, cca, result_code, granted_units, final_unit); - return cca; + return cca; } /** @@ -232,27 +239,33 @@ AAAMessage* process_ccr(AAAMessage *ccr) { * @param param - generic pointer * @returns the answer to this request */ -AAAMessage* callback_cdp_request(AAAMessage *request, void *param) { - if (is_req(request)) { - - switch (request->applicationId) { - case IMS_Ro: - switch (request->commandCode) { - case IMS_CCR: - return process_ccr(request); - break; - default: - LM_ERR("Ro request handler(): - Received unknown request for Ro command %d, flags %#1x endtoend %u hopbyhop %u\n", request->commandCode, request->flags, request->endtoendId, request->hopbyhopId); - return 0; - break; - } - break; - default: - LM_ERR("Ro request handler(): - Received unknown request for app %d command %d\n", request->applicationId, request->commandCode); - return 0; - break; - } - } - return 0; +AAAMessage *callback_cdp_request(AAAMessage *request, void *param) +{ + if(is_req(request)) { + + switch(request->applicationId) { + case IMS_Ro: + switch(request->commandCode) { + case IMS_CCR: + return process_ccr(request); + break; + default: + LM_ERR("Ro request handler(): - Received unknown " + "request for Ro command %d, flags %#1x endtoend " + "%u hopbyhop %u\n", + request->commandCode, request->flags, + request->endtoendId, request->hopbyhopId); + return 0; + break; + } + break; + default: + LM_ERR("Ro request handler(): - Received unknown request for " + "app %d command %d\n", + request->applicationId, request->commandCode); + return 0; + break; + } + } + return 0; } - diff --git a/src/modules/ims_ocs/ims_ocs_mod.h b/src/modules/ims_ocs/ims_ocs_mod.h index cfddfdccc90..1f7eedc2dc9 100644 --- a/src/modules/ims_ocs/ims_ocs_mod.h +++ b/src/modules/ims_ocs/ims_ocs_mod.h @@ -22,7 +22,7 @@ #ifndef IMS_OCS_MOD_H -#define IMS_OCS_MOD_H +#define IMS_OCS_MOD_H /** callback functions */ @@ -31,7 +31,6 @@ extern cdp_avp_bind_t *cdp_avp; struct AAAMessage; -AAAMessage* callback_cdp_request(AAAMessage *request, void *param); - -#endif /* IMS_OCS_MOD_H */ +AAAMessage *callback_cdp_request(AAAMessage *request, void *param); +#endif /* IMS_OCS_MOD_H */ diff --git a/src/modules/ims_ocs/msg_faker.c b/src/modules/ims_ocs/msg_faker.c index eb917046e18..95edbcd4ed0 100644 --- a/src/modules/ims_ocs/msg_faker.c +++ b/src/modules/ims_ocs/msg_faker.c @@ -30,26 +30,32 @@ #include -#define FAKED_SIP_SESSION_FORMAT "%.*s %.*s SIP/2.0\r\nVia: SIP/2.0/UDP 127.0.0.1\r\nFrom: %.*s%.*s\r\nTo: %.*s;tag=xyz\r\nCall-ID: %.*s\r\nCSeq: 1 %.*s\r\nContent-Length: 0\r\nP-Requested-Units: %i\r\nP-Used-Units: %i\r\nP-Access-Network-Info: %.*s\r\nP-Service-Identifier: %i\r\n\r\n" +#define FAKED_SIP_SESSION_FORMAT \ + "%.*s %.*s SIP/2.0\r\nVia: SIP/2.0/UDP 127.0.0.1\r\nFrom: " \ + "%.*s%.*s\r\nTo: %.*s;tag=xyz\r\nCall-ID: %.*s\r\nCSeq: 1 " \ + "%.*s\r\nContent-Length: 0\r\nP-Requested-Units: %i\r\nP-Used-Units: " \ + "%i\r\nP-Access-Network-Info: %.*s\r\nP-Service-Identifier: %i\r\n\r\n" -#define FAKED_SIP_SESSION_BUF_LEN 1024 +#define FAKED_SIP_SESSION_BUF_LEN 1024 char _faked_sip_session_buf[FAKED_SIP_SESSION_BUF_LEN]; str CC_INVITE = {"INVITE", 6}; str CC_UPDATE = {"UPDATE", 6}; str CC_BYE = {"BYE", 3}; -#define RO_CC_START 1 -#define RO_CC_INTERIM 2 -#define RO_CC_STOP 3 +#define RO_CC_START 1 +#define RO_CC_INTERIM 2 +#define RO_CC_STOP 3 static struct sip_msg _faked_msg; -int getMethod(AAAMessage *msg, str ** method) { +int getMethod(AAAMessage *msg, str **method) +{ str s; s = get_avp(msg, AVP_IMS_CCR_Type, 0, __FUNCTION__); - if (!s.s) return -1; - switch (get_4bytes(s.s)) { + if(!s.s) + return -1; + switch(get_4bytes(s.s)) { case RO_CC_START: *method = &CC_INVITE; break; @@ -64,14 +70,14 @@ int getMethod(AAAMessage *msg, str ** method) { return -1; break; } - + return 1; - } -int faked_aaa_msg(AAAMessage *ccr, struct sip_msg **msg) { +int faked_aaa_msg(AAAMessage *ccr, struct sip_msg **msg) +{ int type, size; - str * method; + str *method; str prefix = {0, 0}; str from_uri = getSubscriptionId1(ccr, &type); str to_uri = getCalledParty(ccr); @@ -82,50 +88,50 @@ int faked_aaa_msg(AAAMessage *ccr, struct sip_msg **msg) { int group = 0; int requested_units = getUnits(ccr, &used_units, &service, &group); - if (getMethod(ccr, &method) < 0) { + if(getMethod(ccr, &method) < 0) { LM_ERR("Failed to get CCR-Type\n"); return -1; } - if (type != AVP_Subscription_Id_Type_SIP_URI) { + if(type != AVP_Subscription_Id_Type_SIP_URI) { prefix.s = "tel:"; prefix.len = 4; } - + memset(_faked_sip_session_buf, 0, FAKED_SIP_SESSION_BUF_LEN); memset(&_faked_msg, 0, sizeof(struct sip_msg)); - size = snprintf(_faked_sip_session_buf, FAKED_SIP_SESSION_BUF_LEN, FAKED_SIP_SESSION_FORMAT, - /* First-Line METHOD sip:.... */ - method->len, method->s, to_uri.len, to_uri.s, - /* Prefix */ - prefix.len, prefix.s, - /* From-Header */ - from_uri.len, from_uri.s, - /* To-Header */ - to_uri.len, to_uri.s, - /* Call-ID */ - callid.len, callid.s, - /* CSeq (Method) */ - method->len, method->s, - /* Requested / Used Units */ - requested_units, used_units, - /* P-Access-Network-Info */ - access_network_info.len, access_network_info.s, - /* P-Access-Network-Info */ - service - ); - + size = snprintf(_faked_sip_session_buf, FAKED_SIP_SESSION_BUF_LEN, + FAKED_SIP_SESSION_FORMAT, + /* First-Line METHOD sip:.... */ + method->len, method->s, to_uri.len, to_uri.s, + /* Prefix */ + prefix.len, prefix.s, + /* From-Header */ + from_uri.len, from_uri.s, + /* To-Header */ + to_uri.len, to_uri.s, + /* Call-ID */ + callid.len, callid.s, + /* CSeq (Method) */ + method->len, method->s, + /* Requested / Used Units */ + requested_units, used_units, + /* P-Access-Network-Info */ + access_network_info.len, access_network_info.s, + /* P-Access-Network-Info */ + service); + LM_DBG("fake msg:\n%s\n", _faked_sip_session_buf); _faked_msg.buf = _faked_sip_session_buf; _faked_msg.len = size; - _faked_msg.set_global_address = default_global_address; - _faked_msg.set_global_port = default_global_port; + _faked_msg.set_global_address = default_global_address; + _faked_msg.set_global_port = default_global_port; - if (parse_msg(_faked_msg.buf, _faked_msg.len, &_faked_msg) != 0) { + if(parse_msg(_faked_msg.buf, _faked_msg.len, &_faked_msg) != 0) { LM_ERR("parse_msg failed\n"); return -1; } @@ -140,6 +146,6 @@ int faked_aaa_msg(AAAMessage *ccr, struct sip_msg **msg) { _faked_msg.rcv.dst_ip.af = AF_INET; _faked_msg.rcv.dst_ip.len = 4; - *msg = &_faked_msg; + *msg = &_faked_msg; return 0; } diff --git a/src/modules/ims_ocs/ocs_avp_helper.c b/src/modules/ims_ocs/ocs_avp_helper.c index 310bd4e28f4..1e09d1e75ef 100644 --- a/src/modules/ims_ocs/ocs_avp_helper.c +++ b/src/modules/ims_ocs/ocs_avp_helper.c @@ -33,51 +33,60 @@ * @param func - the name of the calling function, for debugging purposes * @returns the str with the payload on success or an empty string on failure */ -str get_avp(AAAMessage *msg,int avp_code,int vendor_id, const char *func) { +str get_avp(AAAMessage *msg, int avp_code, int vendor_id, const char *func) +{ AAA_AVP *avp; - str r={0,0}; - avp = cdpb.AAAFindMatchingAVP(msg,0,avp_code,vendor_id,0); - if (avp==0) { - LM_INFO("%s: Failed finding avp\n",func); + str r = {0, 0}; + avp = cdpb.AAAFindMatchingAVP(msg, 0, avp_code, vendor_id, 0); + if(avp == 0) { + LM_INFO("%s: Failed finding avp\n", func); return r; - } else return avp->data; + } else + return avp->data; } -str getSession(AAAMessage *msg) { +str getSession(AAAMessage *msg) +{ AAA_AVP *avp; - str r={0,0}; - avp = cdpb.AAAFindMatchingAVP(msg,0,AVP_Session_Id,0,0); - if (avp==0) { + str r = {0, 0}; + avp = cdpb.AAAFindMatchingAVP(msg, 0, AVP_Session_Id, 0, 0); + if(avp == 0) { LM_INFO("Failed finding avp\n"); return r; - } else return avp->data; + } else + return avp->data; } -int getRecordNummber(AAAMessage *msg) { +int getRecordNummber(AAAMessage *msg) +{ AAA_AVP *avp; - avp = cdpb.AAAFindMatchingAVP(msg,0,AVP_Accounting_Record_Number,0,0); - if (avp==0) { + avp = cdpb.AAAFindMatchingAVP(msg, 0, AVP_Accounting_Record_Number, 0, 0); + if(avp == 0) { LM_DBG("Failed finding avp\n"); return 0; - } else return get_4bytes(avp->data.s); + } else + return get_4bytes(avp->data.s); } -str getSubscriptionId1(AAAMessage *msg, int * type) { +str getSubscriptionId1(AAAMessage *msg, int *type) +{ AAA_AVP *avp, *avp_type, *avp_value; - str r={0,0}; - avp = cdpb.AAAFindMatchingAVP(msg,0,AVP_Subscription_Id,0,0); + str r = {0, 0}; + avp = cdpb.AAAFindMatchingAVP(msg, 0, AVP_Subscription_Id, 0, 0); AAA_AVP_LIST list; list = cdp_avp->cdp->AAAUngroupAVPS(avp->data); - avp_type = cdpb.AAAFindMatchingAVPList(list, list.head, AVP_Subscription_Id_Type, 0, 0); - avp_value = cdpb.AAAFindMatchingAVPList(list, list.head, AVP_Subscription_Id_Data, 0, 0); - - if (avp_type) { + avp_type = cdpb.AAAFindMatchingAVPList( + list, list.head, AVP_Subscription_Id_Type, 0, 0); + avp_value = cdpb.AAAFindMatchingAVPList( + list, list.head, AVP_Subscription_Id_Data, 0, 0); + + if(avp_type) { *type = get_4bytes(avp_type->data.s); } else { LM_DBG("Failed finding type\n"); *type = 0; } - if (avp_value==0) { + if(avp_value == 0) { LM_DBG("Failed finding value\n"); } else { r = avp_value->data; @@ -86,19 +95,23 @@ str getSubscriptionId1(AAAMessage *msg, int * type) { return r; } -int isOrig(AAAMessage *msg) { +int isOrig(AAAMessage *msg) +{ AAA_AVP *service, *imsinfo, *role; AAA_AVP_LIST list, list2; int result = 0; - service = cdpb.AAAFindMatchingAVP(msg,0,AVP_IMS_Service_Information,IMS_vendor_id_3GPP,0); - if (service) { + service = cdpb.AAAFindMatchingAVP( + msg, 0, AVP_IMS_Service_Information, IMS_vendor_id_3GPP, 0); + if(service) { list = cdp_avp->cdp->AAAUngroupAVPS(service->data); - imsinfo = cdpb.AAAFindMatchingAVPList(list, list.head, AVP_IMS_IMS_Information, IMS_vendor_id_3GPP, 0); - if (imsinfo) { + imsinfo = cdpb.AAAFindMatchingAVPList(list, list.head, + AVP_IMS_IMS_Information, IMS_vendor_id_3GPP, 0); + if(imsinfo) { list2 = cdp_avp->cdp->AAAUngroupAVPS(imsinfo->data); - role = cdpb.AAAFindMatchingAVPList(list2, list2.head, AVP_IMS_Role_Of_Node, IMS_vendor_id_3GPP, 0); - if (role) { + role = cdpb.AAAFindMatchingAVPList(list2, list2.head, + AVP_IMS_Role_Of_Node, IMS_vendor_id_3GPP, 0); + if(role) { result = get_4bytes(role->data.s); } cdpb.AAAFreeAVPList(&list2); @@ -113,18 +126,22 @@ int isOrig(AAAMessage *msg) { return result; } -str getCalledParty(AAAMessage *msg) { +str getCalledParty(AAAMessage *msg) +{ AAA_AVP *service, *imsinfo, *calledparty; - str r={0,0}; - service = cdpb.AAAFindMatchingAVP(msg,0,AVP_IMS_Service_Information,IMS_vendor_id_3GPP,0); - if (service) { + str r = {0, 0}; + service = cdpb.AAAFindMatchingAVP( + msg, 0, AVP_IMS_Service_Information, IMS_vendor_id_3GPP, 0); + if(service) { AAA_AVP_LIST list, list2; list = cdp_avp->cdp->AAAUngroupAVPS(service->data); - imsinfo = cdpb.AAAFindMatchingAVPList(list, list.head, AVP_IMS_IMS_Information, IMS_vendor_id_3GPP, 0); - if (imsinfo) { + imsinfo = cdpb.AAAFindMatchingAVPList(list, list.head, + AVP_IMS_IMS_Information, IMS_vendor_id_3GPP, 0); + if(imsinfo) { list2 = cdp_avp->cdp->AAAUngroupAVPS(imsinfo->data); - calledparty = cdpb.AAAFindMatchingAVPList(list2, list2.head, AVP_IMS_Called_Party_Address, IMS_vendor_id_3GPP, 0); - if (calledparty) { + calledparty = cdpb.AAAFindMatchingAVPList(list2, list2.head, + AVP_IMS_Called_Party_Address, IMS_vendor_id_3GPP, 0); + if(calledparty) { r = calledparty->data; } else { LM_DBG("Failed finding value\n"); @@ -141,18 +158,22 @@ str getCalledParty(AAAMessage *msg) { return r; } -str getAccessNetwork(AAAMessage *msg) { +str getAccessNetwork(AAAMessage *msg) +{ AAA_AVP *service, *imsinfo, *access; - str r={0,0}; - service = cdpb.AAAFindMatchingAVP(msg,0,AVP_IMS_Service_Information,IMS_vendor_id_3GPP,0); - if (service) { + str r = {0, 0}; + service = cdpb.AAAFindMatchingAVP( + msg, 0, AVP_IMS_Service_Information, IMS_vendor_id_3GPP, 0); + if(service) { AAA_AVP_LIST list, list2; list = cdp_avp->cdp->AAAUngroupAVPS(service->data); - imsinfo = cdpb.AAAFindMatchingAVPList(list, list.head, AVP_IMS_IMS_Information, IMS_vendor_id_3GPP, 0); - if (imsinfo) { + imsinfo = cdpb.AAAFindMatchingAVPList(list, list.head, + AVP_IMS_IMS_Information, IMS_vendor_id_3GPP, 0); + if(imsinfo) { list2 = cdp_avp->cdp->AAAUngroupAVPS(imsinfo->data); - access = cdpb.AAAFindMatchingAVPList(list2, list2.head, AVP_IMS_Access_Network_Information, IMS_vendor_id_3GPP, 0); - if (access) { + access = cdpb.AAAFindMatchingAVPList(list2, list2.head, + AVP_IMS_Access_Network_Information, IMS_vendor_id_3GPP, 0); + if(access) { r = access->data; } else { LM_DBG("Failed finding value\n"); @@ -168,43 +189,52 @@ str getAccessNetwork(AAAMessage *msg) { return r; } -int getUnits(AAAMessage *msg, int * used, int * service, int * group) { +int getUnits(AAAMessage *msg, int *used, int *service, int *group) +{ AAA_AVP *avp, *req_units, *value, *used_units, *service_avp, *rating_group; int units = 0; *used = 0; *service = 0; - avp = cdpb.AAAFindMatchingAVP(msg,0,AVP_Multiple_Services_Credit_Control,0,0); - if (avp) { + avp = cdpb.AAAFindMatchingAVP( + msg, 0, AVP_Multiple_Services_Credit_Control, 0, 0); + if(avp) { AAA_AVP_LIST list, list2; list = cdp_avp->cdp->AAAUngroupAVPS(avp->data); - req_units = cdpb.AAAFindMatchingAVPList(list, list.head, AVP_Requested_Service_Unit, 0, 0); - if (req_units) { + req_units = cdpb.AAAFindMatchingAVPList( + list, list.head, AVP_Requested_Service_Unit, 0, 0); + if(req_units) { list2 = cdp_avp->cdp->AAAUngroupAVPS(req_units->data); - value = cdpb.AAAFindMatchingAVPList(list2, list2.head, AVP_CC_Time, 0, 0); + value = cdpb.AAAFindMatchingAVPList( + list2, list2.head, AVP_CC_Time, 0, 0); cdpb.AAAFreeAVPList(&list2); - if (value) + if(value) units = get_4bytes(value->data.s); cdpb.AAAFreeAVPList(&list2); } - service_avp = cdpb.AAAFindMatchingAVPList(list, list.head, AVP_Service_Identifier, 0, 0); - if (service_avp) { + service_avp = cdpb.AAAFindMatchingAVPList( + list, list.head, AVP_Service_Identifier, 0, 0); + if(service_avp) { *service = get_4bytes(service_avp->data.s); } - used_units = cdpb.AAAFindMatchingAVPList(list, list.head, AVP_Used_Service_Unit, 0, 0); - if (used_units) { + used_units = cdpb.AAAFindMatchingAVPList( + list, list.head, AVP_Used_Service_Unit, 0, 0); + if(used_units) { list2 = cdp_avp->cdp->AAAUngroupAVPS(used_units->data); - value = cdpb.AAAFindMatchingAVPList(list2, list2.head, AVP_CC_Time, 0, 0); - if (value) + value = cdpb.AAAFindMatchingAVPList( + list2, list2.head, AVP_CC_Time, 0, 0); + if(value) *used = get_4bytes(value->data.s); cdpb.AAAFreeAVPList(&list2); } - rating_group = cdpb.AAAFindMatchingAVPList(list, list.head, AVP_Rating_Group, 0, 0); - if (rating_group) { + rating_group = cdpb.AAAFindMatchingAVPList( + list, list.head, AVP_Rating_Group, 0, 0); + if(rating_group) { *group = get_4bytes(rating_group->data.s); } cdpb.AAAFreeAVPList(&list); } - if (*service == 0) LM_WARN("Failed to get service-identifier\n"); + if(*service == 0) + LM_WARN("Failed to get service-identifier\n"); return units; } @@ -221,20 +251,23 @@ int getUnits(AAAMessage *msg, int * used, int * service, int * group) { * @param func - the name of the calling function, for debugging purposes * @returns 1 on success or 0 on failure */ -int ocs_add_avp(AAAMessage *m, char *d, int len, int avp_code, int flags, int vendorid, int data_do, const char *func) { - AAA_AVP *avp; - if (vendorid != 0) flags |= AAA_AVP_FLAG_VENDOR_SPECIFIC; - avp = cdpb.AAACreateAVP(avp_code, flags, vendorid, d, len, data_do); - if (!avp) { - LM_ERR("%s: Failed creating avp\n", func); - return 0; - } - if (cdpb.AAAAddAVPToMessage(m, avp, m->avpList.tail) != AAA_ERR_SUCCESS) { - LM_ERR("%s: Failed adding avp to message\n", func); - cdpb.AAAFreeAVP(&avp); - return 0; - } - return 1; +int ocs_add_avp(AAAMessage *m, char *d, int len, int avp_code, int flags, + int vendorid, int data_do, const char *func) +{ + AAA_AVP *avp; + if(vendorid != 0) + flags |= AAA_AVP_FLAG_VENDOR_SPECIFIC; + avp = cdpb.AAACreateAVP(avp_code, flags, vendorid, d, len, data_do); + if(!avp) { + LM_ERR("%s: Failed creating avp\n", func); + return 0; + } + if(cdpb.AAAAddAVPToMessage(m, avp, m->avpList.tail) != AAA_ERR_SUCCESS) { + LM_ERR("%s: Failed adding avp to message\n", func); + cdpb.AAAFreeAVP(&avp); + return 0; + } + return 1; } @@ -251,54 +284,64 @@ int ocs_add_avp(AAAMessage *m, char *d, int len, int avp_code, int flags, int ve * @returns 1 on success or 0 on failure */ int ocs_add_avp_list(AAA_AVP_LIST *list, char *d, int len, int avp_code, - int flags, int vendorid, int data_do, const char *func) { - AAA_AVP *avp; - if (vendorid != 0) flags |= AAA_AVP_FLAG_VENDOR_SPECIFIC; - avp = cdpb.AAACreateAVP(avp_code, flags, vendorid, d, len, data_do); - if (!avp) { - LM_ERR("%s: Failed creating avp\n", func); - return 0; - } - if (list->tail) { - avp->prev = list->tail; - avp->next = 0; - list->tail->next = avp; - list->tail = avp; - } else { - list->head = avp; - list->tail = avp; - avp->next = 0; - avp->prev = 0; - } - - return 1; + int flags, int vendorid, int data_do, const char *func) +{ + AAA_AVP *avp; + if(vendorid != 0) + flags |= AAA_AVP_FLAG_VENDOR_SPECIFIC; + avp = cdpb.AAACreateAVP(avp_code, flags, vendorid, d, len, data_do); + if(!avp) { + LM_ERR("%s: Failed creating avp\n", func); + return 0; + } + if(list->tail) { + avp->prev = list->tail; + avp->next = 0; + list->tail->next = avp; + list->tail = avp; + } else { + list->head = avp; + list->tail = avp; + avp->next = 0; + avp->prev = 0; + } + + return 1; } -int ocs_build_answer(AAAMessage *ccr, AAAMessage *cca, int result_code, int granted_units, int final_unit) { +int ocs_build_answer(AAAMessage *ccr, AAAMessage *cca, int result_code, + int granted_units, int final_unit) +{ AAA_AVP *avp; AAA_AVP_LIST granted_list, mscc_list, final_list; char x[4]; str granted_group, mscc_group, final_group; int service, group, used; - - if (!ccr) return 0; - if (!cca) return 0; + + if(!ccr) + return 0; + if(!cca) + return 0; // Set some basic data: Application-ID, CCR-Type, CCR-Request-Number set_4bytes(x, IMS_Ro); - ocs_add_avp(cca, x, 4, AVP_Acct_Application_Id, AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); - - avp = cdpb.AAAFindMatchingAVP(ccr,0,AVP_IMS_CCR_Type,0,0); - ocs_add_avp(cca, avp->data.s, avp->data.len, AVP_IMS_CCR_Type, AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); - - avp = cdpb.AAAFindMatchingAVP(ccr,0,AVP_CC_Request_Number,0,0); - ocs_add_avp(cca, avp->data.s, avp->data.len,AVP_CC_Request_Number, AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); - + ocs_add_avp(cca, x, 4, AVP_Acct_Application_Id, AAA_AVP_FLAG_MANDATORY, 0, + AVP_DUPLICATE_DATA, __FUNCTION__); + + avp = cdpb.AAAFindMatchingAVP(ccr, 0, AVP_IMS_CCR_Type, 0, 0); + ocs_add_avp(cca, avp->data.s, avp->data.len, AVP_IMS_CCR_Type, + AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); + + avp = cdpb.AAAFindMatchingAVP(ccr, 0, AVP_CC_Request_Number, 0, 0); + ocs_add_avp(cca, avp->data.s, avp->data.len, AVP_CC_Request_Number, + AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); + // Result-Code: set_4bytes(x, result_code); - ocs_add_avp(cca, x, 4, AVP_Result_Code, AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); + ocs_add_avp(cca, x, 4, AVP_Result_Code, AAA_AVP_FLAG_MANDATORY, 0, + AVP_DUPLICATE_DATA, __FUNCTION__); - if (result_code == DIAMETER_SUCCESS) { + if(result_code == DIAMETER_SUCCESS) { granted_list.head = 0; granted_list.tail = 0; final_list.head = 0; @@ -307,42 +350,56 @@ int ocs_build_answer(AAAMessage *ccr, AAAMessage *cca, int result_code, int gran mscc_list.tail = 0; getUnits(ccr, &used, &service, &group); - + set_4bytes(x, group); - ocs_add_avp_list(&mscc_list, x, 4, AVP_Rating_Group, AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); + ocs_add_avp_list(&mscc_list, x, 4, AVP_Rating_Group, + AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); set_4bytes(x, service); - ocs_add_avp_list(&mscc_list, x, 4, AVP_Service_Identifier, AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); + ocs_add_avp_list(&mscc_list, x, 4, AVP_Service_Identifier, + AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); - if (granted_units > 0) { + if(granted_units > 0) { set_4bytes(x, granted_units); - ocs_add_avp_list(&granted_list, x, 4, AVP_CC_Time, AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); + ocs_add_avp_list(&granted_list, x, 4, AVP_CC_Time, + AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, + __FUNCTION__); granted_group = cdpb.AAAGroupAVPS(granted_list); cdpb.AAAFreeAVPList(&granted_list); - ocs_add_avp_list(&mscc_list, granted_group.s, granted_group.len, AVP_Granted_Service_Unit, AAA_AVP_FLAG_MANDATORY, 0, AVP_FREE_DATA, __FUNCTION__); + ocs_add_avp_list(&mscc_list, granted_group.s, granted_group.len, + AVP_Granted_Service_Unit, AAA_AVP_FLAG_MANDATORY, 0, + AVP_FREE_DATA, __FUNCTION__); } // Result-Code: set_4bytes(x, result_code); - ocs_add_avp_list(&mscc_list, x, 4, AVP_Result_Code, AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); + ocs_add_avp_list(&mscc_list, x, 4, AVP_Result_Code, + AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); set_4bytes(x, 86400); - ocs_add_avp_list(&mscc_list, x, 4, AVP_Validity_Time, AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); + ocs_add_avp_list(&mscc_list, x, 4, AVP_Validity_Time, + AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); - if (final_unit > 0) { + if(final_unit > 0) { set_4bytes(x, 0); - ocs_add_avp_list(&final_list, x, 4, AVP_Final_Unit_Action, AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, __FUNCTION__); + ocs_add_avp_list(&final_list, x, 4, AVP_Final_Unit_Action, + AAA_AVP_FLAG_MANDATORY, 0, AVP_DUPLICATE_DATA, + __FUNCTION__); final_group = cdpb.AAAGroupAVPS(final_list); cdpb.AAAFreeAVPList(&final_list); - ocs_add_avp_list(&mscc_list, final_group.s, final_group.len, AVP_Final_Unit_Indication, AAA_AVP_FLAG_MANDATORY, 0, AVP_FREE_DATA, __FUNCTION__); + ocs_add_avp_list(&mscc_list, final_group.s, final_group.len, + AVP_Final_Unit_Indication, AAA_AVP_FLAG_MANDATORY, 0, + AVP_FREE_DATA, __FUNCTION__); } mscc_group = cdpb.AAAGroupAVPS(mscc_list); cdpb.AAAFreeAVPList(&mscc_list); - return ocs_add_avp(cca, mscc_group.s, mscc_group.len, AVP_Multiple_Services_Credit_Control, AAA_AVP_FLAG_MANDATORY, 0, AVP_FREE_DATA, __FUNCTION__); + return ocs_add_avp(cca, mscc_group.s, mscc_group.len, + AVP_Multiple_Services_Credit_Control, AAA_AVP_FLAG_MANDATORY, 0, + AVP_FREE_DATA, __FUNCTION__); } return 1; } diff --git a/src/modules/ims_ocs/ocs_avp_helper.h b/src/modules/ims_ocs/ocs_avp_helper.h index b581607bd5c..c1dcd936bb9 100644 --- a/src/modules/ims_ocs/ocs_avp_helper.h +++ b/src/modules/ims_ocs/ocs_avp_helper.h @@ -25,15 +25,16 @@ #include "../cdp/diameter_api.h" -str get_avp(AAAMessage *msg,int avp_code,int vendor_id, const char *func); +str get_avp(AAAMessage *msg, int avp_code, int vendor_id, const char *func); str getSession(AAAMessage *msg); int getRecordNummber(AAAMessage *msg); -str getSubscriptionId1(AAAMessage *msg, int * type); +str getSubscriptionId1(AAAMessage *msg, int *type); int isOrig(AAAMessage *msg); str getCalledParty(AAAMessage *msg); -int getUnits(AAAMessage *msg, int * used, int * service, int * group); +int getUnits(AAAMessage *msg, int *used, int *service, int *group); str getAccessNetwork(AAAMessage *msg); -int ocs_build_answer(AAAMessage *ccr, AAAMessage *cca, int result_code, int granted_units, int final_unit); +int ocs_build_answer(AAAMessage *ccr, AAAMessage *cca, int result_code, + int granted_units, int final_unit); #endif /* OCS_AVP_HELPER_H */ diff --git a/src/modules/ims_ocs/sem.h b/src/modules/ims_ocs/sem.h index 48a2431f767..891d55d3dda 100644 --- a/src/modules/ims_ocs/sem.h +++ b/src/modules/ims_ocs/sem.h @@ -51,40 +51,40 @@ #ifndef __SEM_H #define __SEM_H - #include +#include - typedef sem_t gen_sem_t; +typedef sem_t gen_sem_t; - /** +/** * Create a new unnamed semaphore and initialize it * @param value - 0 if it should be pre-locked, 1 if not, or how many locks until block * @return */ - #define sem_new(sem_ptr,value)\ - do {\ - sem_ptr=shm_malloc(sizeof(gen_sem_t));\ - if (!sem_ptr){\ - LM_ERR("Error allocating %lx bytes of shm!\n",sizeof(gen_sem_t));\ - } \ - if (sem_init(sem_ptr, 1, value)<0) {\ - LM_ERR("Error > %s\n",strerror(errno));\ - }\ +#define sem_new(sem_ptr, value) \ + do { \ + sem_ptr = shm_malloc(sizeof(gen_sem_t)); \ + if(!sem_ptr) { \ + LM_ERR("Error allocating %lx bytes of shm!\n", sizeof(gen_sem_t)); \ + } \ + if(sem_init(sem_ptr, 1, value) < 0) { \ + LM_ERR("Error > %s\n", strerror(errno)); \ + } \ } while(0) - - #define sem_free(sem)\ - do {\ - if (sem) {\ - sem_destroy(sem);\ - shm_free(sem);\ - sem=0;\ - }\ + +#define sem_free(sem) \ + do { \ + if(sem) { \ + sem_destroy(sem); \ + shm_free(sem); \ + sem = 0; \ + } \ } while(0) - - - #define sem_get(sem) sem_wait(sem) - #define sem_tryget(sem) sem_trywait(sem) - #define sem_timedget(sem,abs_timeout) sem_trywait(sem,abs_timeout) - - #define sem_release(sem) sem_post(sem) + + +#define sem_get(sem) sem_wait(sem) +#define sem_tryget(sem) sem_trywait(sem) +#define sem_timedget(sem, abs_timeout) sem_trywait(sem, abs_timeout) + +#define sem_release(sem) sem_post(sem) #endif