37 #ifndef RTPUDPV6TRANSMITTER_H
39 #define RTPUDPV6TRANSMITTER_H
41 #include "rtpconfig.h"
43 #ifdef RTP_SUPPORT_IPV6
49 #if ! (defined(WIN32) || defined(_WIN32_WCE))
50 #include <netinet/in.h>
55 #ifdef RTP_SUPPORT_THREAD
57 #endif // RTP_SUPPORT_THREAD
59 #define RTPUDPV6TRANS_HASHSIZE 8317
60 #define RTPUDPV6TRANS_DEFAULTPORTBASE 5000
62 #define RTPUDPV6TRANS_RTPRECEIVEBUFFER 32768
63 #define RTPUDPV6TRANS_RTCPRECEIVEBUFFER 32768
64 #define RTPUDPV6TRANS_RTPTRANSMITBUFFER 32768
65 #define RTPUDPV6TRANS_RTCPTRANSMITBUFFER 32768
71 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; }
135 unsigned int mcastifidx;
136 std::list<in6_addr> localIPs;
137 uint8_t multicastTTL;
138 int rtpsendbuf, rtprecvbuf;
139 int rtcpsendbuf, rtcprecvbuf;
146 #if ! (defined(WIN32) || defined(_WIN32_WCE))
151 { localIPlist = iplist; rtpsocket = rtpsock; rtcpsocket = rtcpsock; }
153 ~RTPUDPv6TransmissionInfo() { }
157 #if ! (defined(WIN32) || defined(_WIN32_WCE))
168 std::list<in6_addr> localIPlist;
169 #if ! (defined(WIN32) || defined(_WIN32_WCE))
170 int rtpsocket,rtcpsocket;
172 SOCKET rtpsocket,rtcpsocket;
176 class RTPUDPv6Trans_GetHashIndex_IPv6Dest
179 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; }
182 class RTPUDPv6Trans_GetHashIndex_in6_addr
185 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; }
188 #define RTPUDPV6TRANS_HEADERSIZE (40+8)
203 int Init(
bool treadsafe);
208 int GetLocalHostName(uint8_t *buffer,
size_t *bufferlength);
209 bool ComesFromThisTransmitter(
const RTPAddress *addr);
210 size_t GetHeaderOverhead() {
return RTPUDPV6TRANS_HEADERSIZE; }
213 int WaitForIncomingData(
const RTPTime &delay,
bool *dataavailable = 0);
216 int SendRTPData(
const void *data,
size_t len);
217 int SendRTCPData(
const void *data,
size_t len);
220 int DeleteDestination(
const RTPAddress &addr);
221 void ClearDestinations();
223 bool SupportsMulticasting();
224 int JoinMulticastGroup(
const RTPAddress &addr);
225 int LeaveMulticastGroup(
const RTPAddress &addr);
226 void LeaveAllMulticastGroups();
230 int DeleteFromIgnoreList(
const RTPAddress &addr);
231 void ClearIgnoreList();
233 int DeleteFromAcceptList(
const RTPAddress &addr);
234 void ClearAcceptList();
235 int SetMaximumPacketSize(
size_t s);
237 bool NewDataAvailable();
243 int CreateLocalIPList();
244 bool GetLocalIPList_Interfaces();
245 void GetLocalIPList_DNS();
246 void AddLoopbackAddress();
248 int PollSocket(
bool rtp);
249 int ProcessAddAcceptIgnoreEntry(in6_addr ip,uint16_t port);
250 int ProcessDeleteAcceptIgnoreEntry(in6_addr ip,uint16_t port);
251 #ifdef RTP_SUPPORT_IPV6MULTICAST
252 bool SetMulticastTTL(uint8_t ttl);
253 #endif // RTP_SUPPORT_IPV6MULTICAST
254 bool ShouldAcceptData(in6_addr srcip,uint16_t srcport);
255 void ClearAcceptIgnoreInfo();
260 #if (defined(WIN32) || defined(_WIN32_WCE))
261 SOCKET rtpsock,rtcpsock;
262 #else // not using winsock
263 int rtpsock,rtcpsock;
266 unsigned int mcastifidx;
267 std::list<in6_addr> localIPs;
269 uint8_t multicastTTL;
272 uint8_t *localhostname;
273 size_t localhostnamelength;
275 RTPHashTable<const RTPIPv6Destination,RTPUDPv6Trans_GetHashIndex_IPv6Dest,RTPUDPV6TRANS_HASHSIZE> destinations;
276 #ifdef RTP_SUPPORT_IPV6MULTICAST
277 RTPHashTable<const in6_addr,RTPUDPv6Trans_GetHashIndex_in6_addr,RTPUDPV6TRANS_HASHSIZE> multicastgroups;
278 #endif // RTP_SUPPORT_IPV6MULTICAST
279 std::list<RTPRawPacket*> rawpacketlist;
281 bool supportsmulticasting;
287 PortInfo() { all =
false; }
290 std::list<uint16_t> portlist;
293 RTPKeyHashTable<const in6_addr,PortInfo*,RTPUDPv6Trans_GetHashIndex_in6_addr,RTPUDPV6TRANS_HASHSIZE> acceptignoreinfo;
296 #if (defined(WIN32) || defined(_WIN32_WCE))
301 int CreateAbortDescriptors();
302 void DestroyAbortDescriptors();
303 void AbortWaitInternal();
304 #ifdef RTP_SUPPORT_THREAD
305 JMutex mainmutex,waitmutex;
307 #endif // RTP_SUPPORT_THREAD
310 #endif // RTP_SUPPORT_IPV6
312 #endif // RTPUDPV6TRANSMITTER_H