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 16 : Proto::Proto(Agent *agent, const char *task_name, PktHandler::PktModuleName mod, 14 16 : boost::asio::io_context &io) 15 16 : : agent_(agent), module_(mod), trace_(true), free_buffer_(false), io_(io), 16 16 : work_queue_(TaskScheduler::GetInstance()->GetTaskId(task_name), mod, 17 16 : boost::bind(&Proto::ProcessProto, this, _1)) { 18 16 : agent->pkt()->pkt_handler()->Register(mod, this); 19 16 : std::ostringstream str; 20 16 : str << "Proto work queue. Module " << mod; 21 16 : work_queue_.set_name(str.str()); 22 16 : } 23 : 24 16 : Proto::~Proto() { 25 16 : work_queue_.Shutdown(); 26 16 : } 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 97 : bool Proto::Enqueue(boost::shared_ptr<PktInfo> msg) { 39 97 : if (Validate(msg.get()) == false) { 40 0 : return true; 41 : } 42 : 43 97 : if (free_buffer_) { 44 0 : FreeBuffer(msg.get()); 45 : } 46 : 47 97 : return work_queue_.Enqueue(msg); 48 : } 49 : 50 144 : bool Proto::RunProtoHandler(ProtoHandler *handler) { 51 144 : if (handler->Run()) 52 130 : delete handler; 53 144 : 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 119 : bool Proto::ProcessProto(boost::shared_ptr<PktInfo> msg_info) { 60 119 : PktHandler *pkt_handler = agent_->pkt()->pkt_handler(); 61 119 : if (trace_) { 62 97 : pkt_handler->AddPktTrace(module_, PktTrace::In, msg_info.get()); 63 : } 64 : 65 119 : ProtoHandler *handler = AllocProtoHandler(msg_info, io_); 66 119 : return RunProtoHandler(handler); 67 : }