00001 /* 00002 * pcapfile.h 00003 * 00004 * Ethernet capture (PCAP) file declaration 00005 * 00006 * Portable Tools Library 00007 * 00008 * Copyright (C) 2011 Vox Lucida Pty. Ltd. 00009 * 00010 * The contents of this file are subject to the Mozilla Public License 00011 * Version 1.0 (the "License"); you may not use this file except in 00012 * compliance with the License. You may obtain a copy of the License at 00013 * http://www.mozilla.org/MPL/ 00014 * 00015 * Software distributed under the License is distributed on an "AS IS" 00016 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 00017 * the License for the specific language governing rights and limitations 00018 * under the License. 00019 * 00020 * The Original Code is Portable Tools Library. 00021 * 00022 * The Initial Developer of the Original Code is Vox Lucida 00023 * 00024 * All Rights Reserved. 00025 * 00026 * Contributor(s): ______________________________________. 00027 * 00028 * $Revision: 27285 $ 00029 * $Author: rjongbloed $ 00030 * $Date: 2012-03-22 20:44:50 -0500 (Thu, 22 Mar 2012) $ 00031 */ 00032 00033 #ifndef PTLIB_PCAPFILE_H 00034 #define PTLIB_PCAPFILE_H 00035 00036 #ifdef P_USE_PRAGMA 00037 #pragma interface 00038 #endif 00039 00040 #include <rtp/rtp.h> 00041 #include <opal/mediafmt.h> 00042 #include <ptlib/sockets.h> 00043 00044 00047 class OpalPCAPFile : public PFile 00048 { 00049 PCLASSINFO(OpalPCAPFile, PFile); 00050 public: 00051 OpalPCAPFile(); 00052 00053 bool Open(const PFilePath & filename); 00054 bool Restart(); 00055 00056 void PrintOn(ostream & strm) const; 00057 00058 bool ReadRawPacket(PBYTEArray & payload); 00059 int GetDataLink(PBYTEArray & payload); 00060 int GetIP(PBYTEArray & payload); 00061 int GetUDP(PBYTEArray & payload); 00062 int GetRTP(RTP_DataFrame & rtp); 00063 00064 const PTime & GetPacketTime() const { return m_packetTime; } 00065 const PIPSocket::Address & GetSrcIP() const { return m_packetSrcIP; } 00066 const PIPSocket::Address & GetDstIP() const { return m_packetDstIP; } 00067 unsigned IsFragmentated() const { return m_fragmentated; } 00068 WORD GetSrcPort() const { return m_packetSrcPort; } 00069 WORD GetDstPort() const { return m_packetDstPort; } 00070 00071 void SetFilterSrcIP( 00072 const PIPSocket::Address & ip 00073 ) { m_filterSrcIP = ip; } 00074 const PIPSocket::Address & GetFilterSrcIP() const { return m_filterSrcIP; } 00075 00076 void SetFilterDstIP( 00077 const PIPSocket::Address & ip 00078 ) { m_filterDstIP = ip; } 00079 const PIPSocket::Address & GetFilterDstIP() const { return m_filterDstIP; } 00080 00081 void SetFilterSrcPort( 00082 WORD port 00083 ) { m_filterSrcPort = port; } 00084 WORD GetFilterSrcPort() const { return m_filterSrcPort; } 00085 00086 void SetFilterDstPort( 00087 WORD port 00088 ) { m_filterDstPort = port; } 00089 WORD GetFilterDstPort() const { return m_filterDstPort; } 00090 00091 00092 struct DiscoveredRTPInfo { 00093 DiscoveredRTPInfo(); 00094 00095 PIPSocketAddressAndPort m_addr[2]; 00096 RTP_DataFrame::PayloadTypes m_payload[2]; 00097 bool m_found[2]; 00098 00099 DWORD m_ssrc[2]; 00100 WORD m_seq[2]; 00101 DWORD m_ts[2]; 00102 00103 unsigned m_ssrc_matches[2]; 00104 unsigned m_seq_matches[2]; 00105 unsigned m_ts_matches[2]; 00106 00107 RTP_DataFrame m_firstFrame[2]; 00108 00109 PString m_type[2]; 00110 PString m_format[2]; 00111 00112 size_t m_index[2]; 00113 }; 00114 class DiscoveredRTPMap : public PObject, public std::map<std::string, DiscoveredRTPInfo> 00115 { 00116 PCLASSINFO(DiscoveredRTPMap, PObject); 00117 public: 00118 void PrintOn(ostream & strm) const; 00119 }; 00120 00121 bool DiscoverRTP(DiscoveredRTPMap & discoveredRTPMap); 00122 00123 void SetFilters( 00124 const DiscoveredRTPInfo & rtp, 00125 int dir 00126 ); 00127 bool SetFilters( 00128 const DiscoveredRTPMap & rtp, 00129 size_t index 00130 ); 00131 00132 bool SetPayloadMap( 00133 RTP_DataFrame::PayloadTypes pt, 00134 const OpalMediaFormat & format 00135 ); 00136 00137 OpalMediaFormat GetMediaFormat(const RTP_DataFrame & rtp) const; 00138 00139 protected: 00140 PINDEX GetNetworkLayerHeaderSize(); 00141 00142 struct FileHeader { 00143 DWORD magic_number; /* magic number */ 00144 WORD version_major; /* major version number */ 00145 WORD version_minor; /* minor version number */ 00146 DWORD thiszone; /* GMT to local correction */ 00147 DWORD sigfigs; /* accuracy of timestamps */ 00148 DWORD snaplen; /* max length of captured packets, in octets */ 00149 DWORD network; /* data link type */ 00150 }; 00151 00152 struct RecordHeader { 00153 DWORD ts_sec; /* timestamp seconds */ 00154 DWORD ts_usec; /* timestamp microseconds */ 00155 DWORD incl_len; /* number of octets of packet saved in file */ 00156 DWORD orig_len; /* actual length of packet */ 00157 }; 00158 00159 00160 FileHeader m_fileHeader; 00161 bool m_otherEndian; 00162 PBYTEArray m_rawPacket; 00163 PTime m_packetTime; 00164 00165 PIPSocket::Address m_filterSrcIP; 00166 PIPSocket::Address m_filterDstIP; 00167 PIPSocket::Address m_packetSrcIP; 00168 PIPSocket::Address m_packetDstIP; 00169 00170 PBYTEArray m_fragments; 00171 bool m_fragmentated; 00172 unsigned m_fragmentProto; 00173 00174 WORD m_filterSrcPort; 00175 WORD m_filterDstPort; 00176 WORD m_packetSrcPort; 00177 WORD m_packetDstPort; 00178 00179 std::map<RTP_DataFrame::PayloadTypes, OpalMediaFormat> m_payloadType2mediaFormat; 00180 }; 00181 00182 00183 #endif // PTLIB_PCAPFILE_H 00184 00185 00186 // End Of File ///////////////////////////////////////////////////////////////