]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #2024 in SNORT/snort3 from ~GSAMBYAL/snort3:snort_6_7_port to...
authorGeorge Koikara (gkoikara) <gkoikara@cisco.com>
Wed, 1 Apr 2020 14:55:27 +0000 (14:55 +0000)
committerGeorge Koikara (gkoikara) <gkoikara@cisco.com>
Wed, 1 Apr 2020 14:55:27 +0000 (14:55 +0000)
Squashed commit of the following:

commit e76a979bbd75892f5fc88ccd958c0a6410aceb96
Author: Garima Singh Sambyal <gsambyal@cisco.com>
Date:   Wed Feb 19 01:51:28 2020 -0500

    sip: Support pinhole for sip early media

src/service_inspectors/sip/sip_dialog.cc

index 20531248dbded7031bc753ebc9a72cdd0c5a83b7..d8ab5d0a8f4150d0d996c609e847613a5996ce5c 100644 (file)
 using namespace snort;
 
 static void SIP_updateMedias(SIP_MediaSession*, SIP_MediaList*);
-static int SIP_compareMedias(SIP_MediaDataList, SIP_MediaDataList);
-static bool SIP_checkMediaChange(SIPMsg* sipMsg, SIP_DialogData* dialog);
+static int SIP_compareMedias(const SIP_MediaDataList, const SIP_MediaDataList);
+static bool SIP_checkMediaChange(const SIPMsg*, const SIP_DialogData*);
 static int SIP_processRequest(SIPMsg*, SIP_DialogData*, SIP_DialogList*, Packet*, SIP_PROTO_CONF*);
 static int SIP_processInvite(SIPMsg*, SIP_DialogData*, SIP_DialogList*);
 static int SIP_processACK(SIPMsg*, SIP_DialogData*, SIP_DialogList*, Packet*, SIP_PROTO_CONF*);
-static int SIP_processResponse(SIPMsg*, SIP_DialogData*, SIP_DialogList*, Packet*, SIP_PROTO_CONF*);
+static int SIP_processResponse(SIPMsg*, SIP_DialogData*, SIP_DialogList*, Packet*,
+    SIP_PROTO_CONF*);
 static int SIP_ignoreChannels(SIP_DialogData*, Packet* p, SIP_PROTO_CONF*);
 static SIP_DialogData* SIP_addDialog(SIPMsg*, SIP_DialogData*, SIP_DialogList*);
 static int SIP_deleteDialog(SIP_DialogData*, SIP_DialogList*);
@@ -232,7 +233,6 @@ static int SIP_processResponse(SIPMsg* sipMsg, SIP_DialogData* dialog, SIP_Dialo
     assert (nullptr != sipMsg);
 
     statusType = sipMsg->status_code / 100;
-
     sip_stats.responses[TOTAL_RESPONSES]++;
     if (statusType < NUM_OF_RESPONSE_TYPES)
         sip_stats.responses[statusType]++;
@@ -251,7 +251,15 @@ static int SIP_processResponse(SIPMsg* sipMsg, SIP_DialogData* dialog, SIP_Dialo
 
         if (SIP_DLG_CREATE == currDialog->state)
             currDialog->state = SIP_DLG_EARLY;
-        SIP_updateMedias(sipMsg->mediaSession, &dialog->mediaSessions);
+        // 183 session progress can have SDP body for which we need to set
+        // mediaUpdated flag so that AppId can create pinhole for RTP/RTCP
+        // media session
+        if ( !SIP_checkMediaChange(sipMsg, dialog) )
+        {
+            SIP_updateMedias(sipMsg->mediaSession, &dialog->mediaSessions);
+            SIP_ignoreChannels(currDialog, p,config);
+            sipMsg->mediaUpdated = true;
+        }
         break;
     case RESPONSE2XX:
 
@@ -323,9 +331,9 @@ static int SIP_processResponse(SIPMsg* sipMsg, SIP_DialogData* dialog, SIP_Dialo
  *  true: media not changed
  *  false: media changed
  ********************************************************************/
-static bool SIP_checkMediaChange(SIPMsg* sipMsg, SIP_DialogData* dialog)
+static bool SIP_checkMediaChange(const SIPMsg* sipMsg, const SIP_DialogData* dialog)
 {
-    SIP_MediaSession* medias;
+    const SIP_MediaSession* medias;
 
     // Compare the medias (SDP part)
     if (nullptr == sipMsg->mediaSession)
@@ -376,6 +384,7 @@ static int SIP_ignoreChannels(SIP_DialogData* dialog, Packet* p, SIP_PROTO_CONF*
     // check the first media session
     if (nullptr == dialog->mediaSessions)
         return false;
+
     // check the second media session
     if (nullptr == dialog->mediaSessions->nextS)
         return false;
@@ -425,9 +434,9 @@ static int SIP_ignoreChannels(SIP_DialogData* dialog, Packet* p, SIP_PROTO_CONF*
  *   0: the same
  *
  ********************************************************************/
-static int SIP_compareMedias(SIP_MediaDataList mlistA, SIP_MediaDataList mlistB)
+static int SIP_compareMedias(const SIP_MediaDataList mlistA, const SIP_MediaDataList mlistB)
 {
-    SIP_MediaData* mdataA,* mdataB;
+    const SIP_MediaData* mdataA, * mdataB;
     mdataA = mlistA;
     mdataB = mlistB;
     while ((nullptr != mdataA) && (nullptr != mdataB))