OPAL  Version 3.10.10
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  * $Revision: 27285 $
29  * $Author: rjongbloed $
30  * $Date: 2012-03-22 20:44:50 -0500 (Thu, 22 Mar 2012) $
31  */
32 
33 #ifndef PTLIB_PCAPFILE_H
34 #define PTLIB_PCAPFILE_H
35 
36 #ifdef P_USE_PRAGMA
37 #pragma interface
38 #endif
39 
40 #include <rtp/rtp.h>
41 #include <opal/mediafmt.h>
42 #include <ptlib/sockets.h>
43 
44 
47 class OpalPCAPFile : public PFile
48 {
49  PCLASSINFO(OpalPCAPFile, PFile);
50  public:
51  OpalPCAPFile();
52 
53  bool Open(const PFilePath & filename);
54  bool Restart();
55 
56  void PrintOn(ostream & strm) const;
57 
58  bool ReadRawPacket(PBYTEArray & payload);
59  int GetDataLink(PBYTEArray & payload);
60  int GetIP(PBYTEArray & payload);
61  int GetUDP(PBYTEArray & payload);
62  int GetRTP(RTP_DataFrame & rtp);
63 
64  const PTime & GetPacketTime() const { return m_packetTime; }
65  const PIPSocket::Address & GetSrcIP() const { return m_packetSrcIP; }
66  const PIPSocket::Address & GetDstIP() const { return m_packetDstIP; }
67  unsigned IsFragmentated() const { return m_fragmentated; }
68  WORD GetSrcPort() const { return m_packetSrcPort; }
69  WORD GetDstPort() const { return m_packetDstPort; }
70 
72  const PIPSocket::Address & ip
73  ) { m_filterSrcIP = ip; }
74  const PIPSocket::Address & GetFilterSrcIP() const { return m_filterSrcIP; }
75 
77  const PIPSocket::Address & ip
78  ) { m_filterDstIP = ip; }
79  const PIPSocket::Address & GetFilterDstIP() const { return m_filterDstIP; }
80 
82  WORD port
83  ) { m_filterSrcPort = port; }
84  WORD GetFilterSrcPort() const { return m_filterSrcPort; }
85 
87  WORD port
88  ) { m_filterDstPort = port; }
89  WORD GetFilterDstPort() const { return m_filterDstPort; }
90 
91 
94 
95  PIPSocketAddressAndPort m_addr[2];
97  bool m_found[2];
98 
99  DWORD m_ssrc[2];
100  WORD m_seq[2];
101  DWORD m_ts[2];
102 
103  unsigned m_ssrc_matches[2];
104  unsigned m_seq_matches[2];
105  unsigned m_ts_matches[2];
106 
108 
109  PString m_type[2];
110  PString m_format[2];
111 
112  size_t m_index[2];
113  };
114  class DiscoveredRTPMap : public PObject, public std::map<std::string, DiscoveredRTPInfo>
115  {
116  PCLASSINFO(DiscoveredRTPMap, PObject);
117  public:
118  void PrintOn(ostream & strm) const;
119  };
120 
121  bool DiscoverRTP(DiscoveredRTPMap & discoveredRTPMap);
122 
123  void SetFilters(
124  const DiscoveredRTPInfo & rtp,
125  int dir
126  );
127  bool SetFilters(
128  const DiscoveredRTPMap & rtp,
129  size_t index
130  );
131 
132  bool SetPayloadMap(
134  const OpalMediaFormat & format
135  );
136 
137  OpalMediaFormat GetMediaFormat(const RTP_DataFrame & rtp) const;
138 
139  protected:
140  PINDEX GetNetworkLayerHeaderSize();
141 
142  struct FileHeader {
143  DWORD magic_number; /* magic number */
144  WORD version_major; /* major version number */
145  WORD version_minor; /* minor version number */
146  DWORD thiszone; /* GMT to local correction */
147  DWORD sigfigs; /* accuracy of timestamps */
148  DWORD snaplen; /* max length of captured packets, in octets */
149  DWORD network; /* data link type */
150  };
151 
152  struct RecordHeader {
153  DWORD ts_sec; /* timestamp seconds */
154  DWORD ts_usec; /* timestamp microseconds */
155  DWORD incl_len; /* number of octets of packet saved in file */
156  DWORD orig_len; /* actual length of packet */
157  };
158 
159 
162  PBYTEArray m_rawPacket;
164 
165  PIPSocket::Address m_filterSrcIP;
166  PIPSocket::Address m_filterDstIP;
167  PIPSocket::Address m_packetSrcIP;
168  PIPSocket::Address m_packetDstIP;
169 
170  PBYTEArray m_fragments;
172  unsigned m_fragmentProto;
173 
178 
179  std::map<RTP_DataFrame::PayloadTypes, OpalMediaFormat> m_payloadType2mediaFormat;
180 };
181 
182 
183 #endif // PTLIB_PCAPFILE_H
184 
185 
186 // End Of File ///////////////////////////////////////////////////////////////