Module: kamailio Branch: 5.4 Commit: fd4dd36319599867e590098d86dc37186595cfad URL: https://github.com/kamailio/kamailio/commit/fd4dd36319599867e590098d86dc3718...
Author: Arsen Semenov arsperger@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2020-10-12T10:13:02+02:00
nathelper: fix_nated_sdp added support for a=rtcp param RFC3605
- GH #2459
(cherry picked from commit 088738ce16e73339e4c1b78c11f6ad6f8f3394cf)
---
Modified: src/modules/nathelper/nathelper.c
---
Diff: https://github.com/kamailio/kamailio/commit/fd4dd36319599867e590098d86dc3718... Patch: https://github.com/kamailio/kamailio/commit/fd4dd36319599867e590098d86dc3718...
---
diff --git a/src/modules/nathelper/nathelper.c b/src/modules/nathelper/nathelper.c index 396e8b5323..3a295e2067 100644 --- a/src/modules/nathelper/nathelper.c +++ b/src/modules/nathelper/nathelper.c @@ -116,7 +116,7 @@ static int pv_get_rr_count_f(struct sip_msg *, pv_param_t *, pv_value_t *); static int pv_get_rr_top_count_f(struct sip_msg *, pv_param_t *, pv_value_t *); static int fix_nated_sdp_f(struct sip_msg *, char *, char *); static int is_rfc1918_f(struct sip_msg *, char *, char *); -static int extract_mediaip(str *, str *, int *, char *); +static int extract_mediaip(str *, str *, int *, char *, int); static int alter_mediaip(struct sip_msg *, str *, str *, int, str *, int, int); static int fix_nated_register_f(struct sip_msg *, char *, char *); static int fixup_fix_nated_register(void **param, int param_no); @@ -1611,7 +1611,7 @@ static int is_rfc1918_f(struct sip_msg *msg, char *str1, char *str2)
/* replace ip addresses in SDP and return umber of replacements */ static inline int replace_sdp_ip( - struct sip_msg *msg, str *org_body, char *line, str *ip) + struct sip_msg *msg, str *org_body, char *line, str *ip, int linelen) { str body1, oldip, newip; str body = *org_body; @@ -1631,7 +1631,7 @@ static inline int replace_sdp_ip( } body1 = body; for(;;) { - if(extract_mediaip(&body1, &oldip, &pf, line) == -1) + if(extract_mediaip(&body1, &oldip, &pf, line, linelen) == -1) break; if(pf != AF_INET) { LM_ERR("not an IPv4 address in '%s' SDP\n", line); @@ -1734,20 +1734,31 @@ static int ki_fix_nated_sdp_ip(sip_msg_t *msg, int level, str *ip) } }
- if(level & FIX_MEDIP) { - /* Iterate all c= and replace ips in them. */ - ret = replace_sdp_ip(msg, &body, "c=", (ip && ip->len>0) ? ip : 0); - if(ret == -1) - return -1; - count += ret; - } + if(level & (FIX_MEDIP | FIX_ORGIP)) {
- if(level & FIX_ORGIP) { - /* Iterate all o= and replace ips in them. */ - ret = replace_sdp_ip(msg, &body, "o=", (ip && ip->len>0) ? ip : 0); + /* Iterate all a=rtcp and replace ips in them. rfc3605 */ + ret = replace_sdp_ip(msg, &body, "a=rtcp", (ip && ip->len>0) ? ip : 0, 6); if(ret == -1) - return -1; - count += ret; + LM_DBG("a=rtcp parameter does not exist. nothing to do.\n"); + else + count += ret; + + if(level & FIX_MEDIP) { + /* Iterate all c= and replace ips in them. */ + ret = replace_sdp_ip(msg, &body, "c=", (ip && ip->len>0) ? ip : 0, 2); + if(ret == -1) + return -1; + count += ret; + } + + if(level & FIX_ORGIP) { + /* Iterate all o= and replace ips in them. */ + ret = replace_sdp_ip(msg, &body, "o=", (ip && ip->len>0) ? ip : 0, 2); + if(ret == -1) + return -1; + count += ret; + } + }
return count > 0 ? 1 : 2; @@ -1775,22 +1786,22 @@ static int fix_nated_sdp_f(struct sip_msg *msg, char *str1, char *str2) return ki_fix_nated_sdp_ip(msg, level, &ip); }
-static int extract_mediaip(str *body, str *mediaip, int *pf, char *line) +static int extract_mediaip(str *body, str *mediaip, int *pf, char *line, int linelen) { char *cp, *cp1; int len, nextisip;
cp1 = NULL; for(cp = body->s; (len = body->s + body->len - cp) > 0;) { - cp1 = ser_memmem(cp, line, len, 2); + cp1 = ser_memmem(cp, line, len, linelen); if(cp1 == NULL || cp1[-1] == '\n' || cp1[-1] == '\r') break; - cp = cp1 + 2; + cp = cp1 + linelen; } if(cp1 == NULL) return -1;
- mediaip->s = cp1 + 2; + mediaip->s = cp1 + linelen; mediaip->len = eat_line(mediaip->s, body->s + body->len - mediaip->s) - mediaip->s; trim_len(mediaip->len, mediaip->s, *mediaip);