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