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 22 : void Proto::FreeBuffer(PktInfo *msg) { 29 22 : msg->pkt = NULL; 30 22 : msg->eth = NULL; 31 22 : msg->arp = NULL; 32 22 : msg->ip = NULL; 33 22 : msg->transp.tcp = NULL; 34 22 : msg->data = NULL; 35 22 : msg->reset_packet_buffer(); 36 22 : } 37 : 38 96 : bool Proto::Enqueue(boost::shared_ptr<PktInfo> msg) { 39 96 : if (Validate(msg.get()) == false) { 40 0 : return true; 41 : } 42 : 43 96 : if (free_buffer_) { 44 0 : FreeBuffer(msg.get()); 45 : } 46 : 47 96 : return work_queue_.Enqueue(msg); 48 : } 49 : 50 143 : bool Proto::RunProtoHandler(ProtoHandler *handler) { 51 143 : if (handler->Run()) 52 129 : delete handler; 53 143 : 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 118 : bool Proto::ProcessProto(boost::shared_ptr<PktInfo> msg_info) { 60 118 : PktHandler *pkt_handler = agent_->pkt()->pkt_handler(); 61 118 : if (trace_) { 62 96 : pkt_handler->AddPktTrace(module_, PktTrace::In, msg_info.get()); 63 : } 64 : 65 118 : ProtoHandler *handler = AllocProtoHandler(msg_info, io_); 66 118 : return RunProtoHandler(handler); 67 : }