[Serdev] Video NAT traversal
Maxim Sobolev
sobomax at portaone.com
Fri Jan 23 15:41:27 UTC 2004
Yes, I think it will, but first I would like to finish my support for
RTP-asymmetric clients and new bridging mode in rtp proxy. I will try to
take look at video support after that (in 3-4 days).
-Maxim
Rodrigo Frez wrote:
> That I dont know!
>
> -----Original Message-----
> From: Adrian Georgescu [mailto:ag at ag-projects.com]
> Sent: Viernes, 23 de Enero de 2004 10:57
> To: Rodrigo Frez
> Cc: serdev at lists.iptel.org
> Subject: Re: [Serdev] Video NAT traversal
>
>
> Sounds good!
>
> Is this officially accepted by Maxim? Will this be committed to CVS
> main tree?
>
>
> On 23 Jan 2004, at 14:52, Rodrigo Frez wrote:
>
>
>>The patch from gbernard works very well with two messenger clients
>>behind nat
>>
>>#################################################################
>>
>>--- nathelper.c.org Sun Jan 18 22:36:30 2004
>>+++ nathelper.c Mon Jan 19 14:23:32 2004
>>@@ -49,6 +49,10 @@
>> * proxied and ignores sessions with such flag.
>> * o Added run-time check for version of command protocol
>> * supported by the RTP proxy.
>>+ * 2004-01-19 o Added support for a second RTP flow (ie VIDEO)
>>+ * o Added support for RTCP (not tested)
>>+ * (G. Bernard IPDirections)
>>+ *
>> */
>>
>> #include "nhelpr_funcs.h"
>>@@ -106,7 +110,7 @@
>> static int fix_nated_contact_f(struct sip_msg *, char *, char *);
>>static int fix_nated_sdp_f(struct sip_msg *, char *, char *); static
>>int extract_mediaip(str *, str *); -static int extract_mediaport(str
>>*, str *);
>>+static int extract_mediaport(str *, str *, str *, char *);
>> static int alter_mediaip(struct sip_msg *, str *, str *, str *, int);
>
>
>>static int alter_mediaport(struct sip_msg *, str *, str *, str *,
>>int); static char *send_rtpp_command(const struct iovec *, int, int);
>>@@ -574,35 +578,59 @@
>> }
>>
>> static int
>>-extract_mediaport(str *body, str *mediaport)
>>+extract_mediaport(str *body, str *mediaport, str *mediactl, char
>>*type)
>> {
>> char *cp, *cp1;
>> int len;
>>
>>- cp1 = NULL;
>>- for (cp = body->s; (len = body->s + body->len - cp) > 0;) {
>>- cp1 = ser_memmem(cp, "m=", len, 2);
>>- if (cp1 == NULL || cp1[-1] == '\n' || cp1[-1] == '\r')
>>- break;
>>- cp = cp1 + 2;
>>- }
>>+ cp1 = body->s;
>> if (cp1 == NULL) {
>>- LOG(L_ERR, "ERROR: extract_mediaport: no `m=' in
>>SDP\n");
>>+ LOG(L_ERR, "ERROR: extract_mediaport: no body\n");
>> return -1;
>> }
>>- mediaport->s = cp1 + 2;
>>- mediaport->len = eat_line(mediaport->s, body->s + body->len -
>>- mediaport->s) - mediaport->s;
>>- trim_len(mediaport->len, mediaport->s, *mediaport);
>>-
>>- if (mediaport->len < 7 || memcmp(mediaport->s, "audio", 5) !=
>
> 0
>
>>||
>>- !isspace((int)mediaport->s[5])) {
>>- LOG(L_ERR, "ERROR: extract_mediaport: can't parse `m='
>>in SDP\n");
>>- return -1;
>>+ while (cp1) {
>>+ for (cp = cp1; (len = body->s + body->len - cp) > 0;)
>
> {
>
>>+ cp1 = ser_memmem(cp, "m=", len, 2);
>>+ if (cp1 == NULL || cp1[-1] == '\n' || cp1[-1]
>>==
>>'\r')
>>+ break;
>>+ cp = cp1 + 2;
>>+ }
>>+ if (cp1 == NULL) {
>>+ LOG(L_ERR,
>>+ "ERROR: extract_mediaport: no `m=%s'
>>+ in
>>SDP\n",
>>+ type);
>>+ return -1;
>>+ }
>>+ cp1 += 2;
>>+ mediaport->s = cp1;
>>+ mediaport->len = eat_line(mediaport->s, body->s +
>>body->len -
>>+ mediaport->s) - mediaport->s;
>>+ trim_len(mediaport->len, mediaport->s, *mediaport);
>>+
>>+ if (!(mediaport->len < 7 || memcmp(mediaport->s, type,
>>5) != 0
>>+ || !isspace((int)mediaport->s[5]))) break;
>> }
>> cp = eat_space_end(mediaport->s + 5, mediaport->s +
>>mediaport->len);
>> mediaport->len = eat_token_end(cp, mediaport->s +
>>mediaport->len) - cp;
>> mediaport->s = cp;
>>+ mediactl->len = -1;
>>+ if (cp1 == NULL) {
>>+ LOG(L_ERR, "ERROR: extract_mediaport: no rctp port
>>found\n");
>>+ return 1;
>>+ }
>>+ for (cp = cp1; (len = body->s + body->len - cp) > 0;) {
>>+ cp1 = ser_memmem(cp, "a=rtcp:", len, 7);
>>+ if (cp1 == NULL || cp1[-1] == '\n' || cp1[-1] == '\r')
>>+ break;
>>+ cp = cp1 + 7;
>>+ }
>>+ if (cp1 != NULL) {
>>+ cp1 += 7;
>>+ mediactl->s = cp1;
>>+ mediactl->len = eat_line(mediactl->s, body->s +
>>body->len -
>>+ mediactl->s) - mediactl->s;
>>+ trim_len(mediactl->len, mediactl->s, *mediactl);
>>+ }
>> return 1;
>> }
>>
>>@@ -774,7 +802,7 @@
>> static int
>> unforce_rtp_proxy_f(struct sip_msg* msg, char* str1, char* str2) {
>>- str callid, from_tag, to_tag;
>>+ str callid, from_tag, to_tag, tag;
>> struct iovec v[4 + 3] = {{"D", 1}, {" ", 1}, {NULL, 0}, {" ",
>>1}, {NULL, 0}, {" ", 1}, {NULL, 0}};
>> /* 0 */ /* 1 */ /* 2 */ /* 3
>
> */
>
>>/* 4 */ /* 5 */ /* 6 */
>>
>>@@ -795,10 +823,26 @@
>> LOG(L_ERR, "ERROR: unforce_rtp_proxy: can't get From
>>tag\n");
>> return -1;
>> }
>>- STR2IOVEC(callid, v[2]);
>>+ tag.s = pkg_malloc(callid.len + 6);
>>+ if (tag.s == NULL) {
>>+ LOG(L_ERR, "ERROR: type_tag: out of memory\n");
>>+ return -1;
>>+ }
>>+ strcpy(tag.s, "audio-");
>>+ strncat(tag.s, callid.s, callid.len);
>>+ tag.len = callid.len + 6;
>>+ tag.s[tag.len] = (char)0;
>>+ STR2IOVEC(tag, v[2]);
>> STR2IOVEC(from_tag, v[4]);
>> STR2IOVEC(to_tag, v[6]);
>> send_rtpp_command(v, (to_tag.len > 0) ? 7 : 5, 0);
>>+ strcpy(tag.s, "video-");
>>+ strncat(tag.s, callid.s, callid.len);
>>+ tag.len = callid.len + 6;
>>+ tag.s[tag.len] = (char)0;
>>+ STR2IOVEC(tag, v[2]);
>>+ send_rtpp_command(v, (to_tag.len > 0) ? 7 : 5, 0);
>>+ pkg_free(tag.s);
>>
>> return 1;
>> }
>>@@ -806,10 +850,12 @@
>> static int
>> force_rtp_proxy_f(struct sip_msg* msg, char* str1, char* str2) {
>>- str body, body1, oldport, oldip, oldip1, newport, newip;
>>- str callid, from_tag, to_tag;
>>- int create, port, len;
>>+ str body, body1, oldport, oldctl, oldvport, oldvctl, oldip,
>>oldip1;
>>+ str newvport, newport, newip;
>>+ str callid, from_tag, to_tag, tag;
>>+ int create, port, portv=0, len;
>> char buf[16];
>>+ char fub[16];
>> char *cp, *cp1;
>> struct lump* anchor;
>> struct iovec v[6 + 5] = {{"U", 1}, {" ", 1}, {NULL, 0}, {" ",
>>1}, {NULL, 7}, {" ", 1}, {NULL, 1}, {" ", 1}, {NULL, 0}, {" ", 1},
>>{NULL, 0}}; @@ -868,29 +914,80 @@
>> if (extract_mediaip(&body1, &oldip1) == -1) {
>> oldip1.len = 0;
>> }
>>- if (extract_mediaport(&body, &oldport) == -1) {
>>- LOG(L_ERR, "ERROR: force_rtp_proxy: can't extract
>
> media
>
>>port "
>>+ if (extract_mediaport(&body, &oldport, &oldctl, "audio") ==
>>+ -1)
>>{
>>+ LOG(L_ERR, "ERROR: force_rtp_proxy: can't extract
>>+ audio
>>port "
>> "from the message\n");
>> return -1;
>> }
>>+ if (oldctl.len > 0)
>>+ LOG(L_DBG, "DEBUG: Found Audio RTP/RTCP ports\n");
>>+ else
>>+ LOG(L_DBG, "DEBUG: Found Audio RTP port\n");
>>+ if (extract_mediaport(&body, &oldvport, &oldvctl, "video") ==
>>-1) {
>>+ LOG(L_ERR, "ERROR: force_rtp_proxy: can't extract
>>+ video
>>port "
>>+ "from the message\n");
>>+ oldvport.len = oldvctl.len = -1;
>>+ }
>>+ if (oldvctl.len > 0)
>>+ LOG(L_DBG, "DEBUG: Found Video RTP/RTCP ports\n");
>>+ else if (oldvport.len > 0)
>>+ LOG(L_DBG, "DEBUG: Found Video RTP port\n");
>> newip.s = ip_addr2a(&msg->rcv.src_ip);
>> newip.len = strlen(newip.s);
>> if (create == 0)
>> v[0].iov_base = "L";
>>- STR2IOVEC(callid, v[2]);
>>+ tag.s = pkg_malloc(callid.len + 6);
>>+ if (tag.s == NULL) {
>>+ LOG(L_ERR, "ERROR: force_rtpproxy: out of memory\n");
>>+ return -1;
>>+ }
>>+ strcpy(tag.s, "audio-");
>>+ strncat(tag.s, callid.s, callid.len);
>>+ tag.len = callid.len + 6;
>>+ tag.s[tag.len] = (char)0;
>>+ STR2IOVEC(tag, v[2]);
>> STR2IOVEC(newip, v[4]);
>> STR2IOVEC(oldport, v[6]);
>> STR2IOVEC(from_tag, v[8]);
>> STR2IOVEC(to_tag, v[10]);
>>+ LOG(L_DBG, "DEBUG: Call-ID set to: %s\n", tag.s);
>> cp = send_rtpp_command(v, (to_tag.len > 0) ? 11 : 9, 1);
>>+ pkg_free(tag.s);
>> if (cp == NULL)
>> return -1;
>>+ LOG(L_DBG, "DEBUG: New audio port is %s", cp);
>> port = atoi(cp);
>>- if (port <= 0 || port > 65535)
>>+ if (port <= 0 || port > 65534)
>> return -1;
>>
>> newport.s = buf;
>> newport.len = sprintf(buf, "%d", port);
>>+
>>+ if (oldvport.len > 0) {
>>+ tag.s = pkg_malloc(callid.len + 6);
>>+ if (tag.s == NULL) {
>>+ LOG(L_ERR, "ERROR: force_rtpproxy: out of
>>memory\n");
>>+ return -1;
>>+ }
>>+ strcpy(tag.s, "video-");
>>+ strncat(tag.s, callid.s, callid.len);
>>+ tag.len = callid.len + 6;
>>+ tag.s[tag.len] = (char)0;
>>+ STR2IOVEC(tag, v[2]);
>>+ STR2IOVEC(oldvport, v[6]);
>>+ LOG(L_DBG, "DEBUG: Call-ID set to: %s\n", tag.s);
>>+ cp = send_rtpp_command(v, (to_tag.len > 0) ? 11 : 9,
>>1);
>>+ pkg_free(tag.s);
>>+ if (cp == NULL)
>>+ return -1;
>>+ LOG(L_DBG, "DEBUG: New video port is %s", cp);
>>+ portv = atoi(cp);
>>+ if (portv <= 0 || portv > 65534)
>>+ return -1;
>>+ newvport.s = fub;
>>+ newvport.len = sprintf(fub, "%d", portv);
>>+ }
>>+
>> newip.s = ip_addr2a(&msg->rcv.dst_ip);
>> newip.len = strlen(newip.s);
>>
>>@@ -901,6 +998,21 @@
>> return -1;
>> if (alter_mediaport(msg, &body, &oldport, &newport, 0) == -1)
>> return -1;
>>+ port++;
>>+ newport.s = buf;
>>+ newport.len = sprintf(buf, "%d", port);
>>+ if (oldctl.len > 0 &&
>>+ alter_mediaport(msg, &body, &oldctl, &newport, 0) ==
>>-1)
>>+ return -1;
>>+ if (oldvport.len > 0 &&
>>+ alter_mediaport(msg, &body, &oldvport, &newvport, 0)
>>+ ==
>>-1)
>>+ return -1;
>>+ portv++;
>>+ newvport.s = fub;
>>+ newvport.len = sprintf(fub, "%d", portv);
>>+ if (oldvport.len > 0 && oldvctl.len > 0 &&
>>+ alter_mediaport(msg, &body, &oldvctl, &newvport, 0) ==
>>-1)
>>+ return -1;
>>
>> cp = pkg_malloc(ANORTPPROXY_LEN * sizeof(char));
>> if (cp == NULL) {
>>
>>#################################################################
>>-----Original Message-----
>>From: Adrian Georgescu [mailto:ag at ag-projects.com]
>>Sent: Viernes, 23 de Enero de 2004 10:43
>>To: serdev at lists.iptel.org
>>Subject: [Serdev] Video NAT traversal
>>
>>
>>If nobody is bussy with this I am prepared to allocated resources for
>>this project.
>>
>>I will check personally with Maxim but any feed back is appreciated.
>>
>>---
>>Adrian
>>
>>_______________________________________________
>>Serdev mailing list
>>serdev at lists.iptel.org http://lists.iptel.org/mailman/listinfo/serdev
>>
>>
>
>
>
>
> _______________________________________________
> Serdev mailing list
> serdev at lists.iptel.org
> http://lists.iptel.org/mailman/listinfo/serdev
>
>
>
More information about the Serdev
mailing list