فهرست منبع

Fix IPv6 handling with the default setup. With the current code,
it's possible for it to pit IPv6 address, but set adress family
to the IP4.

Maksym Sobolyev 9 سال پیش
والد
کامیت
6af319ea93
1فایلهای تغییر یافته به همراه52 افزوده شده و 22 حذف شده
  1. 52 22
      modules/rtpproxy/rtpproxy.c

+ 52 - 22
modules/rtpproxy/rtpproxy.c

@@ -2227,16 +2227,22 @@ free_opts(struct options *op1, struct options *op2, struct options *op3)
 	return (e); \
     } while (0);
 
+struct new_mediaip {
+	str strip;
+	int pf;
+};
+
 static int
 force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forcedIP)
 {
-	str body, body1, oldport, oldip, newport, newip;
+	str body, body1, oldport, oldip, newport;
+	struct new_mediaip newip;
 	str callid, from_tag, to_tag, tmp, payload_types;
 	str newrtcp = {0, 0};
 	str viabranch;
 	int create, port, len, flookup, argc, proxied, real, via, ret;
 	int orgip, commip;
-	int pf, pf1, force;
+	int pf, force;
 	struct options opts, rep_opts, pt_opts;
 	char *cp, *cp1;
 	char  *cpend, *next;
@@ -2575,10 +2581,12 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 			medianum++;
 
 			if (real != 0) {
-				newip = oldip;
+				newip.strip = oldip;
+				newip.pf = pf;
 			} else {
-				newip.s = ip_addr2a(&msg->rcv.src_ip);
-				newip.len = strlen(newip.s);
+				newip.strip.s = ip_addr2a(&msg->rcv.src_ip);
+				newip.strip.len = strlen(newip.strip.s);
+				newip.pf = msg->rcv.src_ip.af;
 			}
 			/* XXX must compare address families in all addresses */
 			if (pf == AF_INET6) {
@@ -2611,10 +2619,10 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 				}
 			}
 
-			STR2IOVEC(newip, v[9]);
+			STR2IOVEC(newip.strip, v[9]);
 			STR2IOVEC(oldport, v[11]);
 #ifdef EXTRA_DEBUG
-			LM_DBG("STR2IOVEC(newip[%.*s], v[9])", newip.len, newip.s);
+			LM_DBG("STR2IOVEC(newip[%.*s], v[9])", newip.strip.len, newip.strip.s);
 			LM_DBG("STR2IOVEC(oldport[%.*s], v[11])", oldport.len, oldport.s);
 #endif
 			if (1 || media_multi) /* XXX netch: can't choose now*/
@@ -2728,26 +2736,46 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 				FORCE_RTP_PROXY_RET (-1);
 			}
 
-			pf1 = (argc >= 3 && argv[2][0] == '6') ? AF_INET6 : AF_INET;
+			/*
+			 * if (argc == 1) {
+			 *      Assume AF in reply stays the same as one in
+			 *      the original request.
+			 * }
+			 */
+			if (argc == 2) {
+				/*
+				 * For historical reasons, if rtpproxy returns
+				 * bare address without AF flag, this means
+				 * IPv4.
+				 */
+				newip.pf = AF_INET;
+			} else if (argc >= 3) {
+				/*
+				 * When rtpproxy returns explicit address +
+				 * "AF" flag, use that.
+				 */
+				newip.pf = (argv[2][0] == '6') ? AF_INET6 : AF_INET;
+			}
 
 			if (isnulladdr(&oldip, pf)) {
-				if (pf1 == AF_INET6) {
-					newip.s = "::";
-					newip.len = 2;
+				if (newip.pf == AF_INET6) {
+					newip.strip.s = "::";
+					newip.strip.len = 2;
 				} else {
-					newip.s = "0.0.0.0";
-					newip.len = 7;
+					newip.strip.s = "0.0.0.0";
+					newip.strip.len = 7;
 				}
 			} else {
 				if (forcedIP) {
-					newip.s = str2;
-					newip.len = strlen(newip.s);
+					newip.strip.s = str2;
+					newip.strip.len = strlen(newip.strip.s);
 #ifdef EXTRA_DEBUG
-					LM_DBG("forcing IP='%.*s'\n", newip.len, newip.s);
+					LM_DBG("forcing IP='%.*s'\n", newip.strip.len,
+					    newip.strip.s);
 #endif
 				} else {
-					newip.s = (argc < 2) ? str2 : argv[1];
-					newip.len = strlen(newip.s);
+					newip.strip.s = (argc < 2) ? str2 : argv[1];
+					newip.strip.len = strlen(newip.strip.s);
 				}
 			}
 			/* marker to double check : newport goes: str -> int -> str ?!?! */
@@ -2796,7 +2824,7 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 				body1.s = sdp_stream->ice_attr->foundation.s - 12;
 				body1.len = bodylimit - body1.s;
 				if (insert_candidates(msg, sdp_stream->ice_attr->foundation.s - 12,
-						&newip, port, ice_candidate_priority_val.n) == -1) {
+						&newip.strip, port, ice_candidate_priority_val.n) == -1) {
 					FORCE_RTP_PROXY_RET (-1);
 				}
 			}
@@ -2813,7 +2841,7 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 #ifdef EXTRA_DEBUG
 				LM_DBG("alter ip body1='%.*s'\n", body1.len, body1.s);
 #endif
-				if (alter_mediaip(msg, &body1, &oldip, pf, &newip, pf1, 0)==-1) {
+				if (alter_mediaip(msg, &body1, &oldip, pf, &newip.strip, newip.pf, 0)==-1) {
 					FORCE_RTP_PROXY_RET (-1);
 				}
 				if (!c2p)
@@ -2828,7 +2856,8 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 #ifdef EXTRA_DEBUG
 				LM_DBG("alter common ip body1='%.*s'\n", body1.len, body1.s);
 #endif
-				if (alter_mediaip(msg, &body1, &sdp_session->ip_addr, sdp_session->pf, &newip, pf1, 0)==-1) {
+				if (alter_mediaip(msg, &body1, &sdp_session->ip_addr,
+				    sdp_session->pf, &newip.strip, newip.pf, 0)==-1) {
 					FORCE_RTP_PROXY_RET (-1);
 				}
 				c1p_altered = 1;
@@ -2842,7 +2871,8 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 #ifdef EXTRA_DEBUG
 				LM_DBG("alter media ip body1='%.*s'\n", body1.len, body1.s);
 #endif
-				if (alter_mediaip(msg, &body1, &sdp_session->o_ip_addr, sdp_session->o_pf, &newip, pf1, 0)==-1) {
+				if (alter_mediaip(msg, &body1, &sdp_session->o_ip_addr,
+				    sdp_session->o_pf, &newip.strip, newip.pf, 0)==-1) {
 					FORCE_RTP_PROXY_RET (-1);
 				}
 				o1p = 0;