Line data Source code
1 : /* 2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. 3 : */ 4 : 5 : #include <boost/asio.hpp> 6 : #include <db/db_entry.h> 7 : #include <db/db_table.h> 8 : #include <db/db_table_partition.h> 9 : #include <base/address_util.h> 10 : #include <vrouter/ksync/sandesh_ksync.h> 11 : #include <vrouter/ksync/flowtable_ksync.h> 12 : #include <vrouter/ksync/interface_ksync.h> 13 : #include <pkt/flow_mgmt.h> 14 : #include <pkt/flow_table.h> 15 : #include <oper/mirror_table.h> 16 : #include <vrouter/ksync/ksync_init.h> 17 : #include <pkt/flow_proto.h> 18 : #include <pkt/flow_token.h> 19 : 20 69 : void vr_interface_req::Process(SandeshContext *context) { 21 69 : AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context); 22 69 : ioc->IfMsgHandler(this); 23 69 : } 24 : 25 0 : void vr_pkt_drop_log_req::Process(SandeshContext *context) 26 0 : {} 27 : 28 0 : void vr_info_req::Process(SandeshContext *context) 29 0 : {} 30 : 31 0 : void vr_drop_stats_req::Process(SandeshContext *context) { 32 0 : AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context); 33 0 : ioc->DropStatsMsgHandler(this); 34 0 : } 35 : 36 0 : void vr_vrf_stats_req::Process(SandeshContext *context) { 37 0 : AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context); 38 0 : ioc->VrfStatsMsgHandler(this); 39 0 : } 40 : 41 0 : void vr_hugepage_config::Process(SandeshContext *context) { 42 0 : AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context); 43 0 : ioc->VrouterHugePageHandler(this); 44 0 : } 45 : 46 6 : void vrouter_ops::Process(SandeshContext *context) { 47 6 : AgentSandeshContext *ioc = static_cast<AgentSandeshContext *>(context); 48 6 : ioc->VrouterOpsMsgHandler(this); 49 6 : } 50 : 51 0 : void vr_mem_stats_req::Process(SandeshContext *context) { 52 0 : } 53 : 54 1093 : int KSyncSandeshContext::VrResponseMsgHandler(vr_response *r) { 55 1093 : response_code_ = r->get_resp_code(); 56 : 57 1093 : if (response_code_ < 0) { 58 0 : return -response_code_; 59 : } 60 : 61 1093 : return 0; 62 : } 63 : 64 0 : void KSyncSandeshContext::BridgeTableInfoHandler(vr_bridge_table_data *r) { 65 0 : assert(r->get_btable_op() == sandesh_op::GET); 66 0 : ksync_->ksync_bridge_memory()->set_major_devid(r->get_btable_dev()); 67 0 : ksync_->ksync_bridge_memory()->set_table_size(r->get_btable_size()); 68 0 : if (r->get_btable_file_path() != Agent::NullString()) { 69 0 : ksync_->ksync_bridge_memory()-> 70 0 : set_table_path(r->get_btable_file_path()); 71 : } 72 0 : LOG(DEBUG, "Flow table size : " << r->get_btable_size()); 73 0 : return; 74 : } 75 : 76 0 : void KSyncSandeshContext::FlowTableInfoHandler(vr_flow_table_data *r) { 77 0 : assert(r->get_ftable_op() == flow_op::FLOW_TABLE_GET); 78 0 : ksync_->ksync_flow_memory()->set_major_devid(r->get_ftable_dev()); 79 0 : ksync_->ksync_flow_memory()->set_table_size(r->get_ftable_size()); 80 0 : if (r->get_ftable_file_path() != Agent::NullString()) { 81 0 : ksync_->ksync_flow_memory()->set_table_path(r->get_ftable_file_path()); 82 : } 83 0 : LOG(DEBUG, "Flow table size : " << r->get_ftable_size()); 84 0 : } 85 : 86 0 : static void LogFlowError(vr_flow_response *r, int err) { 87 0 : string op; 88 0 : if (r->get_fresp_flags() != 0) { 89 0 : op = "Add/Update"; 90 : } else { 91 0 : op = "Delete"; 92 : } 93 : 94 0 : LOG(ERROR, "Error Flow entry op = " << op 95 : << " flow_handle = " << (int) r->get_fresp_index() 96 : << " gen-id = " << (int) r->get_fresp_gen_id()); 97 0 : } 98 : 99 : // Handle vr_flow response from VRouter 100 : // We combine responses from both vr_flow and vr_response messages and 101 : // generate single event. Copy the results in vr_flow in KSync entry. 102 : // On receiving vr_response message, event will be generated for both messages 103 144 : void KSyncSandeshContext::FlowResponseHandler(vr_flow_response *r) { 104 144 : assert(r->get_fresp_op() == flow_op::FLOW_SET); 105 : 106 144 : const KSyncIoContext *ioc = ksync_io_ctx(); 107 : FlowTableKSyncEntry *ksync_entry = 108 144 : dynamic_cast<FlowTableKSyncEntry *>(ioc->GetKSyncEntry()); 109 144 : assert(ksync_entry != NULL); 110 144 : ksync_entry->ReleaseToken(); 111 : // Handling a new KSync response. Reset the response-info fields, they will 112 : // be filled below as necessary 113 144 : ksync_entry->ResetKSyncResponseInfo(); 114 : 115 144 : assert(r->get_fresp_op() == flow_op::FLOW_SET); 116 144 : int err = GetErrno(); 117 144 : if (err == EBADF) { 118 0 : LogFlowError(r, err); 119 : } 120 : 121 : // Skip delete operation. 122 144 : if (ioc->event() == KSyncEntry::DEL_ACK) { 123 44 : return; 124 : } 125 : 126 100 : ksync_entry->SetKSyncResponseInfo(err, r->get_fresp_index(), 127 100 : r->get_fresp_gen_id(), 128 100 : r->get_fresp_bytes(), 129 100 : r->get_fresp_packets(), 130 100 : r->get_fresp_stats_oflow()); 131 100 : return; 132 : } 133 : 134 0 : void KSyncSandeshContext::FlowMsgHandler(vr_flow_req *r) { 135 0 : assert(0); 136 : } 137 : 138 0 : void KSyncSandeshContext::IfMsgHandler(vr_interface_req *r) { 139 0 : context_marker_ = r->get_vifr_idx(); 140 0 : } 141 : 142 0 : void KSyncSandeshContext::VrouterHugePageHandler(vr_hugepage_config *r) { 143 0 : std::string message; 144 : 145 0 : switch(r->get_vhp_resp()) { 146 0 : case VR_HPAGE_CFG_RESP_HPAGE_SUCCESS: 147 0 : message = "Huge pages set successfully"; 148 0 : break; 149 0 : case VR_HPAGE_CFG_RESP_MEM_FAILURE: 150 0 : message = "ERROR !! Failed to set huge pages and vrouter couldnt allocate memory !!"; 151 0 : break; 152 0 : case VR_HPAGE_CFG_RESP_INVALID_ARG_MEM_INITED: 153 0 : message = "Invalid huge pages argument, vrouter using allocated memory (not huge pages)"; 154 0 : break; 155 0 : case VR_HPAGE_CFG_RESP_HPAGE_FAILURE_MEM_INITED: 156 0 : message = "Failed to set huge pages, vrouter using allocated memory (not huge pages)"; 157 0 : break; 158 0 : case VR_HPAGE_CFG_RESP_MEM_ALREADY_INITED: 159 0 : message = "Vrouter using already allocated memory"; 160 0 : break; 161 0 : case VR_HPAGE_CFG_RESP_HPAGE_PARTIAL_SUCCESS: 162 0 : message = "Not all huge pages are successfully set, vrouter using allocated memory (not huge pages)"; 163 0 : break; 164 0 : default: 165 0 : message = "Failed to set huge pages, invalid vrouter response"; 166 0 : break; 167 : } 168 : 169 0 : LOG(INFO, message); 170 0 : } 171 : 172 3 : void KSyncSandeshContext::VrouterOpsMsgHandler(vrouter_ops *r) { 173 3 : Agent *agent = ksync_->agent(); 174 3 : agent->set_vrouter_max_labels(r->get_vo_mpls_labels()); 175 3 : agent->set_vrouter_max_nexthops(r->get_vo_nexthops()); 176 3 : agent->set_vrouter_max_bridge_entries(r->get_vo_bridge_entries()); 177 3 : agent->set_vrouter_max_oflow_bridge_entries( 178 3 : r->get_vo_oflow_bridge_entries()); 179 3 : agent->set_vrouter_max_interfaces(r->get_vo_interfaces()); 180 3 : agent->set_vrouter_max_mirror_entries(r->get_vo_mirror_entries()); 181 3 : agent->set_vrouter_max_vrfs(r->get_vo_vrfs()); 182 3 : agent->set_vrouter_max_flow_entries(r->get_vo_flow_entries()); 183 3 : agent->set_vrouter_max_oflow_entries(r->get_vo_oflow_entries()); 184 3 : agent->set_vrouter_build_info(r->get_vo_build_info()); 185 3 : agent->set_vrouter_priority_tagging(r->get_vo_priority_tagging()); 186 3 : return; 187 : }