/* * Print the user_data hash table */ void print_lrf_user_data(int log_level){ int i; user_d *d; LOG(L_INFO, "INFO:"M_NAME":--------LRF user data list begin--------\n"); for(i=0;i<user_data_hash_size;i++){ lrf_lock(i); d = user_datas[i].head; while(d){ print_user_data(d, log_level); d = d->next; } lrf_unlock(i); } LOG(L_INFO, "INFO:"M_NAME":--------LRF user data list end--------\n"); }
/** * Parses the user data XML and copies data into a new ims_subscription structure. * @param xml - the input xml (NB must be null terminated) * @returns the ims_subscription* on success or NULL on error */ ims_subscription *parse_user_data(str xml) { xmlDocPtr doc=0; xmlNodePtr root=0; ims_subscription *s = 0; if (!ctxtInit) parser_init(scscf_user_data_dtd,scscf_user_data_xsd); doc=0; doc = xmlParseDoc((unsigned char *)xml.s); if (!doc){ LM_ERR("This is not a valid XML <%.*s>\n", xml.len,xml.s); goto error; } if (dtdCtxt){ if (xmlValidateDtd(dtdCtxt,doc,dtd)!=1){ LM_ERR("Verification of XML against DTD failed <%.*s>\n", xml.len,xml.s); goto error; } } if (xsdCtxt){ if (xmlSchemaValidateDoc(xsdCtxt,doc)!=0){ LM_ERR("Verification of XML against XSD failed <%.*s>\n", xml.len,xml.s); goto error; } } root = xmlDocGetRootElement(doc); if (!root){ LM_ERR("Empty XML <%.*s>\n", xml.len,xml.s); goto error; } s = parse_ims_subscription(doc,root); if (!s){ LM_ERR("Error while loading into ims subscription structure\n"); goto error; } xmlFreeDoc(doc); print_user_data(s); return s; error: if (doc) xmlFreeDoc(doc); return 0; }
/** * Process a Push Profile Request and return the Answer for it. * @param ppr - the PPR Diameter request * @returns the PPA Diameter answer */ AAAMessage* Cx_PPA(AAAMessage * ppr) { AAAMessage *ppa_msg; str ppr_data; ims_subscription *imss; int i,j; r_public *pu; str ccf1,ccf2,ecf1,ecf2; ppa_msg = cdpb.AAACreateResponse(ppr); if (!ppa_msg) return 0; if((ppr_data=Cx_get_user_data(ppr)).len != 0){ LOG(L_INFO,"INFO:"M_NAME":Cx_PPA(): Received a User_Data PPR!\n"); imss=parse_user_data(ppr_data); print_user_data(L_ALERT,imss); for(i=0;i<imss->service_profiles_cnt;i++) for(j=0;j<imss->service_profiles[i].public_identities_cnt;j++){ pu = update_r_public(imss->service_profiles[i].public_identities[j].public_identity, 0,&imss,0,0,0,0); if (!pu) continue; r_unlock(pu->hash); } } else{ if (Cx_get_charging_info(ppr,&ccf1,&ccf2,&ecf1,&ecf2)){ LOG(L_INFO,"INFO:"M_NAME":Cx_PPA(): Received a Charging Info PPR - NOT IMPLEMENTED\n"); //TODO find all r_public that should be updated and update } } Cx_add_vendor_specific_appid(ppa_msg,IMS_vendor_id_3GPP,IMS_Cx,0 /*IMS_Cx*/); Cx_add_auth_session_state(ppa_msg,1); Cx_add_result_code(ppa_msg,DIAMETER_SUCCESS); #ifdef WITH_IMS_PM ims_pm_diameter_answer(ppa_msg); #endif return ppa_msg; }