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
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 int GetDataLink(PBYTEArray & payload);
00059 int GetIP(PBYTEArray & payload);
00060 int GetUDP(PBYTEArray & payload);
00061 int GetRTP(RTP_DataFrame & rtp);
00062
00063 const PTime & GetPacketTime() const { return m_rawPacket.GetTimestamp(); }
00064 const PIPSocket::Address & GetSrcIP() const { return m_packetSrc.GetAddress(); }
00065 const PIPSocket::Address & GetDstIP() const { return m_packetDst.GetAddress(); }
00066 unsigned IsFragmentated() const { return m_rawPacket.IsFragmentated(); }
00067 WORD GetSrcPort() const { return m_packetSrc.GetPort(); }
00068 WORD GetDstPort() const { return m_packetDst.GetPort(); }
00069
00070 void SetFilterSrcIP(
00071 const PIPSocket::Address & ip
00072 ) { m_filterSrc.SetAddress(ip); }
00073 const PIPSocket::Address & GetFilterSrcIP() const { return m_filterSrc.GetAddress(); }
00074
00075 void SetFilterDstIP(
00076 const PIPSocket::Address & ip
00077 ) { m_filterDst.SetAddress(ip); }
00078 const PIPSocket::Address & GetFilterDstIP() const { return m_filterDst.GetAddress(); }
00079
00080 void SetFilterSrcPort(
00081 WORD port
00082 ) { m_filterSrc.SetPort(port); }
00083 WORD GetFilterSrcPort() const { return m_filterSrc.GetPort(); }
00084
00085 void SetFilterDstPort(
00086 WORD port
00087 ) { m_filterDst.SetPort(port); }
00088 WORD GetFilterDstPort() const { return m_filterDst.GetPort(); }
00089
00090
00091 struct DiscoveredRTPInfo {
00092 DiscoveredRTPInfo();
00093
00094 PIPSocketAddressAndPort m_addr[2];
00095 RTP_DataFrame::PayloadTypes m_payload[2];
00096 bool m_found[2];
00097
00098 DWORD m_ssrc[2];
00099 WORD m_seq[2];
00100 DWORD m_ts[2];
00101
00102 unsigned m_ssrc_matches[2];
00103 unsigned m_seq_matches[2];
00104 unsigned m_ts_matches[2];
00105
00106 RTP_DataFrame m_firstFrame[2];
00107
00108 PString m_type[2];
00109 PString m_format[2];
00110
00111 size_t m_index[2];
00112 };
00113 class DiscoveredRTPMap : public PObject, public std::map<std::string, DiscoveredRTPInfo>
00114 {
00115 PCLASSINFO(DiscoveredRTPMap, PObject);
00116 public:
00117 void PrintOn(ostream & strm) const;
00118 };
00119
00120 bool DiscoverRTP(DiscoveredRTPMap & discoveredRTPMap);
00121
00122 bool SetFilters(
00123 const DiscoveredRTPInfo & rtp,
00124 int dir,
00125 const PString & format = PString::Empty()
00126 );
00127 bool SetFilters(
00128 const DiscoveredRTPMap & rtp,
00129 size_t index,
00130 const PString & format = PString::Empty()
00131 );
00132
00133 bool SetPayloadMap(
00134 RTP_DataFrame::PayloadTypes pt,
00135 const OpalMediaFormat & format
00136 );
00137
00138 OpalMediaFormat GetMediaFormat(const RTP_DataFrame & rtp) const;
00139
00140 protected:
00141 struct FileHeader {
00142 DWORD magic_number;
00143 WORD version_major;
00144 WORD version_minor;
00145 DWORD thiszone;
00146 DWORD sigfigs;
00147 DWORD snaplen;
00148 DWORD network;
00149 };
00150
00151 struct RecordHeader {
00152 DWORD ts_sec;
00153 DWORD ts_usec;
00154 DWORD incl_len;
00155 DWORD orig_len;
00156 };
00157
00158
00159 FileHeader m_fileHeader;
00160
00161 class Frame : public PEthSocket::Frame {
00162 public:
00163 Frame() : m_otherEndian(false) { }
00164
00165 virtual bool Read(
00166 PChannel & channel,
00167 PINDEX packetSize = P_MAX_INDEX
00168 );
00169
00170 bool m_otherEndian;
00171 };
00172 Frame m_rawPacket;
00173
00174 PIPSocketAddressAndPort m_filterSrc;
00175 PIPSocketAddressAndPort m_filterDst;
00176 PIPSocketAddressAndPort m_packetSrc;
00177 PIPSocketAddressAndPort m_packetDst;
00178
00179 std::map<RTP_DataFrame::PayloadTypes, OpalMediaFormat> m_payloadType2mediaFormat;
00180 };
00181
00182
00183 #endif // PTLIB_PCAPFILE_H
00184
00185
00186