Differentiate between 'v' (via1) and 'V' (via2) handling.

- TBD: all other options are case insensitive, think about adding another option
  for via2 handling.
- Only send via separator if v|V is given.
3.1
Andreas Granig 14 years ago
parent a155b5e3e5
commit 9614e4ad5e

@ -1432,7 +1432,7 @@ char *
send_rtpp_command(struct rtpp_node *node, struct iovec *v, int vcnt)
{
struct sockaddr_un addr;
int fd, len, i, j;
int fd, len, i;
char *cp;
static char buf[256];
struct pollfd fds[1];
@ -1459,10 +1459,6 @@ send_rtpp_command(struct rtpp_node *node, struct iovec *v, int vcnt)
goto badproxy;
}
for(j = 0; j < vcnt; ++j) {
str s; s.s = v[j].iov_base; s.len = v[j].iov_len;
LM_ERR(">>>>>>> write '%.*s' to rtpp", s.len, s.s);
}
do {
len = writev(fd, v + 1, vcnt - 1);
} while (len == -1 && errno == EINTR);
@ -1646,20 +1642,25 @@ static int
unforce_rtp_proxy1_f(struct sip_msg* msg, char* str1, char* str2)
{
char *cp;
int via;
int via1, via2;
str callid, from_tag, to_tag, viabranch;
struct rtpp_node *node;
int iovec_count;
struct iovec v[1 + 6 + 3] = {{NULL, 0}, {"D", 1}, {" ", 1}, {NULL, 0}, {";", 1}, {NULL, 0}, {" ", 1}, {NULL, 0}, {" ", 1}, {NULL, 0}};
/* 1 */ /* 2 */ /* 3 */ /* 4 */ /* 5 */ /* 6 */ /* 1 */
struct iovec v[1 + 6 + 3] = {{NULL, 0}, {"D", 1}, {" ", 1}, {NULL, 0}, {NULL, 0}, {NULL, 0}, {" ", 1}, {NULL, 0}, {" ", 1}, {NULL, 0}};
char *viasepchar = ";";
str viasep;
via = 0;
via1 = via2 = 0;
viasep.s = viasepchar; viasep.len = 1;
for (cp = str1; cp != NULL && *cp != '\0'; cp++) {
switch (*cp) {
case 'v':
via1 = 1;
break;
case 'V':
via = 1;
via2 = 1;
break;
default:
@ -1672,11 +1673,15 @@ unforce_rtp_proxy1_f(struct sip_msg* msg, char* str1, char* str2)
LM_ERR("can't get Call-Id field\n");
return -1;
}
if (via && get_via1_branch(msg, &viabranch) == -1 && viabranch.len == 0) {
if (via1 && get_via1_branch(msg, &viabranch) == -1 && viabranch.len == 0) {
LM_ERR("can't get via1 branch\n");
return -1;
} else if(via) {
LM_ERR(">>> extracted via1 branch '%.*s'\n", viabranch.len, viabranch.s);
} else if (via2 && get_via2_branch(msg, &viabranch) == -1 && viabranch.len == 0) {
LM_ERR("can't get via2 branch\n");
return -1;
} else if(via1 || via2) {
LM_ERR(">>> extracted via branch '%.*s'\n", viabranch.len, viabranch.s);
STR2IOVEC(viasep, v[4]);
STR2IOVEC(viabranch, v[5]);
}
to_tag.s = 0;
@ -1828,7 +1833,7 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer)
str body, body1, oldport, oldip, newport, newip;
str callid, from_tag, to_tag, tmp, payload_types;
str newrtcp, viabranch;
int create, port, len, flookup, argc, proxied, real, via;
int create, port, len, flookup, argc, proxied, real, via1, via2;
int orgip, commip;
int pf, pf1, force, swap;
struct options opts, rep_opts, pt_opts;
@ -1837,6 +1842,8 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer)
char **ap, *argv[10];
struct lump* anchor;
struct rtpp_node *node;
char *viasepchar = ";";
str viasep;
struct iovec v[] = {
{NULL, 0}, /* reserved (cookie) */
{NULL, 0}, /* command & common options */
@ -1844,7 +1851,7 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer)
{NULL, 0}, /* per-media/per-node options 2 */
{" ", 1}, /* separator */
{NULL, 0}, /* callid */
{";", 1}, /* separator */
{NULL, 0}, /* via-separator ";" */
{NULL, 0}, /* via-branch */
{" ", 1}, /* separator */
{NULL, 7}, /* newip */
@ -1884,7 +1891,8 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer)
LM_ERR("out of pkg memory\n");
FORCE_RTP_PROXY_RET (-1);
}
flookup = force = real = orgip = commip = swap = via = 0;
flookup = force = real = orgip = commip = swap = via1 = via2 = 0;
viasep.s = viasepchar; viasep.len = 1;
for (cp = str1; cp != NULL && *cp != '\0'; cp++) {
switch (*cp) {
case 'a':
@ -1952,8 +1960,11 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer)
break;
case 'v':
via1 = 1;
break;
case 'V':
via = 1;
via2 = 1;
break;
case 'w':
@ -2010,11 +2021,15 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer)
LM_ERR("can't get From tag\n");
FORCE_RTP_PROXY_RET (-1);
}
if(via && get_via1_branch(msg, &viabranch) == -1 && viabranch.len == 0) {
if(via1 && get_via1_branch(msg, &viabranch) == -1 && viabranch.len == 0) {
LM_ERR("can't get via1 branch\n");
FORCE_RTP_PROXY_RET (-1);
} else if(via) {
LM_ERR(">>> extracted via1 branch '%.*s'\n", viabranch.len, viabranch.s);
} else if(via2 && get_via2_branch(msg, &viabranch) == -1 && viabranch.len == 0) {
LM_ERR("can't get via2 branch\n");
FORCE_RTP_PROXY_RET (-1);
} else if(via1 || via2) {
LM_ERR(">>> extracted via branch '%.*s'\n", viabranch.len, viabranch.s);
STR2IOVEC(viasep, v[4]);
STR2IOVEC(viabranch, v[5]);
}
/* LOGIC

@ -345,14 +345,12 @@ get_callid(struct sip_msg* _m, str* _cid)
return 0;
}
int
get_via1_branch(struct sip_msg* _m, str* _branch)
static int
get_via_branch(hdr_field_t *hdr, str* _branch)
{
hdr_field_t *hdr;
struct via_body *via;
struct via_param *p;
hdr = _m->h_via1;
via = (struct via_body*)hdr->parsed;
for(p = via->param_lst; p; p = p->next)
{
@ -367,6 +365,25 @@ get_via1_branch(struct sip_msg* _m, str* _branch)
}
int
get_via1_branch(struct sip_msg* _m, str* _branch)
{
hdr_field_t *hdr;
hdr = _m->h_via1;
return get_via_branch(hdr, _branch);
}
int
get_via2_branch(struct sip_msg* _m, str* _branch)
{
hdr_field_t *hdr;
hdr = _m->h_via2;
return get_via_branch(hdr, _branch);
}
/*
* Extract tag from To header field of a response
* assumes the to header is already parsed, so

@ -33,6 +33,7 @@ int check_content_type(struct sip_msg * );
void *ser_memmem(const void *, const void *, size_t, size_t);
int get_callid(struct sip_msg *, str *);
int get_via1_branch(struct sip_msg *, str *);
int get_via2_branch(struct sip_msg *, str *);
int get_to_tag(struct sip_msg *, str *);
int get_from_tag(struct sip_msg *, str *);
int get_contact_uri(struct sip_msg *, struct sip_uri *, contact_t **);

Loading…
Cancel
Save