OPAL  Version 3.10.4
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: 25534 $
29  * $Author: rjongbloed $
30  * $Date: 2011-04-08 04:02:23 -0500 (Fri, 08 Apr 2011) $
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 
43 
46 class OpalPCAPFile : public PFile
47 {
48  PCLASSINFO(OpalPCAPFile, PFile);
49  public:
50  OpalPCAPFile();
51 
52  bool Open(const PFilePath & filename);
53  bool Restart();
54 
55  void PrintOn(ostream & strm) const;
56 
57  bool ReadRawPacket(PBYTEArray & payload);
58  int GetDataLink(PBYTEArray & payload);
59  int GetIP(PBYTEArray & payload);
60  int GetUDP(PBYTEArray & payload);
61  int GetRTP(RTP_DataFrame & rtp);
62 
63  const PTime & GetPacketTime() const { return m_packetTime; }
64  const PIPSocket::Address & GetSrcIP() const { return m_packetSrcIP; }
65  const PIPSocket::Address & GetDstIP() const { return m_packetDstIP; }
66  unsigned IsFragmentated() const { return m_fragmentated; }
67  WORD GetSrcPort() const { return m_packetSrcPort; }
68  WORD GetDstPort() const { return m_packetDstPort; }
69 
71  const PIPSocket::Address & ip
72  ) { m_filterSrcIP = ip; }
73 
75  const PIPSocket::Address & ip
76  ) { m_filterDstIP = ip; }
77 
79  WORD port
80  ) { m_filterSrcPort = port; }
81 
83  WORD port
84  ) { m_filterDstPort = port; }
85 
86 
89 
90  PIPSocketAddressAndPort m_addr[2];
92  bool m_found[2];
93 
94  DWORD m_ssrc[2];
95  WORD m_seq[2];
96  DWORD m_ts[2];
97 
98  unsigned m_ssrc_matches[2];
99  unsigned m_seq_matches[2];
100  unsigned m_ts_matches[2];
101 
103 
104  PString m_type[2];
105  PString m_format[2];
106 
107  size_t m_index[2];
108  };
109  class DiscoveredRTPMap : public PObject, public std::map<std::string, DiscoveredRTPInfo>
110  {
111  PCLASSINFO(DiscoveredRTPMap, PObject);
112  public:
113  void PrintOn(ostream & strm) const;
114  };
115 
116  bool DiscoverRTP(DiscoveredRTPMap & discoveredRTPMap);
117 
118  void SetFilters(
119  const DiscoveredRTPInfo & rtp,
120  int dir
121  );
122  bool SetFilters(
123  const DiscoveredRTPMap & rtp,
124  size_t index
125  );
126 
127  bool SetPayloadMap(
129  const OpalMediaFormat & format
130  );
131 
132  OpalMediaFormat GetMediaFormat(const RTP_DataFrame & rtp) const;
133 
134  protected:
135  PINDEX GetNetworkLayerHeaderSize();
136 
137  struct FileHeader {
138  DWORD magic_number; /* magic number */
139  WORD version_major; /* major version number */
140  WORD version_minor; /* minor version number */
141  DWORD thiszone; /* GMT to local correction */
142  DWORD sigfigs; /* accuracy of timestamps */
143  DWORD snaplen; /* max length of captured packets, in octets */
144  DWORD network; /* data link type */
145  };
146 
147  struct RecordHeader {
148  DWORD ts_sec; /* timestamp seconds */
149  DWORD ts_usec; /* timestamp microseconds */
150  DWORD incl_len; /* number of octets of packet saved in file */
151  DWORD orig_len; /* actual length of packet */
152  };
153 
154 
157  PBYTEArray m_rawPacket;
159 
160  PIPSocket::Address m_filterSrcIP;
161  PIPSocket::Address m_filterDstIP;
162  PIPSocket::Address m_packetSrcIP;
163  PIPSocket::Address m_packetDstIP;
164 
165  PBYTEArray m_fragments;
167  unsigned m_fragmentProto;
168 
173 
174  std::map<RTP_DataFrame::PayloadTypes, OpalMediaFormat> m_payloadType2mediaFormat;
175 };
176 
177 
178 #endif // PTLIB_PCAPFILE_H
179 
180 
181 // End Of File ///////////////////////////////////////////////////////////////