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 13 : Proto::Proto(Agent *agent, const char *task_name, PktHandler::PktModuleName mod, 14 13 : boost::asio::io_context &io) 15 13 : : agent_(agent), module_(mod), trace_(true), free_buffer_(false), io_(io), 16 13 : work_queue_(TaskScheduler::GetInstance()->GetTaskId(task_name), mod, 17 13 : boost::bind(&Proto::ProcessProto, this, _1)) { 18 13 : agent->pkt()->pkt_handler()->Register(mod, this); 19 13 : std::ostringstream str; 20 13 : str << "Proto work queue. Module " << mod; 21 13 : work_queue_.set_name(str.str()); 22 13 : } 23 : 24 13 : Proto::~Proto() { 25 13 : work_queue_.Shutdown(); 26 13 : } 27 : 28 24 : void Proto::FreeBuffer(PktInfo *msg) { 29 24 : msg->pkt = NULL; 30 24 : msg->eth = NULL; 31 24 : msg->arp = NULL; 32 24 : msg->ip = NULL; 33 24 : msg->transp.tcp = NULL; 34 24 : msg->data = NULL; 35 24 : msg->reset_packet_buffer(); 36 24 : } 37 : 38 101 : bool Proto::Enqueue(boost::shared_ptr<PktInfo> msg) { 39 101 : if (Validate(msg.get()) == false) { 40 0 : return true; 41 : } 42 : 43 101 : if (free_buffer_) { 44 0 : FreeBuffer(msg.get()); 45 : } 46 : 47 101 : return work_queue_.Enqueue(msg); 48 : } 49 : 50 150 : bool Proto::RunProtoHandler(ProtoHandler *handler) { 51 150 : if (handler->Run()) 52 135 : delete handler; 53 150 : 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 125 : bool Proto::ProcessProto(boost::shared_ptr<PktInfo> msg_info) { 60 125 : PktHandler *pkt_handler = agent_->pkt()->pkt_handler(); 61 125 : if (trace_) { 62 101 : pkt_handler->AddPktTrace(module_, PktTrace::In, msg_info.get()); 63 : } 64 : 65 125 : ProtoHandler *handler = AllocProtoHandler(msg_info, io_); 66 125 : return RunProtoHandler(handler); 67 : }