OPAL  Version 3.18.8
pcapfile.h
Go to the documentation of this file.
1 /*
2  * pcapfile.h
3  *
4  * Ethernet capture (PCAP) file declaration
5  *
6  * Portable Tools Library
7  *
8  * Copyright (C) 2011 Vox Lucida Pty. Ltd.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Portable Tools Library.
21  *
22  * The Initial Developer of the Original Code is Vox Lucida
23  *
24  * All Rights Reserved.
25  *
26  * Contributor(s): ______________________________________.
27  */
28 
29 #ifndef PTLIB_PCAPFILE_H
30 #define PTLIB_PCAPFILE_H
31 
32 #ifdef P_USE_PRAGMA
33 #pragma interface
34 #endif
35 
36 #include <rtp/rtp.h>
37 #include <opal/mediafmt.h>
38 #include <ptlib/sockets.h>
39 
40 
41 class OpalTranscoder;
42 
43 
46 class OpalPCAPFile : public PFile
47 {
48  PCLASSINFO(OpalPCAPFile, PFile);
49  public:
50  OpalPCAPFile();
51 
52  bool Restart();
53 
54  void PrintOn(ostream & strm) const;
55 
56  bool WriteFrame(const PEthSocket::Frame & frame);
57  bool WriteRTP(const RTP_DataFrame & rtp, WORD port = 5000);
58 
59  int GetDataLink(PBYTEArray & payload);
60  int GetIP(PBYTEArray & payload);
61  int GetTCP(PBYTEArray & payload);
62  int GetUDP(PBYTEArray & payload);
63  int GetRTP(RTP_DataFrame & rtp);
64 
66  {
72  : m_transcoder(NULL)
74  , m_lastSSRC(0)
76  { }
78  };
79  int GetDecodedRTP(RTP_DataFrame & decodedRTP, DecodeContext & context);
80  int DecodeRTP(RTP_DataFrame & encodedRTP, RTP_DataFrame & decodedRTP, DecodeContext & context);
81 
82 
83  const PTime & GetPacketTime() const { return m_rawPacket.GetTimestamp(); }
84  const PIPSocket::Address & GetSrcIP() const { return m_packetSrc.GetAddress(); }
85  const PIPSocket::Address & GetDstIP() const { return m_packetDst.GetAddress(); }
86  unsigned IsFragmentated() const { return m_rawPacket.IsFragmentated(); }
87  WORD GetSrcPort() const { return m_packetSrc.GetPort(); }
88  WORD GetDstPort() const { return m_packetDst.GetPort(); }
89 
91  const PIPSocket::Address & ip
92  ) { m_filterSrc.SetAddress(ip); }
93  const PIPSocket::Address & GetFilterSrcIP() const { return m_filterSrc.GetAddress(); }
94 
96  const PIPSocket::Address & ip
97  ) { m_filterDst.SetAddress(ip); }
98  const PIPSocket::Address & GetFilterDstIP() const { return m_filterDst.GetAddress(); }
99 
101  WORD port
102  ) { m_filterSrc.SetPort(port); }
103  WORD GetFilterSrcPort() const { return m_filterSrc.GetPort(); }
104 
106  WORD port
107  ) { m_filterDst.SetPort(port); }
108  WORD GetFilterDstPort() const { return m_filterDst.GetPort(); }
109 
110 
111  struct DiscoveredRTPKey : PObject
112  {
113  PIPAddressAndPort m_src;
114  PIPAddressAndPort m_dst;
116 
118  Comparison Compare(const PObject & obj) const;
119  void PrintOn(ostream & strm) const;
120  };
121 
125 
127  DiscoveredRTPInfo(const DiscoveredRTPKey & key);
128  void PrintOn(ostream & strm) const;
129  };
130 
131  typedef PArray<DiscoveredRTPInfo> DiscoveredRTP;
132 
133  struct Progress
134  {
135  Progress(off_t length)
136  : m_fileLength(length)
137  , m_filePosition(0)
138  , m_packets(0)
139  , m_abort(false)
140  { }
141 
144  unsigned m_packets;
145  bool m_abort;
146  };
147  typedef PNotifierTemplate<Progress &> ProgressNotifier;
148 
149  bool DiscoverRTP(DiscoveredRTP & discoveredRTP, const ProgressNotifier & progressNotifier = NULL);
150 
151  bool SetFilters(
152  const DiscoveredRTPInfo & discoveredRTP,
153  const PString & format = PString::Empty()
154  );
155 
156  typedef std::map<RTP_DataFrame::PayloadTypes, OpalMediaFormat> PayloadMap;
157 
158  void SetPayloadMap(
159  const PayloadMap & payloadMap,
160  bool overwrite = false
161  );
162  bool SetPayloadMap(
164  const OpalMediaFormat & format
165  );
166 
167  OpalMediaFormat GetMediaFormat(const RTP_DataFrame & rtp) const;
168 
169  protected:
170  bool InternalOpen(OpenMode mode, OpenOptions opt, PFileInfo::Permissions permissions);
171  int InternalDecodeRTP(RTP_DataFrame & encodedRTP, RTP_DataFrame & decodedRTP, DecodeContext & context);
172 
173  struct FileHeader {
174  DWORD magic_number; /* magic number */
175  WORD version_major; /* major version number */
176  WORD version_minor; /* minor version number */
177  DWORD thiszone; /* GMT to local correction */
178  DWORD sigfigs; /* accuracy of timestamps */
179  DWORD snaplen; /* max length of captured packets, in octets */
180  DWORD network; /* data link type */
181  };
182 
183  struct RecordHeader {
184  DWORD ts_sec; /* timestamp seconds */
185  DWORD ts_usec; /* timestamp microseconds */
186  DWORD incl_len; /* number of octets of packet saved in file */
187  DWORD orig_len; /* actual length of packet */
188  };
189 
190 
192 
193  class Frame : public PEthSocket::Frame {
194  public:
195  Frame() : m_otherEndian(false) { }
196 
197  virtual bool Read(
198  PChannel & channel,
199  PINDEX packetSize = P_MAX_INDEX
200  );
201 
203  };
205  PDECLARE_MUTEX(m_writeMutex);
206 
207  PIPSocketAddressAndPort m_filterSrc;
208  PIPSocketAddressAndPort m_filterDst;
210  PIPSocketAddressAndPort m_packetSrc;
211  PIPSocketAddressAndPort m_packetDst;
212 
214 
215  struct DiscoveryInfo;
216  typedef std::map<DiscoveredRTPKey, DiscoveryInfo> DiscoveryMap;
217 };
218 
219 
220 #endif // PTLIB_PCAPFILE_H
221 
222 
223 // End Of File ///////////////////////////////////////////////////////////////
bool m_otherEndian
Definition: pcapfile.h:202
Definition: pcapfile.h:133
int GetUDP(PBYTEArray &payload)
WORD version_minor
Definition: pcapfile.h:176
Definition: pcapfile.h:65
OpalTranscoder * m_transcoder
Definition: pcapfile.h:67
std::map< RTP_DataFrame::PayloadTypes, OpalMediaFormat > PayloadMap
Definition: pcapfile.h:156
DWORD ts_sec
Definition: pcapfile.h:184
OpalMediaFormat m_mediaFormat
Definition: pcapfile.h:124
DWORD orig_len
Definition: pcapfile.h:187
int GetRTP(RTP_DataFrame &rtp)
void PrintOn(ostream &strm) const
int GetIP(PBYTEArray &payload)
RTP_SyncSourceId m_ssrc
Definition: pcapfile.h:115
DWORD thiszone
Definition: pcapfile.h:177
RTP_DataFrame::PayloadTypes m_payloadType
Definition: pcapfile.h:123
void SetPayloadMap(const PayloadMap &payloadMap, bool overwrite=false)
Definition: pcapfile.h:173
int GetDataLink(PBYTEArray &payload)
WORD GetFilterSrcPort() const
Definition: pcapfile.h:103
uint16_t RTP_SequenceNumber
Definition: rtp.h:45
PayloadTypes
Definition: rtp.h:556
bool Restart()
off_t m_filePosition
Definition: pcapfile.h:143
int DecodeRTP(RTP_DataFrame &encodedRTP, RTP_DataFrame &decodedRTP, DecodeContext &context)
WORD GetSrcPort() const
Definition: pcapfile.h:87
FileHeader m_fileHeader
Definition: pcapfile.h:191
WORD GetDstPort() const
Definition: pcapfile.h:88
bool SetFilters(const DiscoveredRTPInfo &discoveredRTP, const PString &format=PString::Empty())
DWORD network
Definition: pcapfile.h:180
DWORD snaplen
Definition: pcapfile.h:179
void SetFilterSrcIP(const PIPSocket::Address &ip)
Definition: pcapfile.h:90
int GetTCP(PBYTEArray &payload)
const PIPSocket::Address & GetSrcIP() const
Definition: pcapfile.h:84
Definition: rtp.h:540
PArray< DiscoveredRTPInfo > DiscoveredRTP
Definition: pcapfile.h:131
std::map< DiscoveredRTPKey, DiscoveryInfo > DiscoveryMap
Definition: pcapfile.h:215
Frame m_rawPacket
Definition: pcapfile.h:204
Definition: mediafmt.h:806
Progress(off_t length)
Definition: pcapfile.h:135
Definition: pcapfile.h:111
RTP_SyncSourceId m_lastSSRC
Definition: pcapfile.h:69
WORD version_major
Definition: pcapfile.h:175
const PTime & GetPacketTime() const
Definition: pcapfile.h:83
Definition: transcoders.h:134
PIPAddressAndPort m_dst
Definition: pcapfile.h:114
off_t m_fileLength
Definition: pcapfile.h:142
PayloadMap m_payloadType2mediaFormat
Definition: pcapfile.h:213
unsigned m_packets
Definition: pcapfile.h:144
bool DiscoverRTP(DiscoveredRTP &discoveredRTP, const ProgressNotifier &progressNotifier=NULL)
void PrintOn(ostream &strm) const
unsigned IsFragmentated() const
Definition: pcapfile.h:86
bool WriteRTP(const RTP_DataFrame &rtp, WORD port=5000)
Definition: pcapfile.h:193
void SetFilterSrcPort(WORD port)
Definition: pcapfile.h:100
OpalMediaFormat GetMediaFormat(const RTP_DataFrame &rtp) const
PNotifierTemplate< Progress & > ProgressNotifier
Definition: pcapfile.h:147
int GetDecodedRTP(RTP_DataFrame &decodedRTP, DecodeContext &context)
bool m_abort
Definition: pcapfile.h:145
bool WriteFrame(const PEthSocket::Frame &frame)
DWORD magic_number
Definition: pcapfile.h:174
PIPAddressAndPort m_src
Definition: pcapfile.h:113
const PIPSocket::Address & GetFilterDstIP() const
Definition: pcapfile.h:98
DWORD sigfigs
Definition: pcapfile.h:178
const PIPSocket::Address & GetDstIP() const
Definition: pcapfile.h:85
Definition: pcapfile.h:183
off_t m_lastPacketsFilePosition
Definition: pcapfile.h:70
Definition: pcapfile.h:122
RTP_SequenceNumber m_lastSequenceNumber
Definition: pcapfile.h:68
PIPSocketAddressAndPort m_packetSrc
Definition: pcapfile.h:210
Frame()
Definition: pcapfile.h:195
void PrintOn(ostream &strm) const
PIPSocketAddressAndPort m_packetDst
Definition: pcapfile.h:211
void SetFilterDstPort(WORD port)
Definition: pcapfile.h:105
int InternalDecodeRTP(RTP_DataFrame &encodedRTP, RTP_DataFrame &decodedRTP, DecodeContext &context)
bool InternalOpen(OpenMode mode, OpenOptions opt, PFileInfo::Permissions permissions)
DWORD ts_usec
Definition: pcapfile.h:185
DecodeContext()
Definition: pcapfile.h:71
WORD GetFilterDstPort() const
Definition: pcapfile.h:108
Definition: pcapfile.h:46
Comparison Compare(const PObject &obj) const
PIPSocketAddressAndPort m_filterDst
Definition: pcapfile.h:208
virtual bool Read(PChannel &channel, PINDEX packetSize=P_MAX_INDEX)
uint32_t RTP_SyncSourceId
Definition: rtp.h:46
DWORD incl_len
Definition: pcapfile.h:186
PIPSocketAddressAndPort m_filterSrc
Definition: pcapfile.h:207
RTP_SyncSourceId m_filterSSRC
Definition: pcapfile.h:209
PDECLARE_MUTEX(m_writeMutex)
void SetFilterDstIP(const PIPSocket::Address &ip)
Definition: pcapfile.h:95
const PIPSocket::Address & GetFilterSrcIP() const
Definition: pcapfile.h:93