本文整理汇总了C++中usrloc_api_t类的典型用法代码示例。如果您正苦于以下问题:C++ usrloc_api_t类的具体用法?C++ usrloc_api_t怎么用?C++ usrloc_api_t使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了usrloc_api_t类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: add_dlg_data_to_contact
void add_dlg_data_to_contact(struct dlg_cell *dlg, int type, struct dlg_cb_params *_params) {
struct impu_data *impu_data;
impurecord_t* implicit_impurecord = 0;
struct ucontact* ucontact;
str callid = {0, 0};
str path = {0, 0};
LM_DBG("dialog [%p] confirmed, lets add dlg data to contact\n", dlg);
if(_params && _params->param){
impu_data = (struct impu_data*)*_params->param;
if (!impu_data) {
LM_ERR("IMPU data object is NULL...... aborting\n");
return;
}
LM_DBG("IMPU data is present, contact: <%.*s> identity <%.*s>", impu_data->contact.len, impu_data->contact.s, impu_data->identity.len, impu_data->identity.s);
LM_DBG("IMPU data domain <%.*s>", impu_data->d->name->len, impu_data->d->name->s);
ul.lock_udomain(impu_data->d, &impu_data->identity);
if (ul.get_impurecord(impu_data->d, &impu_data->identity, &implicit_impurecord) != 0) {
LM_DBG("usrloc does not have imprecord for implicity IMPU, ignore\n");
}else {
if (ul.get_ucontact(implicit_impurecord, &impu_data->contact, &callid, &path, 0/*cseq*/, &ucontact) != 0) { //contact does not exist
LM_DBG("This contact: <%.*s> is not in usrloc, ignore - NOTE: You need S-CSCF usrloc set to match_mode CONTACT_PORT_IP_ONLY\n", impu_data->contact.len, impu_data->contact.s);
} else {//contact exists so add dialog data to it
ul.add_dialog_data_to_contact(ucontact, dlg->h_entry, dlg->h_id);
}
}
ul.unlock_udomain(impu_data->d, &impu_data->identity);
}
}
开发者ID:SibghatullahSheikh,项目名称:kamailio,代码行数:33,代码来源:dialog.c
示例2: lookup_transport
/*! \brief
* Lookup contact in the database and rewrite Request-URI
* \return: 1 : contacts found and returned
* -1 : not found
* -2 : error
*/
int lookup_transport(struct sip_msg* _m, udomain_t* _d, str* _uri) {
str uri;
pcontact_t* pcontact;
char tmp[MAX_URI_SIZE];
char srcip[20];
str received_host;
str tmp_s;
int ret = 1;
if (_m->new_uri.s) uri = _m->new_uri;
else uri = _m->first_line.u.request.uri;
received_host.len = ip_addr2sbuf(&_m->rcv.src_ip, srcip, sizeof(srcip));
received_host.s = srcip;
//now lookup in usrloc
ul.lock_udomain(_d, &uri, &received_host, _m->rcv.src_port);
if (ul.get_pcontact(_d, &uri, &received_host, _m->rcv.src_port, &pcontact) != 0) { //need to insert new contact
LM_WARN("received request for contact that we don't know about\n");
ret = -1;
goto done;
}
if (pcontact->received_proto != _m->rcv.proto) {
reset_dst_uri(_m);
memset(tmp, 0, MAX_URI_SIZE);
switch (pcontact->received_proto) {
case PROTO_TCP:
snprintf(tmp, MAX_URI_SIZE, "%.*s;transport=tcp", pcontact->aor.len, pcontact->aor.s);
break;
case PROTO_UDP:
snprintf(tmp, MAX_URI_SIZE, "%.*s;transport=udp", pcontact->aor.len, pcontact->aor.s);
break;
default:
LM_WARN("unsupported transport [%d]\n", pcontact->received_proto);
ret = -2;
goto done;
}
tmp_s.s = tmp;
tmp_s.len = strlen(tmp);
if (set_dst_uri(_m, &tmp_s) < 0) {
LM_ERR("failed to set dst_uri for terminating UE\n");
ret = -2;
goto done;
}
LM_DBG("Changed dst URI transport for UE to [%.*s]\n", tmp_s.len, tmp_s.s);
}
done:
ul.unlock_udomain(_d, &uri, &received_host, _m->rcv.src_port);
return ret;
}
开发者ID:AndreyRybkin,项目名称:kamailio,代码行数:59,代码来源:lookup.c
示例3: sizeof
static void
natping(unsigned int ticks, void *param)
{
int rval;
void *buf, *cp;
str c;
struct dest_info dst;
buf = NULL;
if (cblen > 0) {
buf = pkg_malloc(cblen);
if (buf == NULL) {
LOG(L_ERR, "ERROR: nathelper::natping: out of memory\n");
return;
}
}
rval = ul.get_all_ucontacts(buf, cblen, (ping_nated_only ? FL_NAT : 0));
if (rval > 0) {
if (buf != NULL)
pkg_free(buf);
cblen = rval * 2;
buf = pkg_malloc(cblen);
if (buf == NULL) {
LOG(L_ERR, "ERROR: nathelper::natping: out of memory\n");
return;
}
rval = ul.get_all_ucontacts(buf, cblen, (ping_nated_only ? FL_NAT : 0));
if (rval != 0) {
pkg_free(buf);
return;
}
}
if (buf == NULL)
return;
cp = buf;
while (1) {
memcpy(&(c.len), cp, sizeof(c.len));
if (c.len == 0)
break;
c.s = (char *)cp + sizeof(c.len);
cp = (char *)cp + sizeof(c.len) + c.len;
init_dest_info(&dst);
memcpy(&dst.send_sock, cp, sizeof(dst.send_sock));
cp += sizeof(dst.send_sock);
natping_contact(c, &dst);
}
pkg_free(buf);
}
开发者ID:BackupTheBerlios,项目名称:openimscore-svn,代码行数:50,代码来源:natping.c
示例4: assert_identity
/**
* checked if passed identity is an asserted identity
*/
int assert_identity(struct sip_msg* _m, udomain_t* _d, str identity) {
// Public identities of this contact
struct ppublic * p;
//remove <> braces if there are
if(identity.s[0]=='<' && identity.s[identity.len-1]=='>') {
identity.s++;
identity.len -= 2;
}
LM_DBG("Identity to assert: %.*s\n", identity.len, identity.s);
if (getContactP(_m, _d, PCONTACT_REGISTERED|PCONTACT_REG_PENDING_AAR|PCONTACT_REG_PENDING, 0, 0) != NULL) {
for (p = c->head; p; p = p->next) {
LM_DBG("Public identity: %.*s\n", p->public_identity.len, p->public_identity.s);
/* Check length: */
if (identity.len == p->public_identity.len) {
/* Check contents: */
if (strncasecmp(identity.s, p->public_identity.s, identity.len) == 0) {
LM_DBG("Match!\n");
return 1;
}
} else LM_DBG("Length does not match.\n");
}
}
LM_INFO("Contact not found based on Contact, trying IP/Port/Proto\n");
str received_host = {0, 0};
char srcip[50];
received_host.len = ip_addr2sbuf(&_m->rcv.src_ip, srcip, sizeof(srcip));
received_host.s = srcip;
if (ul.assert_identity(_d, &received_host, _m->rcv.src_port, _m->rcv.proto, &identity) == 0)
return -1;
else
return 1;
}
开发者ID:TheGrandWazoo,项目名称:kamailio,代码行数:37,代码来源:service_routes.c
示例5: getContactP
/**
* get PContact-Structure for message
* (search only once per Request)
*/
pcontact_t * getContactP(struct sip_msg* _m, udomain_t* _d) {
ppublic_t * p;
str received_host = {0, 0};
char srcip[50];
if (_m->id != current_msg_id) {
current_msg_id = _m->id;
c = NULL;
received_host.len = ip_addr2sbuf(&_m->rcv.src_ip, srcip, sizeof(srcip));
received_host.s = srcip;
if (ul.get_pcontact_by_src(_d, &received_host, _m->rcv.src_port, _m->rcv.proto, &c) == 1)
LM_WARN("No entry in usrloc for %.*s:%i (Proto %i) found!\n", received_host.len, received_host.s, _m->rcv.src_port, _m->rcv.proto);
}
asserted_identity = NULL;
if (c) {
p = c->head;
while (p) {
if (p->is_default == 1)
asserted_identity = &p->public_identity;
p = p->next;
}
}
return c;
}
开发者ID:halan,项目名称:kamailio,代码行数:29,代码来源:service_routes.c
示例6:
pcontact_t * getContactP_from_via(struct sip_msg* _m, udomain_t* _d) {
ppublic_t * p;
struct via_body *vb;
vb = cscf_get_ue_via(_m);
if (!vb) {
LM_WARN("no via header.....strange!\n");
return NULL;
}
if (vb->port == 0)
vb->port = 5060;
if (_m->id != current_msg_id) {
current_msg_id = _m->id;
c = NULL;
LM_DBG("Looking for <%d://%.*s:%d>\n", vb->proto, vb->host.len, vb->host.s, vb->port);
if (ul.get_pcontact_by_src(_d, &vb->host, vb->port, vb->proto, &c) == 1)
LM_WARN("No entry in usrloc for %.*s:%i (Proto %i) found!\n", vb->host.len, vb->host.s, vb->port, vb->proto);
}
asserted_identity = NULL;
if (c) {
p = c->head;
while (p) {
if (p->is_default == 1)
asserted_identity = &p->public_identity;
p = p->next;
}
}
return c;
}
开发者ID:gbour,项目名称:kamailio,代码行数:33,代码来源:service_routes.c
示例7: pcscf_unregister
int pcscf_unregister(udomain_t* _d, str * uri, str * received_host, int received_port) {
int result = -1;
struct pcontact * pcontact;
struct pcontact_info ci;
memset(&ci, 0, sizeof (struct pcontact_info));
pcontact_info_t search_ci;
memset(&ci, 0, sizeof(struct pcontact_info));
sip_uri_t contact_uri;
if (parse_uri(uri->s, uri->len, &contact_uri) != 0) {
LM_WARN("Failed to parse aor [%.*s]\n", uri->len, uri->s);
return -1;
}
search_ci.received_host.s = received_host->s;
search_ci.received_host.len = received_host->len;
search_ci.received_port = received_port;
search_ci.received_proto = contact_uri.proto? contact_uri.proto : PROTO_UDP;
search_ci.searchflag = SEARCH_RECEIVED;
search_ci.via_host.s = received_host->s;
search_ci.via_host.len = received_host->len;
search_ci.via_port = received_port;
search_ci.via_prot = search_ci.received_proto;
search_ci.aor.s = uri->s;
search_ci.aor.len = uri->len;
search_ci.reg_state = PCONTACT_ANY;
if (ul.get_pcontact(_d, &search_ci, &pcontact) == 0) {
/* Lock this record while working with the data: */
ul.lock_udomain(_d, &pcontact->via_host, pcontact->via_port, pcontact->via_proto);
LM_DBG("Updating contact [%.*s]: setting state to PCONTACT_DEREG_PENDING_PUBLISH\n", pcontact->aor.len, pcontact->aor.s);
ci.reg_state = PCONTACT_DEREG_PENDING_PUBLISH;
ci.num_service_routes = 0;
if (ul.update_pcontact(_d, &ci, pcontact) == 0) result = 1;
/* Unlock domain */
ul.unlock_udomain(_d, &pcontact->via_host, pcontact->via_port, pcontact->via_proto);
}
return result;
}
开发者ID:TheGrandWazoo,项目名称:kamailio,代码行数:43,代码来源:service_routes.c
示例8: domain_fixup
/* PSEUDOCODE/NOTES
* 1. What mode are we in - terminating or originating
* 2. check request type - IEC - Immediate Event Charging
* ECUR - Event Charging with Unit Reservation
* SCUR - Session Charging with Unit Reservation
* 3. probably only do SCUR in this module for now - can see event based charging in another component instead (AS for SMS for example, etc)
* 4. Check a dialog exists for call, if not we fail
* 5. make sure we dont already have an Ro Session for this dialog
* 6. create new Ro Session
* 7. register for DLG callback passing new Ro session as parameter - (if dlg torn down we know which Ro session it is associated with)
*
*
*/
int ret = RO_RETURN_TRUE;
int dir = 0;
str identity = {0, 0},
contact = {0, 0};
struct hdr_field *h=0;
cfg_action_t* cfg_action;
tm_cell_t *t;
unsigned int tindex = 0,
tlabel = 0;
struct impu_data *impu_data;
udomain_t* domain_t = (udomain_t*) _d;
char *p;
struct dlg_cell* dlg;
unsigned int len;
struct ro_session *ro_session = 0;
int free_contact = 0;
LM_DBG("Ro CCR initiated: direction:%.*s, charge_type:%.*s, unit_type:%.*s, reservation_units:%i, route_name:%.*s",
direction->len, direction->s,
charge_type->len, charge_type->s,
unit_type->len, unit_type->s,
reservation_units,
route_name->len, route_name->s);
if (msg->first_line.type != SIP_REQUEST) {
LM_ERR("Ro_CCR() called from SIP reply.");
return RO_RETURN_ERROR;;
}
//make sure we can get the dialog! if not, we can't continue
dlg = dlgb.get_dlg(msg);
if (!dlg) {
LM_ERR("Unable to find dialog and cannot do Ro charging without it\n");
return RO_RETURN_ERROR;
}
dir = get_direction_as_int(direction);
if (dir == RO_ORIG_DIRECTION) {
//get caller IMPU from asserted identity
if ((identity = cscf_get_asserted_identity(msg, 0)).len == 0) {
LM_DBG("No P-Asserted-Identity hdr found. Using From hdr for asserted_identity");
identity = dlg->from_uri;
}
//get caller contact from contact header - if not present then skip this
if ((contact = cscf_get_contact(msg)).len == 0) {
LM_WARN("Can not get contact from message - will not get callbacks if this IMPU is removed to terminate call");
goto send_ccr;
}
} else if (dir == RO_TERM_DIRECTION){
//get callee IMPU from called part id - if not present then skip this
if ((identity = cscf_get_public_identity_from_called_party_id(msg, &h)).len == 0) {
LM_WARN("No P-Called-Identity hdr found - will not get callbacks if this IMPU is removed to terminate call");
goto send_ccr;
}
//get callee contact from request URI
contact = cscf_get_contact_from_requri(msg);
free_contact = 1;
} else {
LM_CRIT("don't know what to do in unknown mode - should we even get here\n");
ret = RO_RETURN_ERROR;
goto done;
}
LM_DBG("IMPU data to pass to usrloc: contact <%.*s> identity <%.*s>\n", contact.len, contact.s, identity.len, identity.s);
//create impu_data_parcel
len = identity.len + contact.len + sizeof (struct impu_data);
impu_data = (struct impu_data*) shm_malloc(len);
if (!impu_data) {
LM_ERR("Unable to allocate memory for impu_data, trying to send CCR\n");
ret = RO_RETURN_ERROR;
goto done;
}
memset(impu_data, 0, len);
p = (char*) (impu_data + 1);
impu_data->identity.s = p;
impu_data->identity.len = identity.len;
memcpy(p, identity.s, identity.len);
p += identity.len;
impu_data->contact.s = p;
//.........这里部分代码省略.........
开发者ID:mykook,项目名称:kamailio,代码行数:101,代码来源:mod.c
示例9: assert_identity
/**
* Add proper asserted identies based on registration
*/
int assert_identity(struct sip_msg* _m, udomain_t* _d, str identity) {
str received_host = {0, 0};
char srcip[50];
received_host.len = ip_addr2sbuf(&_m->rcv.src_ip, srcip, sizeof(srcip));
received_host.s = srcip;
if (ul.assert_identity(_d, &received_host, _m->rcv.src_port, _m->rcv.proto, &identity) == 0)
return -1;
else
return 1;
}
开发者ID:virtualolson,项目名称:who,代码行数:14,代码来源:service_routes.c
示例10: domain_fixup
/*! \brief
* Convert char* parameter to udomain_t* pointer
*/
static int domain_fixup(void** param, int param_no) {
udomain_t* d;
if (param_no == 2) {
if (isc_ulb.register_udomain((char*) *param, &d) < 0) {
LM_ERR("failed to register domain\n");
return E_UNSPEC;
}
*param = (void*) d;
}
return 0;
}
开发者ID:gbour,项目名称:kamailio,代码行数:15,代码来源:mod.c
示例11: unregister
int unregister(udomain_t* _d, str * uri, str * received_host, int received_port) {
int result = -1;
struct pcontact * pcontact;
struct pcontact_info ci;
memset(&ci, 0, sizeof (struct pcontact_info));
if (ul.get_pcontact(_d, uri, received_host, received_port, &pcontact) == 0) {
/* Lock this record while working with the data: */
ul.lock_udomain(_d, &pcontact->aor, received_host, received_port);
LM_DBG("Updating contact [%.*s]: setting state to PCONTACT_DEREG_PENDING_PUBLISH\n", pcontact->aor.len, pcontact->aor.s);
ci.reg_state = PCONTACT_DEREG_PENDING_PUBLISH;
ci.num_service_routes = 0;
if (ul.update_pcontact(_d, &ci, pcontact) == 0) result = 1;
// if (ul.delete_pcontact(_d, &pc->aor, received_host, received_port, pcontact) == 0) result = 1;
/* Unlock domain */
ul.unlock_udomain(_d, &pcontact->aor, received_host, received_port);
}
return result;
}
开发者ID:Gitlab11,项目名称:kamailio,代码行数:23,代码来源:service_routes.c
示例12: domain_fixup
/*
* Convert char* parameter to udomain_t* pointer
*/
static int domain_fixup(void** param, int param_no)
{
udomain_t* d;
if (param_no == 1) {
if (ul.register_udomain((char*)*param, &d) < 0) {
LOG(L_ERR, "domain_fixup(): Error while registering domain\n");
return E_UNSPEC;
}
*param = (void*)d;
}
return 0;
}
开发者ID:,项目名称:,代码行数:17,代码来源:
示例13: assert_identity
/**
* Add proper asserted identies based on registration
*/
int assert_identity(struct sip_msg* _m, udomain_t* _d, str identity) {
// Get the contact:
pcontact_t * c = getContactP(_m, _d);
// Public identities of this contact
ppublic_t * p;
// Contact not found => Identity not asserted.
if (c == NULL) return -2;
/* Lock this record while working with the data: */
ul.lock_udomain(_d, &c->aor);
LM_DBG("Checking identity: %.*s\n", identity.len, identity.s);
LM_DBG("AOR of contact: %.*s\n", c->aor.len, c->aor.s);
for (p = c->head; p; p = p->next) {
LM_DBG("Public identity: %.*s\n", p->public_identity.len, p->public_identity.s);
/* Check length: */
if (identity.len == p->public_identity.len) {
/* Check contents: */
if (strncasecmp(identity.s, p->public_identity.s, identity.len) != 0) {
LM_DBG("Match!\n");
goto success;
}
} else LM_DBG("Length does not match.\n");
}
// We should only get here, if we failed:
/* Unlock domain */
ul.unlock_udomain(_d, &c->aor);
return -1;
success:
/* Unlock domain */
ul.unlock_udomain(_d, &c->aor);
return 1;
}
开发者ID:halan,项目名称:kamailio,代码行数:40,代码来源:service_routes.c
示例14: fixup_aar_register
static int fixup_aar_register(void** param, int param_no) {
// udomain_t* d;
// aar_param_t *ap;
//
// if (param_no != 1)
// return 0;
// ap = (aar_param_t*) pkg_malloc(sizeof (aar_param_t));
// if (ap == NULL) {
// LM_ERR("no more pkg\n");
// return -1;
// }
// memset(ap, 0, sizeof (aar_param_t));
// ap->paction = get_action_from_param(param, param_no);
//
// if (ul.register_udomain((char*) *param, &d) < 0) {
// LM_ERR("failed to register domain\n");
// return E_UNSPEC;
// }
// ap->domain = d;
//
// *param = (void*) ap;
// return 0;
if (strlen((char*) *param) <= 0) {
LM_ERR("empty parameter %d not allowed\n", param_no);
return -1;
}
if (param_no == 1) { //route name - static or dynamic string (config vars)
if (fixup_spve_null(param, param_no) < 0)
return -1;
return 0;
} else if (param_no == 2) {
udomain_t* d;
if (ul.register_udomain((char*) *param, &d) < 0) {
LM_ERR("Error doing fixup on assign save");
return -1;
}
*param = (void*) d;
}
return 0;
}
开发者ID:Jared-Prime,项目名称:kamailio,代码行数:43,代码来源:mod.c
示例15: remove_dlg_data_from_contact
void remove_dlg_data_from_contact(struct dlg_cell *dlg, int type, struct dlg_cb_params *_params) {
struct impu_data *impu_data;
impurecord_t* implicit_impurecord = 0;
struct ucontact* ucontact;
str callid = {0, 0};
str path = {0, 0};
udomain_t* domain_t;
LM_DBG("dialog [%p] terminated, lets remove dlg data from contact\n", dlg);
if (ul.register_udomain(domain, &domain_t) < 0) {
LM_ERR("Unable to register usrloc domain....aborting\n");
return;
}
if(_params && _params->param){
impu_data = (struct impu_data*)*_params->param;
if (!impu_data) {
LM_ERR("IMPU data object is NULL...... aborting\n");
return;
}
LM_DBG("IMPU data is present, contact: <%.*s> identity <%.*s>", impu_data->contact.len, impu_data->contact.s, impu_data->identity.len, impu_data->identity.s);
LM_DBG("IMPU data domain <%.*s>", domain_t->name->len, domain_t->name->s);
ul.lock_udomain(domain_t, &impu_data->identity);
if (ul.get_impurecord(domain_t, &impu_data->identity, &implicit_impurecord) != 0) {
LM_DBG("usrloc does not have imprecord for implicity IMPU, ignore\n");
}else {
if (ul.get_ucontact(&impu_data->contact, &callid, &path, 0/*cseq*/, &ucontact) != 0) { //contact does not exist
LM_DBG("This contact: <%.*s> is not in usrloc, ignore - NOTE: You need S-CSCF usrloc set to match_mode CONTACT_PORT_IP_ONLY\n", impu_data->contact.len, impu_data->contact.s);
} else {//contact exists so add dialog data to it
ul.remove_dialog_data_from_contact(ucontact, dlg->h_entry, dlg->h_id);
ul.release_ucontact(ucontact);
}
}
ul.unlock_udomain(domain_t, &impu_data->identity);
free_impu_data(impu_data);
}
//we referenced the dialog when we registered for callbacks on it...
dlgb.release_dlg(dlg);
}
开发者ID:DileepNunna,项目名称:kamailio,代码行数:44,代码来源:dialog.c
示例16: if
/*
* Convert the char* parameters
*/
static int assign_save_fixup3_async(void** param, int param_no) {
if (strlen((char*) *param) <= 0) {
LM_ERR("empty parameter %d not allowed\n", param_no);
return -1;
}
if (param_no == 1) { //route name - static or dynamic string (config vars)
if (fixup_spve_null(param, param_no) < 0)
return -1;
return 0;
} else if (param_no == 2) {
udomain_t* d;
if (ul.register_udomain((char*) *param, &d) < 0) {
LM_ERR("Error doing fixup on assign save");
return -1;
}
*param = (void*) d;
}
return 0;
}
开发者ID:gnufreex,项目名称:kamailio,代码行数:26,代码来源:reg_mod.c
示例17: async_aar_reg_callback
void async_aar_reg_callback(int is_timeout, void *param, AAAMessage *aaa, long elapsed_msecs) {
struct cell *t = 0;
pcontact_t* pcontact;
unsigned int cdp_result;
struct pcontact_info ci;
udomain_t* domain_t;
int finalReply = 0;
AAASession *auth = 0;
rx_authsessiondata_t* p_session_data = 0;
int result = CSCF_RETURN_ERROR;
pcontact_info_t contact_info;
LM_DBG("Received AAR callback\n");
saved_transaction_local_t* local_data = (saved_transaction_local_t*) param;
saved_transaction_t* data = local_data->global_data;
domain_t = data->domain;
int is_rereg = local_data->is_rereg;
//before we do anything else, lets decrement the reference counter on replies
lock_get(data->lock);
data->answers_not_received--;
if (data->answers_not_received <= 0) {
finalReply = 1;
}
if (data->ignore_replies) { //there was obv. a subsequent error AFTER we had sent one/more AAR's - so we can ignore these replies and just free memory
free_saved_transaction_data(local_data);
if (finalReply) {
free_saved_transaction_global_data(data);
}
return;
}
lock_release(data->lock);
LM_DBG("received answer and we are waiting for [%d] answers so far failures flag is [%d]\n", data->answers_not_received, data->failed);
if (tmb.t_lookup_ident(&t, data->tindex, data->tlabel) < 0) {
LM_ERR("t_continue: transaction not found\n");
goto error;
}
//we have T, lets restore our state (esp. for AVPs)
set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, &t->uri_avps_from);
set_avp_list(AVP_TRACK_TO | AVP_CLASS_URI, &t->uri_avps_to);
set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, &t->user_avps_from);
set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER, &t->user_avps_to);
set_avp_list(AVP_TRACK_FROM | AVP_CLASS_DOMAIN, &t->domain_avps_from);
set_avp_list(AVP_TRACK_TO | AVP_CLASS_DOMAIN, &t->domain_avps_to);
if (is_timeout != 0) {
LM_ERR("Error timeout when sending AAR message via CDP\n");
counter_inc(ims_qos_cnts_h.registration_aar_timeouts);
goto error;
}
if (!aaa) {
LM_ERR("Error sending message via CDP\n");
goto error;
}
counter_inc(ims_qos_cnts_h.registration_aars);
counter_add(ims_qos_cnts_h.registration_aar_response_time, elapsed_msecs);
counter_inc(ims_qos_cnts_h.registration_aar_replies_received);
/* Process the response to AAR, retrieving result code and associated Rx session ID */
if (rx_process_aaa(aaa, &cdp_result) < 0) {
LM_ERR("Failed to process AAA from PCRF\n"); //puri.host.len, puri.host.s);
goto error;
}
if (cdp_result >= 2000 && cdp_result < 3000) {
counter_inc(ims_qos_cnts_h.successful_registration_aars);
if (is_rereg) {
LM_DBG("this is a re-registration, therefore we don't need to do anything except know that the the subscription was successful\n");
result = CSCF_RETURN_TRUE;
create_return_code(result);
goto done;
}
//need to set Rx auth data to say this session has been successfully opened
//This is used elsewhere to prevent acting on termination events when the session has not been opened
//getting auth session
auth = cdpb.AAAGetAuthSession(aaa->sessionId->data);
if (!auth) {
LM_DBG("Could not get Auth Session for session id: [%.*s]\n", aaa->sessionId->data.len, aaa->sessionId->data.s);
goto error;
}
//getting session data
p_session_data = (rx_authsessiondata_t*) auth->u.auth.generic_data;
if (!p_session_data) {
LM_DBG("Could not get session data on Auth Session for session id: [%.*s]\n", aaa->sessionId->data.len, aaa->sessionId->data.s);
if (auth) cdpb.AAASessionsUnlock(auth->hash);
goto error;
}
p_session_data->session_has_been_opened = 1;
counter_inc(ims_qos_cnts_h.active_registration_rx_sessions);
if (auth) cdpb.AAASessionsUnlock(auth->hash);
LM_DBG("Success, received code: [%i] from PCRF for AAR request (contact: [%.*s]), (auth session id: %.*s)\n",
cdp_result, local_data->contact.len, local_data->contact.s,
local_data->auth_session_id.len, local_data->auth_session_id.s);
//.........这里部分代码省略.........
开发者ID:DileepNunna,项目名称:kamailio,代码行数:101,代码来源:rx_aar.c
示例18: mod_init
/**
* init module function
*/
static int mod_init(void)
{
bind_usrloc_t bind_usrloc;
bind_pua_t bind_pua;
LM_DBG("initializing module ...\n");
if(default_domain.s == NULL )
{
LM_ERR("default domain parameter not set\n");
return -1;
}
default_domain.len= strlen(default_domain.s);
if(pres_prefix.s == NULL )
{
LM_DBG("No pres_prefix configured\n");
}
else
pres_prefix.len= strlen(pres_prefix.s);
if(presence_server.s)
{
presence_server.len= strlen(presence_server.s);
}
bind_usrloc = (bind_usrloc_t)find_export("ul_bind_usrloc", 1, 0);
if (!bind_usrloc)
{
LM_ERR("Can't bind usrloc\n");
return -1;
}
if (bind_usrloc(&ul) < 0)
{
LM_ERR("Can't bind usrloc\n");
return -1;
}
if(ul.register_ulcb == NULL)
{
LM_ERR("Could not import ul_register_ulcb\n");
return -1;
}
if(ul.register_ulcb(UL_CONTACT_INSERT, ul_publish, 0)< 0)
{
LM_ERR("can not register callback for"
" insert\n");
return -1;
}
if(ul.register_ulcb(UL_CONTACT_EXPIRE, ul_publish, 0)< 0)
{
LM_ERR("can not register callback for"
" expire\n");
return -1;
}
if(ul.register_ulcb(UL_CONTACT_UPDATE, ul_publish, 0)< 0)
{
LM_ERR("can not register callback for update\n");
return -1;
}
if(ul.register_ulcb(UL_CONTACT_DELETE, ul_publish, 0)< 0)
{
LM_ERR("can not register callback for delete\n");
return -1;
}
bind_pua= (bind_pua_t)find_export("bind_pua", 1,0);
if (!bind_pua)
{
LM_ERR("Can't bind pua\n");
return -1;
}
if (bind_pua(&pua) < 0)
{
LM_ERR("Can't bind pua\n");
return -1;
}
if(pua.send_publish == NULL)
{
LM_ERR("Could not import send_publish\n");
return -1;
}
pua_send_publish= pua.send_publish;
if(pua.send_subscribe == NULL)
{
LM_ERR("Could not import send_subscribe\n");
return -1;
}
pua_send_subscribe= pua.send_subscribe;
/* register post-script pua_unset_publish unset function */
if(register_script_cb(pua_unset_publish, POST_SCRIPT_CB|REQ_TYPE_CB, 0)<0)
{
//.........这里部分代码省略.........
开发者ID:asitm9,项目名称:opensips,代码行数:101,代码来源:pua_usrloc.c
示例19: ipsec_forward
int ipsec_forward(struct sip_msg* m, udomain_t* d)
{
struct pcontact_info ci;
pcontact_t* pcontact = NULL;
int ret = IPSEC_CMD_FAIL; // FAIL by default
//
// Find the contact
//
if(fill_contact(&ci, m) != 0) {
LM_ERR("Error filling in contact data\n");
return ret;
}
ul.lock_udomain(d, &ci.via_host, ci.via_port, ci.via_prot);
if (ul.get_pcontact(d, &ci, &pcontact) != 0) {
LM_ERR("Contact doesn't exist\n");
goto cleanup;
}
if(pcontact->security_temp == NULL) {
LM_ERR("No security parameters found in contact\n");
goto cleanup;
}
//get security parameters
if(pcontact->security_temp->type != SECURITY_IPSEC ) {
LM_ERR("Unsupported security type: %d\n", pcontact->security_temp->type);
goto cleanup;
}
ipsec_t* s = pcontact->security_temp->data.ipsec;
// Update the destination
//
// from sec-agree
// v
// sip:host:port
// ^
// from URI
//int uri_len = 4 /* strlen("sip:") */ + ci.via_host.len + 5 /* max len of port number */ ;
if(m->dst_uri.s) {
pkg_free(m->dst_uri.s);
m->dst_uri.s = NULL;
m->dst_uri.len = 0;
}
char buf[1024];
int buf_len = snprintf(buf, sizeof(buf) - 1, "sip:%.*s:%d", ci.via_host.len, ci.via_host.s, s->port_us);
if((m->dst_uri.s = pkg_malloc(buf_len)) == NULL) {
LM_ERR("Error allocating memory for dst_uri\n");
goto cleanup;
}
memcpy(m->dst_uri.s, buf, buf_len);
m->dst_uri.len = buf_len;
// Set send socket
struct socket_info * client_sock = grep_sock_info(&ipsec_listen_addr, ipsec_client_port, PROTO_UDP);
if(!client_sock) {
LM_ERR("Error calling grep_sock_info() for ipsec client port in ipsec_forward\n");
return -1;
}
m->force_send_socket = client_sock;
// Set destination info
struct dest_info dst_info;
dst_info.send_sock = client_sock;
#ifdef USE_DNS_FAILOVER
if (!uri2dst(NULL, &dst_info, m, &m->dst_uri, PROTO_UDP)) {
#else
if (!uri2dst(&dst_info, m, &m->dst_uri, PROTO_UDP)) {
#endif
LM_ERR("Error converting dst_uri (%.*s) to struct dst_info\n", m->dst_uri.len, m->dst_uri.s);
goto cleanup;
}
// Update dst_info in message
if(m->first_line.type == SIP_REPLY) {
struct cell *t = tmb.t_gett();
if (!t) {
LM_ERR("Error getting transaction\n");
goto cleanup;
}
t->uas.response.dst = dst_info;
}
LM_DBG("Destination changed to %.*s\n", m->dst_uri.len, m->dst_uri.s);
ret = IPSEC_CMD_SUCCESS; // all good, return SUCCESS
if(add_supported_secagree_header(m) != 0) {
goto cleanup;
}
//.........这里部分代码省略.........
开发者ID:btriller,项目名称:kamailio,代码行数:101,代码来源:cmd.c
示例20: check_service_routes
/**
* Check, if a user-agent follows the indicated service-routes
*/
int check_service_routes(struct sip_msg* _m, udomain_t* _d) {
struct sip_uri uri;
int i;
struct hdr_field *hdr;
rr_t *r;
char routes[MAXROUTES][MAXROUTESIZE];
unsigned int num_routes = 0;
struct via_body * vb;
unsigned short port;
unsigned short proto;
/* Contact not found => not following service-routes */
// if (c == NULL) return -1;
/* Search for the first Route-Header: */
if (find_first_route(_m) < 0) return -1;
// LM_DBG("Got %i Route-Headers.\n", c->num_service_routes);
vb = cscf_get_ue_via(_m);
port = vb->port?vb->port:5060;
proto = vb->proto;
/* Lock this record while working with the data: */
ul.lock_udomain(_d, &vb->host, port, proto);
if (_m->route) {
hdr = _m->route;
r = (rr_t*)hdr->parsed;
//get rid of ourselves from route header
if (r) {
LM_DBG("Route is %.*s\n", r->nameaddr.uri.len, r->nameaddr.uri.s);
while (r && (parse_uri(r->nameaddr.uri.s, r->nameaddr.uri.len, &uri) == 0)
&& check_self(&uri.host,uri.port_no?uri.port_no:SIP_PORT,0)) {
LM_DBG("Self\n");
/* Check for more headers and fail, if it was the last one
Check, if service-routes are indicated.
If yes, request is not following service-routes */
if (find_next_route(_m, &hdr) != 0)
r = NULL;
else
r = (rr_t*)hdr->parsed;
LM_DBG("hdr is %p\n", hdr);
LM_DBG("r is %p\n", r);
if (r)
LM_DBG("Next Route is %.*s\n", r->nameaddr.uri.len, r->nameaddr.uri.s);
}
int i = 0;
while (r) {
memset(routes[i],0,MAXROUTESIZE);
memcpy(routes[i], r->nameaddr.uri.s, r->nameaddr.uri.len);
if (find_next_route(_m, &hdr) != 0)
r = NULL;
else
r = (rr_t*)hdr->parsed;
i += 1;
num_routes += 1;
}
LM_DBG("num_routes is %d\n", num_routes);
for (i=0; i<num_routes; i++) {
LM_DBG("route %d for checking is %s\n", i, routes[i]);
}
pcontact_t * c = getContactP(_m, _d, PCONTACT_REGISTERED, routes, num_routes);
if (!c) {
LM_DBG("no contact found in usrloc when checking for service route\n");
goto error;
}
LM_DBG("we have a contact which satisifes the routes...\n");
ul.unlock_udomain(_d, &vb->host, port, proto);
return 1;
}
} else {
LM_DBG("Request doesn't have any route headers to check service-route...ignoring\n");
goto error;
}
pcontact_t * c = getContactP(_m, _d, PCONTACT_REGISTERED, 0, 0);
if (!c) {
LM_DBG("no contact found in usrloc when checking for service route\n");
goto error;
}
/* Check the route-set: */
if (_m->route) {
hdr = _m->route;
LM_DBG("hdr is %p\n", hdr);
/* Check, if the first host is ourself: */
r = (rr_t*)hdr->parsed;
if (r) {
LM_DBG("Route is %.*s\n", r->nameaddr.uri.len, r->nameaddr.uri.s);
/* Skip first headers containing myself: */
//.........这里部分代码省略.........
开发者ID:TheGrandWazoo,项目名称:kamailio,代码行数:101,代码来源:service_routes.c
注:本文中的usrloc_api_t类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论