|
|
|
@ -1496,13 +1496,14 @@ inline int encode_avp_value(char *value, unsigned int gw_index, uri_type scheme,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline int decode_avp_value(char *value, unsigned int *gw_index, str *scheme,
|
|
|
|
inline int decode_avp_value(char *value, unsigned int *gw_index, str *scheme,
|
|
|
|
unsigned int *strip, str *tag, unsigned int *addr,
|
|
|
|
unsigned int *strip, str *tag, struct ip_addr *addr,
|
|
|
|
str *hostname, str *port, str *params,
|
|
|
|
str *hostname, str *port, str *params,
|
|
|
|
str *transport, unsigned int *flags)
|
|
|
|
str *transport, unsigned int *flags)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
unsigned int u;
|
|
|
|
unsigned int u;
|
|
|
|
str s;
|
|
|
|
str s;
|
|
|
|
char *sep;
|
|
|
|
char *sep;
|
|
|
|
|
|
|
|
struct ip_addr *ip;
|
|
|
|
|
|
|
|
|
|
|
|
/* gw index */
|
|
|
|
/* gw index */
|
|
|
|
s.s = value;
|
|
|
|
s.s = value;
|
|
|
|
@ -1555,9 +1556,18 @@ inline int decode_avp_value(char *value, unsigned int *gw_index, str *scheme,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
s.len = sep - s.s;
|
|
|
|
s.len = sep - s.s;
|
|
|
|
if (s.len > 0) {
|
|
|
|
if (s.len > 0) {
|
|
|
|
str2int(&s, addr);
|
|
|
|
if ((ip = str2ip(&s)) != NULL)
|
|
|
|
|
|
|
|
*addr = *ip;
|
|
|
|
|
|
|
|
else if ((ip = str2ip6(&s)) != NULL)
|
|
|
|
|
|
|
|
*addr = *ip;
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
str2int(&s, &u);
|
|
|
|
|
|
|
|
addr->af = AF_INET;
|
|
|
|
|
|
|
|
addr->len = 4;
|
|
|
|
|
|
|
|
addr->u.addr32[0] = u;
|
|
|
|
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
*addr = 0;
|
|
|
|
addr->af = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* hostname */
|
|
|
|
/* hostname */
|
|
|
|
hostname->s = sep + 1;
|
|
|
|
hostname->s = sep + 1;
|
|
|
|
@ -1831,7 +1841,7 @@ static int load_gws_2(struct sip_msg* _m, char *_lcr_id, char *_from_uri)
|
|
|
|
/* Generate Request-URI and Destination URI */
|
|
|
|
/* Generate Request-URI and Destination URI */
|
|
|
|
static int generate_uris(struct sip_msg* _m, char *r_uri, str *r_uri_user,
|
|
|
|
static int generate_uris(struct sip_msg* _m, char *r_uri, str *r_uri_user,
|
|
|
|
unsigned int *r_uri_len, char *dst_uri,
|
|
|
|
unsigned int *r_uri_len, char *dst_uri,
|
|
|
|
unsigned int *dst_uri_len, unsigned int *addr,
|
|
|
|
unsigned int *dst_uri_len, struct ip_addr *addr,
|
|
|
|
unsigned int *gw_index, unsigned int *flags)
|
|
|
|
unsigned int *gw_index, unsigned int *flags)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int_str gw_uri_val;
|
|
|
|
int_str gw_uri_val;
|
|
|
|
@ -1839,7 +1849,6 @@ static int generate_uris(struct sip_msg* _m, char *r_uri, str *r_uri_user,
|
|
|
|
str scheme, tag, hostname, port, params, transport, addr_str;
|
|
|
|
str scheme, tag, hostname, port, params, transport, addr_str;
|
|
|
|
char *at;
|
|
|
|
char *at;
|
|
|
|
unsigned int strip;
|
|
|
|
unsigned int strip;
|
|
|
|
struct ip_addr a;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gu_avp = search_first_avp(gw_uri_avp_type, gw_uri_avp, &gw_uri_val, 0);
|
|
|
|
gu_avp = search_first_avp(gw_uri_avp_type, gw_uri_avp, &gw_uri_val, 0);
|
|
|
|
|
|
|
|
|
|
|
|
@ -1848,11 +1857,8 @@ static int generate_uris(struct sip_msg* _m, char *r_uri, str *r_uri_user,
|
|
|
|
decode_avp_value(gw_uri_val.s.s, gw_index, &scheme, &strip, &tag, addr,
|
|
|
|
decode_avp_value(gw_uri_val.s.s, gw_index, &scheme, &strip, &tag, addr,
|
|
|
|
&hostname, &port, ¶ms, &transport, flags);
|
|
|
|
&hostname, &port, ¶ms, &transport, flags);
|
|
|
|
|
|
|
|
|
|
|
|
if (*addr > 0) {
|
|
|
|
if (addr->af != 0) {
|
|
|
|
a.af = AF_INET;
|
|
|
|
addr_str.s = ip_addr2a(addr);
|
|
|
|
a.len = 4;
|
|
|
|
|
|
|
|
a.u.addr32[0] = *addr;
|
|
|
|
|
|
|
|
addr_str.s = ip_addr2a(&a);
|
|
|
|
|
|
|
|
addr_str.len = strlen(addr_str.s);
|
|
|
|
addr_str.len = strlen(addr_str.s);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
addr_str.len = 0;
|
|
|
|
addr_str.len = 0;
|
|
|
|
@ -2009,7 +2015,8 @@ static int next_gw(struct sip_msg* _m, char* _s1, char* _s2)
|
|
|
|
struct usr_avp *ru_avp;
|
|
|
|
struct usr_avp *ru_avp;
|
|
|
|
int rval;
|
|
|
|
int rval;
|
|
|
|
str uri_str;
|
|
|
|
str uri_str;
|
|
|
|
unsigned int flags, r_uri_len, dst_uri_len, addr, gw_index;
|
|
|
|
unsigned int flags, r_uri_len, dst_uri_len, gw_index;
|
|
|
|
|
|
|
|
struct ip_addr addr;
|
|
|
|
char r_uri[MAX_URI_LEN], dst_uri[MAX_URI_LEN];
|
|
|
|
char r_uri[MAX_URI_LEN], dst_uri[MAX_URI_LEN];
|
|
|
|
|
|
|
|
|
|
|
|
ru_avp = search_first_avp(ruri_user_avp_type, ruri_user_avp,
|
|
|
|
ru_avp = search_first_avp(ruri_user_avp_type, ruri_user_avp,
|
|
|
|
@ -2077,7 +2084,9 @@ static int next_gw(struct sip_msg* _m, char* _s1, char* _s2)
|
|
|
|
delete_avp(defunct_gw_avp_type, defunct_gw_avp);
|
|
|
|
delete_avp(defunct_gw_avp_type, defunct_gw_avp);
|
|
|
|
val.n = gw_index;
|
|
|
|
val.n = gw_index;
|
|
|
|
add_avp(defunct_gw_avp_type, defunct_gw_avp, val);
|
|
|
|
add_avp(defunct_gw_avp_type, defunct_gw_avp, val);
|
|
|
|
LM_DBG("added defunct_gw_avp <%u>", addr);
|
|
|
|
LM_DBG("added defunct_gw_avp <%x:%x:%x:%x:%x:%x:%x:%x>",
|
|
|
|
|
|
|
|
addr.u.addr16[0], addr.u.addr16[1], addr.u.addr16[2], addr.u.addr16[3],
|
|
|
|
|
|
|
|
addr.u.addr16[4], addr.u.addr16[5], addr.u.addr16[6], addr.u.addr16[7]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
|