@@ -32,13 +32,15 @@ along with this library; if not, write to the Free Software Foundation, Inc.,
3232class tcpStreamRecord {
3333 public:
3434 tcpStreamRecord (int streamSocketNum, unsigned char streamChannelId,
35+ TLSState* tlsState,
3536 tcpStreamRecord* next);
3637 virtual ~tcpStreamRecord ();
3738
3839public:
3940 tcpStreamRecord* fNext ;
4041 int fStreamSocketNum ;
4142 unsigned char fStreamChannelId ;
43+ TLSState* fTLSState ;
4244};
4345
4446// Reading RTP-over-TCP is implemented using two levels of hash tables.
@@ -59,7 +61,7 @@ static HashTable* socketHashTable(UsageEnvironment& env, Boolean createIfNotPres
5961
6062class SocketDescriptor {
6163public:
62- SocketDescriptor (UsageEnvironment& env, int socketNum);
64+ SocketDescriptor (UsageEnvironment& env, int socketNum, TLSState* tlsState );
6365 virtual ~SocketDescriptor ();
6466
6567 void registerRTPInterface (unsigned char streamChannelId,
@@ -79,6 +81,7 @@ class SocketDescriptor {
7981private:
8082 UsageEnvironment& fEnv ;
8183 int fOurSocketNum ;
84+ TLSState* fTLSState ;
8285 HashTable* fSubChannelHashTable ;
8386 ServerRequestAlternativeByteHandler* fServerRequestAlternativeByteHandler ;
8487 void * fServerRequestAlternativeByteHandlerClientData ;
@@ -87,15 +90,17 @@ class SocketDescriptor {
8790 enum { AWAITING_DOLLAR, AWAITING_STREAM_CHANNEL_ID, AWAITING_SIZE1, AWAITING_SIZE2, AWAITING_PACKET_DATA } fTCPReadingState ;
8891};
8992
90- static SocketDescriptor* lookupSocketDescriptor (UsageEnvironment& env, int sockNum, Boolean createIfNotFound = True) {
93+ static SocketDescriptor*
94+ lookupSocketDescriptor (UsageEnvironment& env, int sockNum, TLSState* tlsState = NULL ,
95+ Boolean createIfNotFound = True) {
9196 HashTable* table = socketHashTable (env, createIfNotFound);
9297 if (table == NULL ) return NULL ;
9398
9499 char const * key = (char const *)(long )sockNum;
95100 SocketDescriptor* socketDescriptor = (SocketDescriptor*)(table->Lookup (key));
96101 if (socketDescriptor == NULL ) {
97102 if (createIfNotFound) {
98- socketDescriptor = new SocketDescriptor (env, sockNum);
103+ socketDescriptor = new SocketDescriptor (env, sockNum, tlsState );
99104 table->Add ((char const *)(long )(sockNum), socketDescriptor);
100105 } else if (table->IsEmpty ()) {
101106 // We can also delete the table (to reclaim space):
@@ -130,7 +135,7 @@ RTPInterface::RTPInterface(Medium* owner, Groupsock* gs)
130135 : fOwner(owner), fGS(gs),
131136 fTCPStreams(NULL ),
132137 fNextTCPReadSize(0 ), fNextTCPReadStreamSocketNum(-1 ),
133- fNextTCPReadStreamChannelId(0xFF ), fReadHandlerProc(NULL ),
138+ fNextTCPReadStreamChannelId(0xFF ), fNextTCPReadTLSState( NULL ), fReadHandlerProc(NULL ),
134139 fAuxReadHandlerFunc(NULL ), fAuxReadHandlerClientData(NULL ) {
135140 // Make the socket non-blocking, even though it will be read from only asynchronously, when packets arrive.
136141 // The reason for this is that, in some OSs, reads on a blocking socket can (allegedly) sometimes block,
@@ -145,17 +150,17 @@ RTPInterface::~RTPInterface() {
145150 delete fTCPStreams ;
146151}
147152
148- void RTPInterface::setStreamSocket (int sockNum,
149- unsigned char streamChannelId ) {
153+ void RTPInterface::setStreamSocket (int sockNum, unsigned char streamChannelId,
154+ TLSState* tlsState ) {
150155 fGS ->removeAllDestinations ();
151156 envir ().taskScheduler ().disableBackgroundHandling (fGS ->socketNum ()); // turn off any reading on our datagram socket
152157 fGS ->reset (); // and close our datagram socket, because we won't be using it anymore
153158
154- addStreamSocket (sockNum, streamChannelId);
159+ addStreamSocket (sockNum, streamChannelId, tlsState );
155160}
156161
157- void RTPInterface::addStreamSocket (int sockNum,
158- unsigned char streamChannelId ) {
162+ void RTPInterface::addStreamSocket (int sockNum, unsigned char streamChannelId,
163+ TLSState* tlsState ) {
159164 if (sockNum < 0 ) return ;
160165
161166 for (tcpStreamRecord* streams = fTCPStreams ; streams != NULL ;
@@ -166,15 +171,15 @@ void RTPInterface::addStreamSocket(int sockNum,
166171 }
167172 }
168173
169- fTCPStreams = new tcpStreamRecord (sockNum, streamChannelId, fTCPStreams );
174+ fTCPStreams = new tcpStreamRecord (sockNum, streamChannelId, tlsState, fTCPStreams );
170175
171176 // Also, make sure this new socket is set up for receiving RTP/RTCP-over-TCP:
172- SocketDescriptor* socketDescriptor = lookupSocketDescriptor (envir (), sockNum);
177+ SocketDescriptor* socketDescriptor = lookupSocketDescriptor (envir (), sockNum, tlsState );
173178 socketDescriptor->registerRTPInterface (streamChannelId, this );
174179}
175180
176181static void deregisterSocket (UsageEnvironment& env, int sockNum, unsigned char streamChannelId) {
177- SocketDescriptor* socketDescriptor = lookupSocketDescriptor (env, sockNum, False);
182+ SocketDescriptor* socketDescriptor = lookupSocketDescriptor (env, sockNum, NULL , False);
178183 if (socketDescriptor != NULL ) {
179184 socketDescriptor->deregisterRTPInterface (streamChannelId);
180185 // Note: This may delete "socketDescriptor",
@@ -216,7 +221,7 @@ void RTPInterface::removeStreamSocket(int sockNum,
216221
217222void RTPInterface::setServerRequestAlternativeByteHandler (UsageEnvironment& env, int socketNum,
218223 ServerRequestAlternativeByteHandler* handler, void * clientData) {
219- SocketDescriptor* socketDescriptor = lookupSocketDescriptor (env, socketNum, False);
224+ SocketDescriptor* socketDescriptor = lookupSocketDescriptor (env, socketNum, NULL , False);
220225
221226 if (socketDescriptor != NULL ) socketDescriptor->setServerRequestAlternativeByteHandler (handler, clientData);
222227}
@@ -236,7 +241,8 @@ Boolean RTPInterface::sendPacket(unsigned char* packet, unsigned packetSize) {
236241 for (tcpStreamRecord* stream = fTCPStreams ; stream != NULL ; stream = nextStream) {
237242 nextStream = stream->fNext ; // Set this now, in case the following deletes "stream":
238243 if (!sendRTPorRTCPPacketOverTCP (packet, packetSize,
239- stream->fStreamSocketNum , stream->fStreamChannelId )) {
244+ stream->fStreamSocketNum , stream->fStreamChannelId ,
245+ stream->fTLSState )) {
240246 success = False;
241247 }
242248 }
@@ -288,9 +294,11 @@ Boolean RTPInterface::handleRead(unsigned char* buffer, unsigned bufferMaxSize,
288294 ((sockaddr_in&)fromAddress).sin_addr .s_addr = 0 ;
289295 ((sockaddr_in&)fromAddress).sin_port = 0 ;
290296
291- while ((curBytesRead = readSocket (envir (), fNextTCPReadStreamSocketNum ,
292- &buffer[bytesRead], curBytesToRead,
293- fromAddress)) > 0 ) {
297+ while ((curBytesRead = (fNextTCPReadTLSState != NULL && fNextTCPReadTLSState ->isNeeded )
298+ ? fNextTCPReadTLSState ->read (&buffer[bytesRead], curBytesToRead)
299+ : readSocket (envir (), fNextTCPReadStreamSocketNum ,
300+ &buffer[bytesRead], curBytesToRead,
301+ fromAddress)) > 0 ) {
294302 bytesRead += curBytesRead;
295303 if (bytesRead >= totBytesToRead) break ;
296304 curBytesToRead -= curBytesRead;
@@ -332,7 +340,8 @@ void RTPInterface::stopNetworkReading() {
332340// //////// Helper Functions - Implementation /////////
333341
334342Boolean RTPInterface::sendRTPorRTCPPacketOverTCP (u_int8_t * packet, unsigned packetSize,
335- int socketNum, unsigned char streamChannelId) {
343+ int socketNum, unsigned char streamChannelId,
344+ TLSState* tlsState) {
336345#ifdef DEBUG_SEND
337346 fprintf (stderr, " sendRTPorRTCPPacketOverTCP: %d bytes over channel %d (socket %d)\n " ,
338347 packetSize, streamChannelId, socketNum); fflush (stderr);
@@ -348,9 +357,9 @@ Boolean RTPInterface::sendRTPorRTCPPacketOverTCP(u_int8_t* packet, unsigned pack
348357 framingHeader[1 ] = streamChannelId;
349358 framingHeader[2 ] = (u_int8_t ) ((packetSize&0xFF00 )>>8 );
350359 framingHeader[3 ] = (u_int8_t ) (packetSize&0xFF );
351- if (!sendDataOverTCP (socketNum, framingHeader, 4 , False)) break ;
360+ if (!sendDataOverTCP (socketNum, tlsState, framingHeader, 4 , False)) break ;
352361
353- if (!sendDataOverTCP (socketNum, packet, packetSize, True)) break ;
362+ if (!sendDataOverTCP (socketNum, tlsState, packet, packetSize, True)) break ;
354363#ifdef DEBUG_SEND
355364 fprintf (stderr, " sendRTPorRTCPPacketOverTCP: completed\n " ); fflush (stderr);
356365#endif
@@ -368,8 +377,12 @@ Boolean RTPInterface::sendRTPorRTCPPacketOverTCP(u_int8_t* packet, unsigned pack
368377#define RTPINTERFACE_BLOCKING_WRITE_TIMEOUT_MS 500
369378#endif
370379
371- Boolean RTPInterface::sendDataOverTCP (int socketNum, u_int8_t const * data, unsigned dataSize, Boolean forceSendToSucceed) {
372- int sendResult = send (socketNum, (char const *)data, dataSize, 0 /* flags*/ );
380+ Boolean RTPInterface::sendDataOverTCP (int socketNum, TLSState* tlsState,
381+ u_int8_t const * data, unsigned dataSize,
382+ Boolean forceSendToSucceed) {
383+ int sendResult = (tlsState != NULL && tlsState->isNeeded )
384+ ? tlsState->write ((char const *)data, dataSize)
385+ : send (socketNum, (char const *)data, dataSize, 0 /* flags*/ );
373386 if (sendResult < (int )dataSize) {
374387 // The TCP send() failed - at least partially.
375388
@@ -383,7 +396,9 @@ Boolean RTPInterface::sendDataOverTCP(int socketNum, u_int8_t const* data, unsig
383396 fprintf (stderr, " sendDataOverTCP: resending %d-byte send (blocking)\n " , numBytesRemainingToSend); fflush (stderr);
384397#endif
385398 makeSocketBlocking (socketNum, RTPINTERFACE_BLOCKING_WRITE_TIMEOUT_MS);
386- sendResult = send (socketNum, (char const *)(&data[numBytesSentSoFar]), numBytesRemainingToSend, 0 /* flags*/ );
399+ sendResult = (tlsState != NULL && tlsState->isNeeded )
400+ ? tlsState->write ((char const *)(&data[numBytesSentSoFar]), numBytesRemainingToSend)
401+ : send (socketNum, (char const *)(&data[numBytesSentSoFar]), numBytesRemainingToSend, 0 /* flags*/ );
387402 if ((unsigned )sendResult != numBytesRemainingToSend) {
388403 // The blocking "send()" failed, or timed out. In either case, we assume that the
389404 // TCP connection has failed (or is 'hanging' indefinitely), and we stop using it
@@ -411,8 +426,8 @@ Boolean RTPInterface::sendDataOverTCP(int socketNum, u_int8_t const* data, unsig
411426 return True;
412427}
413428
414- SocketDescriptor::SocketDescriptor (UsageEnvironment& env, int socketNum)
415- :fEnv(env), fOurSocketNum(socketNum),
429+ SocketDescriptor::SocketDescriptor (UsageEnvironment& env, int socketNum, TLSState* tlsState )
430+ : fEnv(env), fOurSocketNum(socketNum), fTLSState(tlsState ),
416431 fSubChannelHashTable(HashTable::create(ONE_WORD_HASH_KEYS)),
417432 fServerRequestAlternativeByteHandler(NULL ), fServerRequestAlternativeByteHandlerClientData(NULL ),
418433 fReadErrorOccurred(False), fDeleteMyselfNext(False), fAreInReadHandlerLoop(False), fTCPReadingState(AWAITING_DOLLAR) {
@@ -513,7 +528,9 @@ Boolean SocketDescriptor::tcpReadHandler1(int mask) {
513528 u_int8_t c;
514529 struct sockaddr_storage dummy; // not used
515530 if (fTCPReadingState != AWAITING_PACKET_DATA) {
516- int result = readSocket (fEnv , fOurSocketNum , &c, 1 , dummy);
531+ int result = (fTLSState != NULL && fTLSState ->isNeeded )
532+ ? fTLSState ->read (&c, 1 )
533+ : readSocket (fEnv , fOurSocketNum , &c, 1 , dummy);
517534 if (result == 0 ) { // There was no more data to read
518535 return False;
519536 } else if (result != 1 ) { // error reading TCP socket, so we will no longer handle it
@@ -573,6 +590,7 @@ Boolean SocketDescriptor::tcpReadHandler1(int mask) {
573590 rtpInterface->fNextTCPReadSize = size;
574591 rtpInterface->fNextTCPReadStreamSocketNum = fOurSocketNum ;
575592 rtpInterface->fNextTCPReadStreamChannelId = fStreamChannelId ;
593+ rtpInterface->fNextTCPReadTLSState = fTLSState ;
576594 }
577595 fTCPReadingState = AWAITING_PACKET_DATA;
578596 break ;
@@ -597,7 +615,9 @@ Boolean SocketDescriptor::tcpReadHandler1(int mask) {
597615#ifdef DEBUG_RECEIVE
598616 fprintf (stderr, " SocketDescriptor(socket %d)::tcpReadHandler(): No handler proc for \" rtpInterface\" for channel %d; need to skip %d remaining bytes\n " , fOurSocketNum , fStreamChannelId , rtpInterface->fNextTCPReadSize );
599617#endif
600- int result = readSocket (fEnv , fOurSocketNum , &c, 1 , dummy);
618+ int result = (fTLSState != NULL && fTLSState ->isNeeded )
619+ ? fTLSState ->read (&c, 1 )
620+ : readSocket (fEnv , fOurSocketNum , &c, 1 , dummy);
601621 if (result < 0 ) { // error reading TCP socket, so we will no longer handle it
602622#ifdef DEBUG_RECEIVE
603623 fprintf (stderr, " SocketDescriptor(socket %d)::tcpReadHandler(): readSocket(1 byte) returned %d (error)\n " , fOurSocketNum , result);
@@ -628,9 +648,11 @@ Boolean SocketDescriptor::tcpReadHandler1(int mask) {
628648
629649tcpStreamRecord
630650::tcpStreamRecord (int streamSocketNum, unsigned char streamChannelId,
651+ TLSState* tlsState,
631652 tcpStreamRecord* next)
632653 : fNext(next),
633- fStreamSocketNum(streamSocketNum), fStreamChannelId(streamChannelId) {
654+ fStreamSocketNum(streamSocketNum), fStreamChannelId(streamChannelId),
655+ fTLSState(tlsState) {
634656}
635657
636658tcpStreamRecord::~tcpStreamRecord () {
0 commit comments