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 : }