LCOV - code coverage report
Current view: top level - vnsw/agent/pkt - pkt_trace.h (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 9 29 31.0 %
Date: 2026-11-09 02:10:49 Functions: 4 10 40.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.14