LCOV - code coverage report
Current view: top level - vnsw/agent/pkt - proto.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 13 38 34.2 %
Date: 2026-06-18 01:51:13 Functions: 2 7 28.6 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
       3             :  */
       4             : 
       5             : #include "base/os.h"
       6             : #include "pkt/proto.h"
       7             : #include "pkt/proto_handler.h"
       8             : #include "pkt/pkt_init.h"
       9             : #include "cmn/agent_stats.h"
      10             : 
      11             : ////////////////////////////////////////////////////////////////////////////////
      12             : 
      13           3 : Proto::Proto(Agent *agent, const char *task_name, PktHandler::PktModuleName mod,
      14           3 :              boost::asio::io_context &io)
      15           3 :     : agent_(agent), module_(mod), trace_(true), free_buffer_(false), io_(io),
      16           3 :       work_queue_(TaskScheduler::GetInstance()->GetTaskId(task_name), mod,
      17           3 :                   boost::bind(&Proto::ProcessProto, this, _1)) {
      18           3 :     agent->pkt()->pkt_handler()->Register(mod, this);
      19           3 :     std::ostringstream str;
      20           3 :     str << "Proto work queue. Module " << mod;
      21           3 :     work_queue_.set_name(str.str());
      22           3 : }
      23             : 
      24           3 : Proto::~Proto() {
      25           3 :     work_queue_.Shutdown();
      26           3 : }
      27             : 
      28           0 : void Proto::FreeBuffer(PktInfo *msg) {
      29           0 :     msg->pkt = NULL;
      30           0 :     msg->eth = NULL;
      31           0 :     msg->arp = NULL;
      32           0 :     msg->ip = NULL;
      33           0 :     msg->transp.tcp = NULL;
      34           0 :     msg->data = NULL;
      35           0 :     msg->reset_packet_buffer();
      36           0 : }
      37             : 
      38           0 : bool Proto::Enqueue(boost::shared_ptr<PktInfo> msg) {
      39           0 :     if (Validate(msg.get()) == false) {
      40           0 :         return true;
      41             :     }
      42             : 
      43           0 :     if (free_buffer_) {
      44           0 :         FreeBuffer(msg.get());
      45             :     }
      46             : 
      47           0 :     return work_queue_.Enqueue(msg);
      48             : }
      49             : 
      50           0 : bool Proto::RunProtoHandler(ProtoHandler *handler) {
      51           0 :     if (handler->Run())
      52           0 :         delete handler;
      53           0 :     return true;
      54             : }
      55             : 
      56             : // PktHandler enqueues the packet as-is without decoding based on "cmd" in
      57             : // agent_hdr. Decode the pacekt first. Its possible that protocol handler may
      58             : // change based on packet decode
      59           0 : bool Proto::ProcessProto(boost::shared_ptr<PktInfo> msg_info) {
      60           0 :     PktHandler *pkt_handler = agent_->pkt()->pkt_handler();
      61           0 :     if (trace_) {
      62           0 :         pkt_handler->AddPktTrace(module_, PktTrace::In, msg_info.get());
      63             :     }
      64             : 
      65           0 :     ProtoHandler *handler = AllocProtoHandler(msg_info, io_);
      66           0 :     return RunProtoHandler(handler);
      67             : }

Generated by: LCOV version 1.14