📄 darwin_ipv6.patch
字号:
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 + -