Pārlūkot izejas kodu

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 gadi atpakaļ
vecāks
revīzija
6af319ea93
1 mainītis faili ar 52 papildinājumiem un 22 dzēšanām
  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;