/* * SIP_ADD_MYVIA * * interface == IF_OUTBOUND, IF_INBOUND * * RETURNS * STS_SUCCESS on success * STS_FAILURE on error */ int sip_add_myvia (sip_ticket_t *ticket, int interface) { struct in_addr addr; char tmp[URL_STRING_SIZE]; osip_via_t *via; int sts; char branch_id[VIA_BRANCH_SIZE]; char *myaddr; if (get_interface_ip(interface, &addr) != STS_SUCCESS) { return STS_FAILURE; } sts = sip_calculate_branch_id(ticket, branch_id); myaddr=utils_inet_ntoa(addr); sprintf(tmp, "SIP/2.0/UDP %s:%i;branch=%s", myaddr, configuration.sip_listen_port, branch_id); DEBUGC(DBCLASS_BABBLE,"adding VIA:%s",tmp); sts = osip_via_init(&via); if (sts!=0) return STS_FAILURE; /* allocation failed */ sts = osip_via_parse(via, tmp); if (sts!=0) return STS_FAILURE; osip_list_add(ticket->sipmsg->vias,via,0); return STS_SUCCESS; }
/* * SIP_ADD_MYVIA * * interface == IF_OUTBOUND, IF_INBOUND * * RETURNS * STS_SUCCESS on success * STS_FAILURE on error */ int sip_add_myvia (sip_ticket_t *ticket, int interface, struct in_addr *local_ip) { struct in_addr addr; char tmp[URL_STRING_SIZE] = {0}; osip_via_t *via; int sts; char branch_id[VIA_BRANCH_SIZE]; if (local_ip == NULL) { if (interface == IF_OUTBOUND) { if (get_ip_by_ifname(configuration.outbound_if, &addr) != STS_SUCCESS) { ERROR("can't find interface %s - configuration error?", configuration.outbound_if); return STS_FAILURE; } } else { if (get_ip_by_ifname(configuration.inbound_if, &addr) != STS_SUCCESS) { ERROR("can't find inbound interface %s - configuration error?", configuration.inbound_if); return STS_FAILURE; } } } else { addr = *local_ip; } sts = sip_calculate_branch_id(ticket, branch_id); snprintf(tmp,URL_STRING_SIZE, "SIP/2.0/UDP %s:%i;branch=%s;", utils_inet_ntoa(addr), configuration.sip_listen_port, branch_id); DEBUGC(DBCLASS_BABBLE,"adding VIA:%s",tmp); sts = osip_via_init(&via); if (sts!=0) return STS_FAILURE; /* allocation failed */ sts = osip_via_parse(via, tmp); if (sts!=0) return STS_FAILURE; osip_list_add(ticket->sipmsg->vias,via,0); return STS_SUCCESS; }