⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 darwin_ipv6.patch

📁 使Darwin服务器能够支持IPv6的补丁
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
diff -u --new-file --recursive darwin-start/APICommonCode/SDPSourceInfo.cpp darwin/APICommonCode/SDPSourceInfo.cpp--- darwin-start/APICommonCode/SDPSourceInfo.cpp	Mon Jun 10 17:32:49 2002+++ darwin/APICommonCode/SDPSourceInfo.cpp	Tue Jul  2 15:31:08 2002@@ -194,7 +194,7 @@ 	fStreamArray = NEW StreamInfo[fNumStreams];  	// set the default destination as our default IP address and set the default ttl-	theGlobalStreamInfo.fDestIPAddr = INADDR_ANY;+	theGlobalStreamInfo.fDestIPAddr.v4 = INADDR_ANY; 	theGlobalStreamInfo.fTimeToLive = kDefaultTTL; 		 	//Set bufferdelay to default of 3@@ -227,7 +227,7 @@ 			{ 				if (hasGlobalStreamInfo) 				{-					fStreamArray[theStreamIndex].fDestIPAddr = theGlobalStreamInfo.fDestIPAddr;+					memcpy(&(fStreamArray[theStreamIndex].fDestIPAddr.v6), &(theGlobalStreamInfo.fDestIPAddr.v6), sizeof(struct in6_addr)); 					fStreamArray[theStreamIndex].fTimeToLive = theGlobalStreamInfo.fTimeToLive; 				} 				fStreamArray[theStreamIndex].fTrackID = currentTrack;@@ -331,8 +331,25 @@ 			{ 				//get the IP address off this header 				StringParser cParser(&sdpLine);-				cParser.ConsumeLength(NULL, 9);//strip off "c=in ip4 "-				UInt32 tempIPAddr = SDPSourceInfo::GetIPAddr(&cParser, '/');+				// cParser.ConsumeLength(NULL, 9);//strip off "c=in ip4 "+				+				// +				// Diff v4 and v6+				//+				cParser.ConsumeLength(NULL, 7);//strip off "c=in ip"+				UInt32 s_family = cParser.ConsumeInteger(NULL);+				+				union {+				  UInt32 v4;+				  struct in6_addr v6;+				} tempIPAddr;++				if (s_family == 4) // v4 family +				  tempIPAddr.v4 = SDPSourceInfo::GetIPAddr(&cParser, '/');+				else if (s_family == 6) // v6 family+				  memcpy(&(tempIPAddr.v6), SDPSourceInfo::GetIPAddr6(&cParser, '/'), sizeof(struct in6_addr));+				else +				  Assert(0); 								 				//grab the ttl 				SInt32 tempTtl = kDefaultTTL;@@ -347,10 +364,30 @@ 				{ 					//if this c= line is part of a stream, it overrides the 					//global stream information-					fStreamArray[theStreamIndex - 1].fDestIPAddr = tempIPAddr;+				  if (s_family == 4)+				    {+					fStreamArray[theStreamIndex - 1].fDestIPAddr.v4 = tempIPAddr.v4;+					fStreamArray[theStreamIndex - 1].family = AF_INET;+				    }+				  else if (s_family == 6)+				    {+					memcpy(&(fStreamArray[theStreamIndex - 1].fDestIPAddr.v6), &(tempIPAddr.v6), sizeof(struct in6_addr));+					fStreamArray[theStreamIndex - 1].family = AF_INET6;+				    }+ 					fStreamArray[theStreamIndex - 1].fTimeToLive = tempTtl; 				} else {-					theGlobalStreamInfo.fDestIPAddr = tempIPAddr;+				  if (s_family == 4)+				    {+					theGlobalStreamInfo.fDestIPAddr.v4 = tempIPAddr.v4;+					theGlobalStreamInfo.family = AF_INET;+				    }+				  else if (s_family == 6)+				    {+					memcpy(&(theGlobalStreamInfo.fDestIPAddr.v6), &(tempIPAddr.v6), sizeof(struct in6_addr));+					theGlobalStreamInfo.family = AF_INET6;+				    }+ 					theGlobalStreamInfo.fTimeToLive = tempTtl; 					hasGlobalStreamInfo = true; 				}@@ -391,6 +428,30 @@ 	 	// Make sure to put the old char back! 	ipAddrStr.Ptr[ipAddrStr.Len] = endChar;++	return ipAddr;+}++struct in6_addr* SDPSourceInfo::GetIPAddr6(StringParser* inParser, char inStopChar)+{+	StrPtrLen ipAddrStr;++	// Get the IP addr str+	inParser->ConsumeUntil(&ipAddrStr, inStopChar);+	+	if (ipAddrStr.Len == 0)+		return 0;+	+	// NULL terminate it+	char endChar = ipAddrStr.Ptr[ipAddrStr.Len];+	ipAddrStr.Ptr[ipAddrStr.Len] = '\0';+	+	//inet_addr returns numeric IP addr in network byte order, make+	//sure to convert to host order.+	struct in6_addr* ipAddr = SocketUtils::ConvertStringToAddr6(ipAddrStr.Ptr);+	+	// Make sure to put the old char back!+	ipAddrStr.Ptr[ipAddrStr.Len] = endChar;  	return ipAddr; }diff -u --new-file --recursive darwin-start/APICommonCode/SDPSourceInfo.h darwin/APICommonCode/SDPSourceInfo.h--- darwin-start/APICommonCode/SDPSourceInfo.h	Mon Jun 10 17:32:49 2002+++ darwin/APICommonCode/SDPSourceInfo.h	Tue Jul  2 15:31:08 2002@@ -63,6 +63,8 @@ 		// decimal IP address, this consumes it (stopping at inStopChar), and returns 		// the IP address (host ordered) as a UInt32 		static UInt32 GetIPAddr(StringParser* inParser, char inStopChar);++		static struct in6_addr* GetIPAddr6(StringParser* inParser, char inStopChar); 		 	private: diff -u --new-file --recursive darwin-start/APICommonCode/SourceInfo.cpp darwin/APICommonCode/SourceInfo.cpp--- darwin-start/APICommonCode/SourceInfo.cpp	Mon Jun 10 17:32:49 2002+++ darwin/APICommonCode/SourceInfo.cpp	Tue Jul  2 15:31:08 2002@@ -35,7 +35,7 @@ #include "OSMemory.h"  SourceInfo::SourceInfo(const SourceInfo& copy)-: 	fStreamArray(NULL), fNumStreams(copy.fNumStreams), +  : 	family(copy.family), fStreamArray(NULL), fNumStreams(copy.fNumStreams),  	fOutputArray(NULL), fNumOutputs(copy.fNumOutputs), 	fTimeSet(copy.fTimeSet),fStartTimeUnixSecs(copy.fStartTimeUnixSecs), 	fEndTimeUnixSecs(copy.fEndTimeUnixSecs), fSessionControlType(copy.fSessionControlType)@@ -80,9 +80,18 @@ 		if (fStreamArray[x].fIsTCP) 			continue; 			-		if ((!this->IsReflectableIPAddr(fStreamArray[x].fDestIPAddr)) ||+		if (family == AF_INET)+		  {+		    if ((!this->IsReflectableIPAddr(fStreamArray[x].fDestIPAddr.v4)) || 			(fStreamArray[x].fTimeToLive == 0))-			return false;+		      return false;+		  }+		else if (family == AF_INET6)+		  {+		    if ((!this->IsReflectableIPAddr(&(fStreamArray[x].fDestIPAddr.v6))) ||+			(fStreamArray[x].fTimeToLive == 0))+		      return false;+		  } 	} 	return true; }@@ -94,6 +103,13 @@ 	return false; } +Bool16	SourceInfo::IsReflectableIPAddr(struct in6_addr* inIPAddr)+{+	if (SocketUtils::IsMulticastIPAddr(inIPAddr) || SocketUtils::IsLocalIPAddr(inIPAddr))+		return true;+	return false;+}+ Bool16	SourceInfo::HasTCPStreams() {	 	//each stream's info must meet certain criteria@@ -256,11 +272,20 @@ 	// Check the src & dest addr, and port of each stream.  	for (UInt32 x = 0; x < this->GetNumStreams(); x++) 	{-		if (GetStreamInfo(x)->fDestIPAddr != inInfo->GetStreamInfo(x)->fDestIPAddr)+	  if (inInfo->family == AF_INET)+	    {+		if (GetStreamInfo(x)->fDestIPAddr.v4 != inInfo->GetStreamInfo(x)->fDestIPAddr.v4) 			return false;-		if (GetStreamInfo(x)->fSrcIPAddr != inInfo->GetStreamInfo(x)->fSrcIPAddr)+		if (GetStreamInfo(x)->fSrcIPAddr.v4 != inInfo->GetStreamInfo(x)->fSrcIPAddr.v4) 			return false;-		+	    }+	  else if (inInfo->family == AF_INET6)+	    {+	        if(memcmp(&(GetStreamInfo(x)->fDestIPAddr.v6), &(inInfo->GetStreamInfo(x)->fDestIPAddr.v6), sizeof(struct in6_addr))!= 0)+		        return false;+		if(memcmp(&(GetStreamInfo(x)->fSrcIPAddr.v6), &(inInfo->GetStreamInfo(x)->fSrcIPAddr.v6), sizeof(struct in6_addr))!= 0)+		        return false;+	    } 		// If either one of the comparators is 0 (the "wildcard" port), then we know at this point 		// they are equivalent 		if ((GetStreamInfo(x)->fPort == 0) || (inInfo->GetStreamInfo(x)->fPort == 0))@@ -275,8 +300,9 @@  void SourceInfo::StreamInfo::Copy(const StreamInfo& copy) {-	fSrcIPAddr = copy.fSrcIPAddr;-	fDestIPAddr = copy.fDestIPAddr;+	memcpy(&(fSrcIPAddr.v6), &(copy.fSrcIPAddr.v6), sizeof(struct in6_addr));+	memcpy(&(fDestIPAddr.v6), &(copy.fDestIPAddr.v6), sizeof(struct in6_addr));+ 	fPort = copy.fPort; 	fTimeToLive = copy.fTimeToLive; 	fPayloadType = copy.fPayloadType;@@ -297,8 +323,8 @@  void SourceInfo::OutputInfo::Copy(const OutputInfo& copy) {- 	fDestAddr = copy.fDestAddr;-	fLocalAddr = copy.fLocalAddr;+ 	memcpy(&(fDestAddr.v6), &(copy.fDestAddr.v6), sizeof(struct in6_addr));+	memcpy(&(fLocalAddr.v6), &(copy.fLocalAddr.v6), sizeof(struct in6_addr)); 	fTimeToLive = copy.fTimeToLive; 	fNumPorts = copy.fNumPorts; 	if(fNumPorts != 0)@@ -318,13 +344,26 @@  Bool16 SourceInfo::OutputInfo::Equal(const OutputInfo& info) {-	if ((fDestAddr == info.fDestAddr) && (fLocalAddr == info.fLocalAddr) && (fTimeToLive == info.fTimeToLive))+  if (this->family == AF_INET)+    {+	if ((fDestAddr.v4 == info.fDestAddr.v4) && (fLocalAddr.v4 == info.fLocalAddr.v4) && (fTimeToLive == info.fTimeToLive)) 	{ 		if ((fBasePort != 0) && (fBasePort == info.fBasePort)) 			return true; 		else if ((fNumPorts == 0) || ((fNumPorts == info.fNumPorts) && (fPortArray[0] == info.fPortArray[0]))) 			return true; 	}+    }+  else if (this->family == AF_INET6)+    {+      if ((memcmp(&(fDestAddr.v6), &(info.fDestAddr.v6), sizeof(struct in6_addr))==0) && (memcmp(&(fLocalAddr.v6), &(info.fLocalAddr.v6), sizeof(struct in6_addr))==0) && (fTimeToLive == info.fTimeToLive))+	{+		if ((fBasePort != 0) && (fBasePort == info.fBasePort))+			return true;+		else if ((fNumPorts == 0) || ((fNumPorts == info.fNumPorts) && (fPortArray[0] == info.fPortArray[0])))+			return true;+	}	  +    } 	return false; } diff -u --new-file --recursive darwin-start/APICommonCode/SourceInfo.h darwin/APICommonCode/SourceInfo.h--- darwin-start/APICommonCode/SourceInfo.h	Mon Jun 10 17:32:49 2002+++ darwin/APICommonCode/SourceInfo.h	Tue Jul  2 15:31:08 2002@@ -43,11 +43,15 @@ #include "OSQueue.h" #include "OS.h" +#ifndef __Win32__+#include <netinet/in.h>+#endif+ class SourceInfo { 	public: 	-		SourceInfo() : 	fStreamArray(NULL), fNumStreams(0),+                SourceInfo() : 	family(0), fStreamArray(NULL), fNumStreams(0), 						fOutputArray(NULL), fNumOutputs(0), 						fTimeSet(false),fStartTimeUnixSecs(0),fEndTimeUnixSecs(0), 						fSessionControlType(kSDPTimeControl)  {}@@ -66,14 +70,26 @@ 		// the following metadata. 		struct StreamInfo 		{-			StreamInfo() : fSrcIPAddr(0), fDestIPAddr(0), fPort(0), fTimeToLive(0), fPayloadType(0), fPayloadName(NULL), fTrackID(0), fBufferDelay((Float32) eDefaultBufferDelay), fIsTCP(false),fSetupToReceive(false){}+			StreamInfo() : fPort(0), fTimeToLive(0), fPayloadType(0), fPayloadName(NULL), fTrackID(0), fBufferDelay((Float32) eDefaultBufferDelay), fIsTCP(false),fSetupToReceive(false){+			bzero(&(fSrcIPAddr.v6), sizeof(struct in6_addr));+			bzero(&(fDestIPAddr.v6), sizeof(struct in6_addr));+			} 			~StreamInfo(); // Deletes the memory allocated for the fPayloadName string  			 			void Copy(const StreamInfo& copy);// Does copy dynamically allocated data 			-			UInt32 fSrcIPAddr;	// Src IP address of content (this may be 0 if not known for sure)-			UInt32 fDestIPAddr;	// Dest IP address of content (destination IP addr for source broadcast!)-			UInt16 fPort;		// Dest (RTP) port of source content+		  union{+		    struct in6_addr v6;+		    UInt32          v4;+		  }fSrcIPAddr;	// Src IP address of content (this may be 0 if not known for sure)+			+		  union{+		    struct in6_addr v6;+		    UInt32          v4;+		  }fDestIPAddr;	// Dest IP address of content (destination IP addr for source broadcast!)++		  int             family; +		        UInt16 fPort;		// Dest (RTP) port of source content 			UInt16 fTimeToLive; // Ttl for this stream 			QTSS_RTPPayloadType fPayloadType;	// Payload type of this stream 			StrPtrLen fPayloadName; // Payload name of this stream@@ -95,7 +111,10 @@ 		// contains one RTP port for each incoming stream. 		struct OutputInfo 		{-			OutputInfo() : fDestAddr(0), fLocalAddr(0), fTimeToLive(0), fPortArray(NULL), fNumPorts(0), fBasePort(0), fAlreadySetup(false) {}+			OutputInfo() :  fTimeToLive(0), fPortArray(NULL), fNumPorts(0), fBasePort(0), fAlreadySetup(false) {+			bzero(&(fDestAddr.v6), sizeof(struct in6_addr));+			bzero(&(fLocalAddr.v6), sizeof(struct in6_addr));+			} 			~OutputInfo(); // Deletes the memory allocated for fPortArray 			 			// Returns true if the two are equal@@ -103,8 +122,16 @@ 			 			void Copy(const OutputInfo& copy);// Does copy dynamically allocated data -			UInt32 fDestAddr;		// Destination address to forward the input onto-			UInt32 fLocalAddr;		// Address of local interface to send out on (may be 0)+			union {+			  struct in6_addr v6;+			  UInt32          v4;+			}fDestAddr;		// Destination address to forward the input onto+			union {+			  struct in6_addr v6;+			  UInt32          v4;+			}fLocalAddr;		// Address of local interface to send out on (may be 0)++		        int             family;  			UInt16 fTimeToLive;		// Time to live for resulting output (if multicast) 			UInt16* fPortArray;		// 1 destination RTP port for each Stream. 			UInt32 fNumPorts;		// Size of the fPortArray (usually equal to fNumStreams)@@ -148,11 +175,19 @@ 		time_t	GetEndTimeUnixSecs() {return fEndTimeUnixSecs; } 		time_t	GetDurationSecs(); 		enum {kSDPTimeControl, kRTSPSessionControl};++		// Family operation function.    +		virtual int     GetFamily() { return family; }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -