00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00037 #ifndef RTPUDPV6TRANSMITTER_H
00038
00039 #define RTPUDPV6TRANSMITTER_H
00040
00041 #include "rtpconfig.h"
00042
00043 #ifdef RTP_SUPPORT_IPV6
00044
00045 #include "rtptransmitter.h"
00046 #include "rtpipv6destination.h"
00047 #include "rtphashtable.h"
00048 #include "rtpkeyhashtable.h"
00049 #if ! (defined(WIN32) || defined(_WIN32_WCE))
00050 #include <netinet/in.h>
00051 #endif // WIN32
00052 #include <string.h>
00053 #include <list>
00054
00055 #ifdef RTP_SUPPORT_THREAD
00056 #include <jmutex.h>
00057 #endif // RTP_SUPPORT_THREAD
00058
00059 #define RTPUDPV6TRANS_HASHSIZE 8317
00060 #define RTPUDPV6TRANS_DEFAULTPORTBASE 5000
00061
00062 #define RTPUDPV6TRANS_RTPRECEIVEBUFFER 32768
00063 #define RTPUDPV6TRANS_RTCPRECEIVEBUFFER 32768
00064 #define RTPUDPV6TRANS_RTPTRANSMITBUFFER 32768
00065 #define RTPUDPV6TRANS_RTCPTRANSMITBUFFER 32768
00066
00068 class RTPUDPv6TransmissionParams : public RTPTransmissionParams
00069 {
00070 public:
00071 RTPUDPv6TransmissionParams():RTPTransmissionParams(RTPTransmitter::IPv6UDPProto) { portbase = RTPUDPV6TRANS_DEFAULTPORTBASE; for (int i = 0 ; i < 16 ; i++) bindIP.s6_addr[i] = 0; multicastTTL = 1; mcastifidx = 0; rtpsendbuf = RTPUDPV6TRANS_RTPTRANSMITBUFFER; rtprecvbuf= RTPUDPV6TRANS_RTPRECEIVEBUFFER; rtcpsendbuf = RTPUDPV6TRANS_RTCPTRANSMITBUFFER; rtcprecvbuf = RTPUDPV6TRANS_RTCPRECEIVEBUFFER; }
00072
00074 void SetBindIP(in6_addr ip) { bindIP = ip; }
00075
00077 void SetMulticastInterfaceIndex(unsigned int idx) { mcastifidx = idx; }
00078
00080 void SetPortbase(uint16_t pbase) { portbase = pbase; }
00081
00083 void SetMulticastTTL(uint8_t mcastTTL) { multicastTTL = mcastTTL; }
00084
00086 void SetLocalIPList(std::list<in6_addr> &iplist) { localIPs = iplist; }
00087
00092 void ClearLocalIPList() { localIPs.clear(); }
00093
00095 in6_addr GetBindIP() const { return bindIP; }
00096
00098 unsigned int GetMulticastInterfaceIndex() const { return mcastifidx; }
00099
00101 uint16_t GetPortbase() const { return portbase; }
00102
00104 uint8_t GetMulticastTTL() const { return multicastTTL; }
00105
00107 const std::list<in6_addr> &GetLocalIPList() const { return localIPs; }
00108
00110 void SetRTPSendBuffer(int s) { rtpsendbuf = s; }
00111
00113 void SetRTPReceiveBuffer(int s) { rtprecvbuf = s; }
00114
00116 void SetRTCPSendBuffer(int s) { rtcpsendbuf = s; }
00117
00119 void SetRTCPReceiveBuffer(int s) { rtcprecvbuf = s; }
00120
00122 int GetRTPSendBuffer() const { return rtpsendbuf; }
00123
00125 int GetRTPReceiveBuffer() const { return rtprecvbuf; }
00126
00128 int GetRTCPSendBuffer() const { return rtcpsendbuf; }
00129
00131 int GetRTCPReceiveBuffer() const { return rtcprecvbuf; }
00132 private:
00133 uint16_t portbase;
00134 in6_addr bindIP;
00135 unsigned int mcastifidx;
00136 std::list<in6_addr> localIPs;
00137 uint8_t multicastTTL;
00138 int rtpsendbuf, rtprecvbuf;
00139 int rtcpsendbuf, rtcprecvbuf;
00140 };
00141
00143 class RTPUDPv6TransmissionInfo : public RTPTransmissionInfo
00144 {
00145 public:
00146 #if ! (defined(WIN32) || defined(_WIN32_WCE))
00147 RTPUDPv6TransmissionInfo(std::list<in6_addr> iplist,int rtpsock,int rtcpsock) : RTPTransmissionInfo(RTPTransmitter::IPv6UDPProto)
00148 #else
00149 RTPUDPv6TransmissionInfo(std::list<in6_addr> iplist,SOCKET rtpsock,SOCKET rtcpsock) : RTPTransmissionInfo(RTPTransmitter::IPv6UDPProto)
00150 #endif // WIN32
00151 { localIPlist = iplist; rtpsocket = rtpsock; rtcpsocket = rtcpsock; }
00152
00153 ~RTPUDPv6TransmissionInfo() { }
00154
00156 std::list<in6_addr> GetLocalIPList() const { return localIPlist; }
00157 #if ! (defined(WIN32) || defined(_WIN32_WCE))
00158
00159 int GetRTPSocket() const { return rtpsocket; }
00160
00162 int GetRTCPSocket() const { return rtcpsocket; }
00163 #else
00164 SOCKET GetRTPSocket() const { return rtpsocket; }
00165 SOCKET GetRTCPSocket() const { return rtcpsocket; }
00166 #endif // WIN32
00167 private:
00168 std::list<in6_addr> localIPlist;
00169 #if ! (defined(WIN32) || defined(_WIN32_WCE))
00170 int rtpsocket,rtcpsocket;
00171 #else
00172 SOCKET rtpsocket,rtcpsocket;
00173 #endif // WIN32
00174 };
00175
00176 class RTPUDPv6Trans_GetHashIndex_IPv6Dest
00177 {
00178 public:
00179 static int GetIndex(const RTPIPv6Destination &d) { in6_addr ip = d.GetIP(); return ((((uint32_t)ip.s6_addr[12])<<24)|(((uint32_t)ip.s6_addr[13])<<16)|(((uint32_t)ip.s6_addr[14])<<8)|((uint32_t)ip.s6_addr[15]))%RTPUDPV6TRANS_HASHSIZE; }
00180 };
00181
00182 class RTPUDPv6Trans_GetHashIndex_in6_addr
00183 {
00184 public:
00185 static int GetIndex(const in6_addr &ip) { return ((((uint32_t)ip.s6_addr[12])<<24)|(((uint32_t)ip.s6_addr[13])<<16)|(((uint32_t)ip.s6_addr[14])<<8)|((uint32_t)ip.s6_addr[15]))%RTPUDPV6TRANS_HASHSIZE; }
00186 };
00187
00188 #define RTPUDPV6TRANS_HEADERSIZE (40+8)
00189
00197 class RTPUDPv6Transmitter : public RTPTransmitter
00198 {
00199 public:
00200 RTPUDPv6Transmitter(RTPMemoryManager *mgr);
00201 ~RTPUDPv6Transmitter();
00202
00203 int Init(bool treadsafe);
00204 int Create(size_t maxpacksize,const RTPTransmissionParams *transparams);
00205 void Destroy();
00206 RTPTransmissionInfo *GetTransmissionInfo();
00207
00208 int GetLocalHostName(uint8_t *buffer,size_t *bufferlength);
00209 bool ComesFromThisTransmitter(const RTPAddress *addr);
00210 size_t GetHeaderOverhead() { return RTPUDPV6TRANS_HEADERSIZE; }
00211
00212 int Poll();
00213 int WaitForIncomingData(const RTPTime &delay,bool *dataavailable = 0);
00214 int AbortWait();
00215
00216 int SendRTPData(const void *data,size_t len);
00217 int SendRTCPData(const void *data,size_t len);
00218
00219 int AddDestination(const RTPAddress &addr);
00220 int DeleteDestination(const RTPAddress &addr);
00221 void ClearDestinations();
00222
00223 bool SupportsMulticasting();
00224 int JoinMulticastGroup(const RTPAddress &addr);
00225 int LeaveMulticastGroup(const RTPAddress &addr);
00226 void LeaveAllMulticastGroups();
00227
00228 int SetReceiveMode(RTPTransmitter::ReceiveMode m);
00229 int AddToIgnoreList(const RTPAddress &addr);
00230 int DeleteFromIgnoreList(const RTPAddress &addr);
00231 void ClearIgnoreList();
00232 int AddToAcceptList(const RTPAddress &addr);
00233 int DeleteFromAcceptList(const RTPAddress &addr);
00234 void ClearAcceptList();
00235 int SetMaximumPacketSize(size_t s);
00236
00237 bool NewDataAvailable();
00238 RTPRawPacket *GetNextPacket();
00239 #ifdef RTPDEBUG
00240 void Dump();
00241 #endif // RTPDEBUG
00242 private:
00243 int CreateLocalIPList();
00244 bool GetLocalIPList_Interfaces();
00245 void GetLocalIPList_DNS();
00246 void AddLoopbackAddress();
00247 void FlushPackets();
00248 int PollSocket(bool rtp);
00249 int ProcessAddAcceptIgnoreEntry(in6_addr ip,uint16_t port);
00250 int ProcessDeleteAcceptIgnoreEntry(in6_addr ip,uint16_t port);
00251 #ifdef RTP_SUPPORT_IPV6MULTICAST
00252 bool SetMulticastTTL(uint8_t ttl);
00253 #endif // RTP_SUPPORT_IPV6MULTICAST
00254 bool ShouldAcceptData(in6_addr srcip,uint16_t srcport);
00255 void ClearAcceptIgnoreInfo();
00256
00257 bool init;
00258 bool created;
00259 bool waitingfordata;
00260 #if (defined(WIN32) || defined(_WIN32_WCE))
00261 SOCKET rtpsock,rtcpsock;
00262 #else // not using winsock
00263 int rtpsock,rtcpsock;
00264 #endif // WIN32
00265 in6_addr bindIP;
00266 unsigned int mcastifidx;
00267 std::list<in6_addr> localIPs;
00268 uint16_t portbase;
00269 uint8_t multicastTTL;
00270 RTPTransmitter::ReceiveMode receivemode;
00271
00272 uint8_t *localhostname;
00273 size_t localhostnamelength;
00274
00275 RTPHashTable<const RTPIPv6Destination,RTPUDPv6Trans_GetHashIndex_IPv6Dest,RTPUDPV6TRANS_HASHSIZE> destinations;
00276 #ifdef RTP_SUPPORT_IPV6MULTICAST
00277 RTPHashTable<const in6_addr,RTPUDPv6Trans_GetHashIndex_in6_addr,RTPUDPV6TRANS_HASHSIZE> multicastgroups;
00278 #endif // RTP_SUPPORT_IPV6MULTICAST
00279 std::list<RTPRawPacket*> rawpacketlist;
00280
00281 bool supportsmulticasting;
00282 size_t maxpacksize;
00283
00284 class PortInfo
00285 {
00286 public:
00287 PortInfo() { all = false; }
00288
00289 bool all;
00290 std::list<uint16_t> portlist;
00291 };
00292
00293 RTPKeyHashTable<const in6_addr,PortInfo*,RTPUDPv6Trans_GetHashIndex_in6_addr,RTPUDPV6TRANS_HASHSIZE> acceptignoreinfo;
00294
00295
00296 #if (defined(WIN32) || defined(_WIN32_WCE))
00297 SOCKET abortdesc[2];
00298 #else
00299 int abortdesc[2];
00300 #endif // WIN32
00301 int CreateAbortDescriptors();
00302 void DestroyAbortDescriptors();
00303 void AbortWaitInternal();
00304 #ifdef RTP_SUPPORT_THREAD
00305 JMutex mainmutex,waitmutex;
00306 int threadsafe;
00307 #endif // RTP_SUPPORT_THREAD
00308 };
00309
00310 #endif // RTP_SUPPORT_IPV6
00311
00312 #endif // RTPUDPV6TRANSMITTER_H
00313