OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
pkt_trace.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef vnsw_agent_pkt_trace_hpp
6 #define vnsw_agent_pkt_trace_hpp
7 
8 #include <boost/scoped_array.hpp>
9 
10 struct AgentHdr;
11 
12 class PktTrace {
13 public:
14  static const std::size_t kPktMaxTraceSize = 512; // number of bytes stored
15  static const std::size_t kPktNumBuffers = 100; // number of buffers stored
16  static const std::size_t kPktMaxNumBuffers = 512000;
17 
18  enum Direction {
19  In,
20  Out,
22  };
23 
24  struct Pkt {
26  std::size_t len;
28 
29  Pkt() : dir(Invalid), len(0) {}
30  void Copy(Direction d, std::size_t l, uint8_t *msg,
31  std::size_t pkt_trace_size, const AgentHdr *hdr);
32  };
33 
34  typedef boost::function<void(PktTrace::Pkt &)> Cb;
35 
38  pkt_buffer_.resize(num_buffers_);
39  }
40  virtual ~PktTrace() {}
41 
42  void AddPktTrace(Direction dir, std::size_t len, uint8_t *msg,
43  const AgentHdr *hdr);
44  void Clear() {
45  count_ = 0;
46  end_ = -1;
47  }
48 
49  void Iterate(Cb cb) {
50  if (!cb.empty() && count_) {
51  uint32_t start_ =
52  (count_ < num_buffers_) ? 0 : (end_ + 1) % num_buffers_;
53  for (uint32_t i = 0; i < count_; i++)
54  cb(pkt_buffer_[(start_ + i) % num_buffers_]);
55  }
56  }
57 
58  std::size_t num_buffers() const { return num_buffers_; }
59  std::size_t pkt_trace_size() const { return pkt_trace_size_; }
60 
61  void set_pkt_trace_size(std::size_t size) {
62  pkt_trace_size_ = std::min(size, kPktMaxTraceSize);
63  }
64 
65  // change number of buffers
66  void set_num_buffers(uint32_t num_buffers) {
67  if (num_buffers_ != num_buffers) {
68  // existing buffers are cleared upon resizing
69  count_ = 0;
70  end_ = -1;
72  pkt_buffer_.resize(num_buffers_);
73  }
74  }
75 
76 private:
77  uint32_t end_;
78  uint32_t count_;
79  std::size_t num_buffers_;
80  std::size_t pkt_trace_size_;
81  std::vector<Pkt> pkt_buffer_;
82 };
83 
84 #endif
Direction dir
Definition: pkt_trace.h:25
std::size_t len
Definition: pkt_trace.h:26
void Clear()
Definition: pkt_trace.h:44
PktTrace()
Definition: pkt_trace.h:36
void set_pkt_trace_size(std::size_t size)
Definition: pkt_trace.h:61
uint32_t count_
Definition: pkt_trace.h:78
void set_num_buffers(uint32_t num_buffers)
Definition: pkt_trace.h:66
void AddPktTrace(Direction dir, std::size_t len, uint8_t *msg, const AgentHdr *hdr)
std::vector< Pkt > pkt_buffer_
Definition: pkt_trace.h:81
std::size_t pkt_trace_size_
Definition: pkt_trace.h:80
static const std::size_t kPktMaxTraceSize
Definition: pkt_trace.h:14
void Iterate(Cb cb)
Definition: pkt_trace.h:49
std::size_t pkt_trace_size() const
Definition: pkt_trace.h:59
std::size_t num_buffers() const
Definition: pkt_trace.h:58
std::size_t num_buffers_
Definition: pkt_trace.h:79
static const std::size_t kPktMaxNumBuffers
Definition: pkt_trace.h:16
virtual ~PktTrace()
Definition: pkt_trace.h:40
boost::function< void(PktTrace::Pkt &)> Cb
Definition: pkt_trace.h:34
uint8_t pkt[kPktMaxTraceSize]
Definition: pkt_trace.h:27
uint32_t end_
Definition: pkt_trace.h:77
void Copy(Direction d, std::size_t l, uint8_t *msg, std::size_t pkt_trace_size, const AgentHdr *hdr)
static const std::size_t kPktNumBuffers
Definition: pkt_trace.h:15