Line data Source code
1 : /* 2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. 3 : */ 4 : 5 : #include <base/address_util.h> 6 : #include "kstate.h" 7 : #include "oper/interface_common.h" 8 : #include "interface_kstate.h" 9 : #include "route_kstate.h" 10 : #include "nh_kstate.h" 11 : #include "mpls_kstate.h" 12 : #include "flow_kstate.h" 13 : #include "mirror_kstate.h" 14 : #include "vrf_assign_kstate.h" 15 : #include "vrf_stats_kstate.h" 16 : #include "drop_stats_kstate.h" 17 : #include "vxlan_kstate.h" 18 : #include "kstate_io_context.h" 19 : #include "forwarding_class_kstate.h" 20 : #include "qos_config_kstate.h" 21 : #include "vrf_kstate.h" 22 : #include "vr_nexthop.h" 23 : #include "vr_message.h" 24 : #include <net/if.h> 25 : #include <string> 26 : 27 : using namespace std; 28 : 29 0 : bool KState::MoreData() const { 30 0 : if ((vr_response_code_ & VR_MESSAGE_DUMP_INCOMPLETE)) 31 0 : return true; 32 0 : return false; 33 : } 34 : 35 0 : int KState::VrResponseMsgHandler(vr_response *r) { 36 0 : int code = r->get_resp_code(); 37 : 38 0 : KState *st = static_cast<KState *>(this); 39 0 : st->set_vr_response_code(code); 40 0 : if (code == -ENOENT) { 41 0 : ErrResp *resp = new ErrResp(); 42 0 : resp->set_context(st->response_context()); 43 0 : resp->Response(); 44 : 45 0 : st->Release(); 46 0 : return 0; 47 : } 48 : 49 0 : if (code < 0) { 50 0 : InternalErrResp *resp = new InternalErrResp(); 51 0 : resp->set_context(st->response_context()); 52 0 : resp->Response(); 53 : 54 0 : st->Release(); 55 0 : LOG(ERROR, "Error reading kstate: " << strerror(-code) << 56 : " :code: " << -code); 57 0 : return -code; 58 : } 59 : 60 0 : return 0; 61 : } 62 : 63 0 : void KState::EncodeAndSend(Sandesh &encoder) { 64 : 65 : int encode_len, error; 66 0 : KSyncSock *sock = KSyncSock::Get(0); 67 : 68 : //Due to mock mode, we have to handle case when sock is NULL. 69 0 : if (sock == NULL) { 70 0 : Agent *agent = Agent::GetInstance(); 71 0 : assert(agent && agent->isMockMode()); 72 0 : return; 73 : } 74 : 75 0 : uint8_t *buf = (uint8_t *)malloc(KSYNC_DEFAULT_MSG_SIZE); 76 : 77 0 : encode_len = encoder.WriteBinary(buf, KSYNC_DEFAULT_MSG_SIZE, &error); 78 : 79 0 : AgentSandeshContext *sctx = static_cast<AgentSandeshContext *>(this); 80 : KStateIoContext *ioc = 81 : new KStateIoContext(encode_len, (char *)buf, 82 0 : sock->AllocSeqNo(IoContext::IOC_KSYNC, 0), sctx); 83 0 : sock->GenericSend(ioc); 84 : } 85 : 86 0 : void KState::UpdateContext(const boost::any &ctx) { 87 0 : more_context_ = ctx; 88 0 : } 89 : 90 0 : const string KState::MacToString(const vector<signed char> &mac) 91 : const { 92 : /* We need the below check because if mac size is less than 6, we will 93 : * hit out_of_range exception because of mac.at code below 94 : */ 95 0 : if (mac.size() != 6) { 96 0 : return "00:00:00:00:00:00"; 97 : } 98 0 : ostringstream strm; 99 0 : strm << hex << setfill('0') << setw(2) << (int)((uint8_t) mac.at(0)) << ":" 100 0 : << setw(2) << (int)((uint8_t) mac.at(1)) << ":" << setw(2) 101 0 : << (int)((uint8_t) mac.at(2)) << ":" << setw(2) 102 0 : << (int)((uint8_t) mac.at(3)) << ":" << setw(2) 103 0 : << (int)((uint8_t) mac.at(4)) << ":" << setw(2) 104 0 : << (int)((uint8_t) mac.at(5)); 105 0 : return strm.str(); 106 0 : } 107 : 108 0 : void KState::IfMsgHandler(vr_interface_req *r) { 109 : 110 0 : KInterfaceInfo data; 111 : const Interface *intf; 112 : 113 0 : InterfaceKState *ist = static_cast<InterfaceKState *>(this); 114 0 : KInterfaceResp *resp = static_cast<KInterfaceResp *>(ist->response_object()); 115 : 116 : vector<KInterfaceInfo> &list = 117 0 : const_cast<std::vector<KInterfaceInfo>&>(resp->get_if_list()); 118 0 : data.set_type(ist->TypeToString(r->get_vifr_type())); 119 0 : data.set_flags(ist->FlagsToString(r->get_vifr_flags())); 120 0 : data.set_mirror_id(r->get_vifr_mir_id()); 121 0 : data.set_vrf(r->get_vifr_vrf()); 122 0 : data.set_idx(r->get_vifr_idx()); 123 0 : data.set_rid(r->get_vifr_rid()); 124 0 : data.set_os_idx(r->get_vifr_os_idx()); 125 0 : data.set_mtu(r->get_vifr_mtu()); 126 : 127 0 : intf = InterfaceTable::GetInstance()->FindInterface(r->get_vifr_idx()); 128 0 : if (!intf) { 129 0 : data.set_name(string("NULL")); 130 : } else { 131 0 : data.set_name(string(intf->name())); 132 : } 133 : 134 0 : Ip4Address ipaddr(r->get_vifr_ip()); 135 0 : data.set_ip(ipaddr.to_string()); 136 : 137 0 : data.set_ibytes(r->get_vifr_ibytes()); 138 0 : data.set_ipackets(r->get_vifr_ipackets()); 139 0 : data.set_ierrors(r->get_vifr_ierrors()); 140 0 : data.set_obytes(r->get_vifr_obytes()); 141 0 : data.set_opackets(r->get_vifr_opackets()); 142 0 : data.set_oerrors(r->get_vifr_oerrors()); 143 : 144 0 : data.set_ref_cnt(r->get_vifr_ref_cnt()); 145 0 : data.set_speed(r->get_vifr_speed()); 146 0 : data.set_duplexity(r->get_vifr_duplex()); 147 : 148 0 : data.set_mac(MacToString(r->get_vifr_mac())); 149 0 : data.set_qos_map_index(r->get_vifr_qos_map_index()); 150 0 : data.set_core(r->get_vifr_core()); 151 0 : data.set_queue_ipackets(r->get_vifr_queue_ipackets()); 152 0 : data.set_queue_ierrors(r->get_vifr_queue_ierrors()); 153 0 : data.set_queue_opackets(r->get_vifr_queue_opackets()); 154 0 : data.set_queue_oerrors(r->get_vifr_queue_oerrors()); 155 0 : data.set_queue_ierrors_to_lcore(ist->SetItfSandesh(r->get_vifr_queue_ierrors_to_lcore())); 156 0 : data.set_port_ipackets(r->get_vifr_port_ipackets()); 157 0 : data.set_port_ierrors(r->get_vifr_port_ierrors()); 158 0 : data.set_port_isyscalls(r->get_vifr_port_isyscalls()); 159 0 : data.set_port_inombufs(r->get_vifr_port_inombufs()); 160 0 : data.set_port_opackets(r->get_vifr_port_opackets()); 161 0 : data.set_port_oerrors(r->get_vifr_port_oerrors()); 162 0 : data.set_port_osyscalls(r->get_vifr_port_osyscalls()); 163 0 : data.set_dev_ibytes(r->get_vifr_dev_ibytes()); 164 0 : data.set_dev_ipackets(r->get_vifr_dev_ipackets()); 165 0 : data.set_dev_ierrors(r->get_vifr_dev_ierrors()); 166 0 : data.set_dev_inombufs(r->get_vifr_dev_inombufs()); 167 0 : data.set_dev_obytes(r->get_vifr_dev_obytes()); 168 0 : data.set_dev_opackets(r->get_vifr_dev_opackets()); 169 0 : data.set_dev_oerrors(r->get_vifr_dev_oerrors()); 170 0 : data.set_parent_vif_id(r->get_vifr_parent_vif_idx()); 171 0 : data.set_vlan_id(r->get_vifr_vlan_id()); 172 0 : data.set_nh_id(r->get_vifr_nh_id()); 173 0 : data.set_cross_connect_id(r->get_vifr_cross_connect_idx()); 174 0 : data.set_bridge_idx(ist->SetItfSandesh(r->get_vifr_bridge_idx())); 175 0 : data.set_ovlan_id(r->get_vifr_ovlan_id()); 176 0 : data.set_transport(r->get_vifr_transport()); 177 0 : data.set_src_mac(MacToString(r->get_vifr_src_mac())); 178 0 : data.set_fat_flow_protocol_port(ist->SetItfSandesh(r->get_vifr_fat_flow_protocol_port())); 179 0 : if (r->get_vifr_isid()) { 180 0 : data.set_isid(r->get_vifr_isid()); 181 : } 182 0 : if (r->get_vifr_pbb_mac().size()) { 183 0 : data.set_pbb_bmac(MacToString(r->get_vifr_pbb_mac())); 184 : } 185 0 : if(ist->TypeToString(r->get_vifr_type()) == "PHYSICAL") 186 : { 187 0 : std::vector<BondMemberIntfInfo> bond_interface_list; 188 0 : const char *bond_link[] = {"DOWN", "UP"}; 189 : 190 0 : data.set_status(bond_link[(r->get_vifr_intf_status() & 0x01)]); 191 : 192 0 : char *slave_intf_name = NULL; 193 0 : char *slave_intf_drv_name = NULL; 194 0 : if(!r->get_vifr_bond_slave_name().empty()) 195 : slave_intf_name = 196 : (char *)(reinterpret_cast<const signed char*> ( 197 0 : &(r->get_vifr_bond_slave_name())[0])); 198 : 199 0 : if (!r->get_vifr_bond_slave_drv_name().empty()) 200 : slave_intf_drv_name = 201 : (char *)(reinterpret_cast<const signed char*> ( 202 0 : &(r->get_vifr_bond_slave_drv_name())[0])); 203 : 204 0 : for (int i = 0; i < r->get_vifr_num_bond_slave(); i++) { 205 0 : BondMemberIntfInfo entry; 206 : 207 0 : entry.set_child_bond_interface_status( 208 0 : bond_link[(r->get_vifr_intf_status() >> (i + 1)) & 0x01]); 209 0 : if(slave_intf_name) 210 : { 211 0 : std::string str(slave_intf_name); 212 0 : entry.set_child_bond_interface_name(str); 213 : 214 0 : slave_intf_name = strchr(slave_intf_name, '\0'); 215 0 : slave_intf_name++; 216 0 : } 217 0 : if(slave_intf_drv_name) 218 : { 219 0 : std::string str1(slave_intf_drv_name); 220 0 : entry.set_child_bond_interface_drv_name(str1); 221 : 222 0 : slave_intf_drv_name = strchr(slave_intf_drv_name, '\0'); 223 0 : slave_intf_drv_name++; 224 0 : } 225 0 : bond_interface_list.push_back(entry); 226 0 : } 227 : 228 0 : data.set_bond_child_intf_list(bond_interface_list); 229 0 : } 230 0 : list.push_back(data); 231 : 232 0 : UpdateContext(r->get_vifr_idx()); 233 0 : } 234 : 235 0 : void KState::NHMsgHandler(vr_nexthop_req *r) { 236 : 237 0 : KNHInfo data; 238 : NHKState *nhst; 239 : 240 0 : nhst = static_cast<NHKState *>(this); 241 0 : KNHResp *resp = static_cast<KNHResp *>(nhst->response_object()); 242 : 243 : vector<KNHInfo> &list = 244 0 : const_cast<std::vector<KNHInfo>&>(resp->get_nh_list()); 245 0 : data.set_type(nhst->TypeToString(r->get_nhr_type())); 246 0 : data.set_family(nhst->FamilyToString(r->get_nhr_family())); 247 0 : data.set_id(r->get_nhr_id()); 248 0 : data.set_rid(r->get_nhr_rid()); 249 0 : if (r->get_nhr_type() != NH_COMPOSITE) { 250 0 : data.set_encap_oif_id(r->get_nhr_encap_oif_id()); 251 0 : data.set_encap_family(nhst->EncapFamilyToString( 252 : r->get_nhr_encap_family())); 253 : } 254 0 : data.set_vrf(r->get_nhr_vrf()); 255 0 : if (r->get_nhr_type() == NH_TUNNEL) { 256 0 : if(nhst->FamilyToString(r->get_nhr_family()) == "AF_INET") { 257 0 : Ip4Address sip(ntohl((uint32_t)r->get_nhr_tun_sip())); 258 0 : Ip4Address dip(ntohl((uint32_t)r->get_nhr_tun_dip())); 259 0 : data.set_tun_sip(sip.to_string()); 260 0 : data.set_tun_dip(dip.to_string()); 261 0 : } else if(nhst->FamilyToString(r->get_nhr_family()) == "AF_INET6") { 262 0 : data.set_tun_sip(VectorIpv6ToString(r->get_nhr_tun_sip6())); 263 0 : data.set_tun_dip(VectorIpv6ToString(r->get_nhr_tun_dip6())); 264 : } 265 0 : if (r->get_nhr_flags() & NH_FLAG_TUNNEL_UDP) { 266 0 : data.set_tun_sport(ntohs(r->get_nhr_tun_sport())); 267 0 : data.set_tun_dport(ntohs(r->get_nhr_tun_dport())); 268 : } 269 : } 270 : 271 0 : data.set_ref_cnt(r->get_nhr_ref_cnt()); 272 0 : data.set_flags(nhst->FlagsToString(r->get_nhr_flags())); 273 0 : const vector<signed char> &encap = r->get_nhr_encap(); 274 : /* Kernel does not return encap len via r->get_nhr_encap_len() 275 : * We need to fill it via the encap vector's size. */ 276 0 : if (encap.size()) { 277 0 : data.set_encap_len(encap.size()); 278 0 : data.set_encap(nhst->EncapToString(encap)); 279 : } 280 : 281 0 : nhst->SetComponentNH(r, data); 282 0 : list.push_back(data); 283 0 : UpdateContext(r->get_nhr_id()); 284 0 : } 285 : 286 0 : const std::string KState::PrefixToString(const std::vector<int8_t> &prefix) { 287 : 288 0 : int size = prefix.size(); 289 0 : string str = "unknown"; 290 0 : if (size <= 4) { 291 0 : Ip4Address::bytes_type bytes = { {0, 0, 0, 0} }; 292 0 : for (int i = 0; i < size; i++) { 293 0 : bytes[i] = prefix.at(i); 294 : } 295 0 : Ip4Address addr4(bytes); 296 0 : str = addr4.to_string(); 297 : } else { 298 0 : Ip6Address::bytes_type bytes = 299 : { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; 300 0 : for (int i = 0; i < size; i++) { 301 0 : bytes[i] = prefix.at(i); 302 : } 303 0 : Ip6Address addr6(bytes); 304 0 : str = addr6.to_string(); 305 : } 306 0 : return str; 307 0 : } 308 : 309 0 : void KState::RouteMsgHandler(vr_route_req *r) { 310 : 311 0 : KRouteInfo data; 312 : RouteKState *rst; 313 : 314 0 : rst = static_cast<RouteKState *>(this); 315 0 : KRouteResp *resp = static_cast<KRouteResp *>(rst->response_object()); 316 : 317 : vector<KRouteInfo> &list = 318 0 : const_cast<std::vector<KRouteInfo>&>(resp->get_rt_list()); 319 : 320 0 : data.set_vrf_id(r->get_rtr_vrf_id()); 321 0 : data.set_family(rst->FamilyToString(r->get_rtr_family())); 322 0 : if(r->get_h_op() == sandesh_op::GET) { 323 0 : boost::system::error_code ec; 324 0 : IpAddress addr(IpAddress::from_string(PrefixToString(r->get_rtr_prefix()), ec)); 325 0 : if (addr.is_v4()) { 326 0 : data.set_prefix((Address::GetIp4SubnetAddress(addr.to_v4(), r->get_rtr_prefix_len())).to_string()); 327 0 : } else if(addr.is_v6()) { 328 0 : data.set_prefix((Address::GetIp6SubnetAddress(addr.to_v6(), r->get_rtr_prefix_len())).to_string()); 329 : } 330 : } else { 331 0 : data.set_prefix(PrefixToString(r->get_rtr_prefix())); 332 : } 333 0 : data.set_prefix_len(r->get_rtr_prefix_len()); 334 0 : data.set_rid(r->get_rtr_rid()); 335 0 : data.set_label_flags(rst->LabelFlagsToString( 336 0 : r->get_rtr_label_flags())); 337 0 : if(r->get_rtr_label_flags() & VR_RT_LABEL_VALID_FLAG) { 338 0 : data.set_label(r->get_rtr_label()); 339 : } else { 340 0 : data.set_label(0); 341 : } 342 0 : data.set_nh_id(r->get_rtr_nh_id()); 343 0 : if(r->get_rtr_family() == AF_BRIDGE) { 344 0 : data.set_rtr_mac(MacToString(r->get_rtr_mac())); 345 0 : data.set_index(r->get_rtr_index()); 346 : } 347 : 348 0 : list.push_back(data); 349 : 350 0 : RouteContext *rctx = rst->more_context().empty() ? 351 0 : NULL : boost::any_cast<RouteContext *>(rst->more_context()); 352 0 : if (!rctx) { 353 0 : rctx = new RouteContext; 354 : } 355 0 : rctx->vrf_id = r->get_rtr_vrf_id(); 356 0 : if (r->get_rtr_family() == AF_BRIDGE) { 357 0 : rctx->marker = r->get_rtr_mac(); 358 : } else { 359 0 : rctx->marker = r->get_rtr_prefix(); 360 0 : rctx->marker_plen = r->get_rtr_prefix_len(); 361 : } 362 0 : UpdateContext(rctx); 363 0 : } 364 : 365 0 : void KState::MplsMsgHandler(vr_mpls_req *r) { 366 : 367 0 : KMplsInfo data; 368 : MplsKState *mst; 369 : 370 0 : mst = static_cast<MplsKState *>(this); 371 0 : KMplsResp *resp = static_cast<KMplsResp *>(mst->response_object()); 372 : 373 : vector<KMplsInfo> &list = 374 0 : const_cast<std::vector<KMplsInfo>&>(resp->get_mpls_list()); 375 0 : data.set_label(r->get_mr_label()); 376 0 : data.set_rid(r->get_mr_rid()); 377 0 : data.set_nhid(r->get_mr_nhid()); 378 : 379 0 : list.push_back(data); 380 : 381 0 : int32_t label = r->get_mr_label(); 382 0 : UpdateContext(label); 383 0 : } 384 : 385 0 : void KState::MirrorMsgHandler(vr_mirror_req *r) { 386 0 : KMirrorInfo data; 387 : MirrorKState *mst; 388 : 389 0 : mst = static_cast<MirrorKState *>(this); 390 0 : KMirrorResp *resp = static_cast<KMirrorResp *>(mst->response_object()); 391 : 392 : vector<KMirrorInfo> &list = 393 0 : const_cast<std::vector<KMirrorInfo>&>(resp->get_mirror_list()); 394 : 395 0 : data.set_mirr_index(r->get_mirr_index()); 396 0 : data.set_mirr_rid(r->get_mirr_rid()); 397 0 : data.set_mirr_nhid(r->get_mirr_nhid()); 398 0 : data.set_mirr_flags(mst->FlagsToString(r->get_mirr_flags())); 399 0 : data.set_mirr_users(r->get_mirr_users()); 400 0 : data.set_mirr_vni(r->get_mirr_vni()); 401 : 402 0 : list.push_back(data); 403 : 404 0 : int32_t mirror_id = r->get_mirr_index(); 405 0 : UpdateContext(mirror_id); 406 0 : } 407 : 408 0 : void KState::VrfAssignMsgHandler(vr_vrf_assign_req *r) { 409 0 : KVrfAssignInfo data; 410 : VrfAssignKState *state; 411 : 412 0 : state = static_cast<VrfAssignKState *>(this); 413 : KVrfAssignResp *resp = 414 0 : static_cast<KVrfAssignResp *>(state->response_object()); 415 : 416 : vector<KVrfAssignInfo> &list = 417 0 : const_cast<std::vector<KVrfAssignInfo>&>(resp->get_vrf_assign_list()); 418 0 : data.set_vif_index(r->get_var_vif_index()); 419 0 : data.set_vlan_id(r->get_var_vlan_id()); 420 0 : data.set_vif_vrf(r->get_var_vif_vrf()); 421 0 : data.set_rid(r->get_var_rid()); 422 0 : data.set_nh_id(r->get_var_nh_id()); 423 0 : list.push_back(data); 424 : 425 : // Update the last interface and tag seen. 426 : // Will be used to send next request to kernel 427 0 : VrfAssignContext *ctx = state->more_context().empty() ? 428 0 : NULL : boost::any_cast<VrfAssignContext *>(state->more_context()); 429 0 : if (!ctx) { 430 0 : ctx = new VrfAssignContext; 431 : } 432 0 : ctx->vif_index_ = r->get_var_vif_index(); 433 0 : ctx->marker_ = r->get_var_vlan_id(); 434 0 : UpdateContext(ctx); 435 0 : } 436 : 437 0 : void KState::VrfMsgHandler(vr_vrf_req *r) { 438 0 : KVrfInfo data; 439 : VrfKState *state; 440 : 441 0 : state = static_cast<VrfKState *>(this); 442 : KVrfResp *resp = 443 0 : static_cast<KVrfResp *>(state->response_object()); 444 : 445 : vector<KVrfInfo> &list = 446 0 : const_cast<std::vector<KVrfInfo>&>(resp->get_vrf_list()); 447 0 : data.set_vrf_idx(r->get_vrf_idx()); 448 0 : data.set_hbf_rintf(r->get_vrf_hbfr_vif_idx()); 449 0 : data.set_hbf_lintf(r->get_vrf_hbfl_vif_idx()); 450 0 : list.push_back(data); 451 : 452 : // Update the last interface and tag seen. 453 : // Will be used to send next request to kernel 454 0 : VrfContext *ctx = state->more_context().empty() ? 455 0 : NULL : boost::any_cast<VrfContext *>(state->more_context()); 456 0 : if (!ctx) { 457 0 : ctx = new VrfContext; 458 : } 459 0 : ctx->vrf_idx_ = r->get_vrf_idx(); 460 0 : ctx->marker_ = r->get_vrf_idx(); 461 0 : UpdateContext(ctx); 462 0 : } 463 : 464 0 : void KState::VrfStatsMsgHandler(vr_vrf_stats_req *r) { 465 0 : KVrfStatsInfo data; 466 : VrfStatsKState *state; 467 : 468 0 : state = static_cast<VrfStatsKState *>(this); 469 : KVrfStatsResp *resp = 470 0 : static_cast<KVrfStatsResp *>(state->response_object()); 471 : 472 : vector<KVrfStatsInfo> &list = 473 0 : const_cast<std::vector<KVrfStatsInfo>&>(resp->get_vrf_stats_list()); 474 0 : data.set_vrf_id(r->get_vsr_vrf()); 475 0 : data.set_vrf_family(state->FamilyToString(r->get_vsr_family())); 476 0 : data.set_vrf_rid(r->get_vsr_rid()); 477 0 : data.set_vrf_discards(r->get_vsr_discards()); 478 0 : data.set_vrf_resolves(r->get_vsr_resolves()); 479 0 : data.set_vrf_receives(r->get_vsr_receives()); 480 0 : data.set_vrf_udp_tunnels(r->get_vsr_udp_tunnels()); 481 0 : data.set_vrf_udp_mpls_tunnels(r->get_vsr_udp_mpls_tunnels()); 482 0 : data.set_vrf_gre_mpls_tunnels(r->get_vsr_gre_mpls_tunnels()); 483 0 : data.set_vrf_l2_mcast_composites(r->get_vsr_l2_mcast_composites()); 484 0 : data.set_vrf_fabric_composites(r->get_vsr_fabric_composites()); 485 0 : data.set_vrf_ecmp_composites(r->get_vsr_ecmp_composites()); 486 0 : data.set_vrf_encaps(r->get_vsr_encaps()); 487 0 : data.set_vrf_l2_encaps(r->get_vsr_l2_encaps()); 488 0 : data.set_vrf_vxlan_tunnels(r->get_vsr_vxlan_tunnels()); 489 0 : data.set_vrf_gros(r->get_vsr_gros()); 490 0 : data.set_vrf_diags(r->get_vsr_diags()); 491 0 : data.set_vrf_encap_composites(r->get_vsr_encap_composites()); 492 0 : data.set_vrf_evpn_composites(r->get_vsr_evpn_composites()); 493 0 : data.set_vrf_translates(r->get_vsr_vrf_translates()); 494 0 : data.set_vrf_arp_virtual_proxy(r->get_vsr_arp_virtual_proxy()); 495 0 : data.set_vrf_arp_virtual_stitch(r->get_vsr_arp_virtual_stitch()); 496 0 : data.set_vrf_arp_virtual_flood(r->get_vsr_arp_virtual_flood()); 497 0 : data.set_vrf_arp_physical_stitch(r->get_vsr_arp_physical_stitch()); 498 0 : data.set_vrf_arp_tor_proxy(r->get_vsr_arp_tor_proxy()); 499 0 : data.set_vrf_arp_physical_flood(r->get_vsr_arp_physical_flood()); 500 0 : data.set_vrf_l2_receives(r->get_vsr_l2_receives()); 501 0 : data.set_vrf_uuc_floods(r->get_vsr_uuc_floods()); 502 0 : list.push_back(data); 503 : 504 0 : UpdateContext(r->get_vsr_vrf()); 505 0 : } 506 : 507 0 : void KState::VxLanMsgHandler(vr_vxlan_req *r) { 508 : 509 0 : KVxLanInfo data; 510 : VxLanKState *mst; 511 : 512 0 : mst = static_cast<VxLanKState *>(this); 513 0 : KVxLanResp *resp = static_cast<KVxLanResp *>(mst->response_object()); 514 : 515 : vector<KVxLanInfo> &list = 516 0 : const_cast<std::vector<KVxLanInfo>&>(resp->get_vxlan_list()); 517 0 : data.set_vxlanid(r->get_vxlanr_vnid()); 518 0 : data.set_rid(r->get_vxlanr_rid()); 519 0 : data.set_nhid(r->get_vxlanr_nhid()); 520 : 521 0 : list.push_back(data); 522 : 523 0 : int32_t label = r->get_vxlanr_vnid(); 524 0 : UpdateContext(label); 525 0 : } 526 : 527 0 : void KState::DropStatsMsgHandler(vr_drop_stats_req *req) { 528 : DropStatsKState *state; 529 : 530 0 : state = static_cast<DropStatsKState *>(this); 531 : KDropStatsResp *resp = 532 0 : static_cast<KDropStatsResp *>(state->response_object()); 533 0 : resp->set_ds_rid(req->get_vds_rid()); 534 0 : resp->set_ds_discard(req->get_vds_discard()); 535 0 : resp->set_ds_pull(req->get_vds_pull()); 536 0 : resp->set_ds_invalid_if(req->get_vds_invalid_if()); 537 0 : resp->set_ds_invalid_arp(req->get_vds_invalid_arp()); 538 0 : resp->set_ds_trap_no_if(req->get_vds_trap_no_if()); 539 0 : resp->set_ds_nowhere_to_go(req->get_vds_nowhere_to_go()); 540 0 : resp->set_ds_flow_queue_limit_exceeded(req->get_vds_flow_queue_limit_exceeded()); 541 0 : resp->set_ds_flow_no_memory(req->get_vds_flow_no_memory()); 542 0 : resp->set_ds_flow_invalid_protocol(req->get_vds_flow_invalid_protocol()); 543 0 : resp->set_ds_flow_nat_no_rflow(req->get_vds_flow_nat_no_rflow()); 544 0 : resp->set_ds_flow_action_drop(req->get_vds_flow_action_drop()); 545 0 : resp->set_ds_flow_action_invalid(req->get_vds_flow_action_invalid()); 546 0 : resp->set_ds_flow_unusable(req->get_vds_flow_unusable()); 547 0 : resp->set_ds_flow_table_full(req->get_vds_flow_table_full()); 548 0 : resp->set_ds_interface_tx_discard(req->get_vds_interface_tx_discard()); 549 0 : resp->set_ds_interface_drop(req->get_vds_interface_drop()); 550 0 : resp->set_ds_duplicated(req->get_vds_duplicated()); 551 0 : resp->set_ds_push(req->get_vds_push()); 552 0 : resp->set_ds_ttl_exceeded(req->get_vds_ttl_exceeded()); 553 0 : resp->set_ds_invalid_nh(req->get_vds_invalid_nh()); 554 0 : resp->set_ds_invalid_label(req->get_vds_invalid_label()); 555 0 : resp->set_ds_invalid_protocol(req->get_vds_invalid_protocol()); 556 0 : resp->set_ds_interface_rx_discard(req->get_vds_interface_rx_discard()); 557 0 : resp->set_ds_invalid_mcast_source(req->get_vds_invalid_mcast_source()); 558 0 : resp->set_ds_head_alloc_fail(req->get_vds_head_alloc_fail()); 559 0 : resp->set_ds_pcow_fail(req->get_vds_pcow_fail()); 560 0 : resp->set_ds_mcast_clone_fail(req->get_vds_mcast_clone_fail()); 561 0 : resp->set_ds_rewrite_fail(req->get_vds_rewrite_fail()); 562 0 : resp->set_ds_misc(req->get_vds_misc()); 563 0 : resp->set_ds_invalid_packet(req->get_vds_invalid_packet()); 564 0 : resp->set_ds_cksum_err(req->get_vds_cksum_err()); 565 0 : resp->set_ds_no_fmd(req->get_vds_no_fmd()); 566 0 : resp->set_ds_cloned_original(req->get_vds_cloned_original()); 567 0 : resp->set_ds_invalid_vnid(req->get_vds_invalid_vnid()); 568 0 : resp->set_ds_frag_err(req->get_vds_frag_err()); 569 0 : resp->set_ds_invalid_source(req->get_vds_invalid_source()); 570 0 : resp->set_ds_mcast_df_bit(req->get_vds_mcast_df_bit()); 571 0 : resp->set_ds_l2_no_route(req->get_vds_l2_no_route()); 572 0 : resp->set_ds_vlan_fwd_tx(req->get_vds_vlan_fwd_tx()); 573 0 : resp->set_ds_vlan_fwd_enq(req->get_vds_vlan_fwd_enq()); 574 0 : resp->set_ds_no_memory(req->get_vds_no_memory()); 575 0 : resp->set_ds_drop_new_flow(req->get_vds_drop_new_flow()); 576 0 : resp->set_ds_flow_evict(req->get_vds_flow_evict()); 577 0 : } 578 : 579 0 : void KState::ForwardingClassMsgHandler(vr_fc_map_req *r) { 580 0 : KForwardingClass data; 581 : ForwardingClassKState *mst; 582 : 583 0 : mst = static_cast<ForwardingClassKState *>(this); 584 : KForwardingClassResp *resp = 585 0 : static_cast<KForwardingClassResp *>(mst->response_object()); 586 : 587 : vector<KForwardingClass> &list = 588 : const_cast<std::vector<KForwardingClass>&>( 589 0 : resp->get_forwarding_class_list()); 590 : 591 0 : data.set_id(r->get_fmr_id()[0]); 592 0 : data.set_rid(r->get_fmr_rid()); 593 0 : data.set_dscp(r->get_fmr_dscp()[0]); 594 0 : data.set_mpls_exp(r->get_fmr_mpls_qos()[0]); 595 0 : data.set_vlan_priority(r->get_fmr_dotonep()[0]); 596 0 : data.set_qos_queue(r->get_fmr_queue_id()[0]); 597 0 : list.push_back(data); 598 : 599 0 : int16_t index = r->get_fmr_id()[0]; 600 0 : UpdateContext(index); 601 0 : } 602 : 603 0 : void KState::QosConfigMsgHandler(vr_qos_map_req *r) { 604 0 : KQosConfig data; 605 : QosConfigKState *mst; 606 : 607 0 : mst = static_cast<QosConfigKState *>(this); 608 0 : KQosConfigResp *resp = static_cast<KQosConfigResp *>(mst->response_object()); 609 : 610 : vector<KQosConfig> &list = 611 0 : const_cast<std::vector<KQosConfig>&>(resp->get_qos_config_list()); 612 0 : data.set_id(r->get_qmr_id()); 613 0 : data.set_rid(r->get_qmr_rid()); 614 : 615 : std::vector<int8_t>::const_iterator qos_it = 616 0 : r->get_qmr_dscp().begin(); 617 : std::vector<int8_t>::const_iterator fc_it = 618 0 : r->get_qmr_dscp_fc_id().begin(); 619 0 : std::vector<kQosIdFowardingClassPair> dscp_list; 620 0 : for(;qos_it != r->get_qmr_dscp().end() && 621 0 : fc_it != r->get_qmr_dscp_fc_id().end(); 622 0 : qos_it++, fc_it++) { 623 0 : kQosIdFowardingClassPair pair; 624 0 : pair.set_qos(*qos_it); 625 0 : pair.set_fc_id(*fc_it); 626 0 : dscp_list.push_back(pair); 627 0 : } 628 0 : data.set_dscp_map(dscp_list); 629 : 630 0 : qos_it = r->get_qmr_mpls_qos().begin(); 631 0 : fc_it = r->get_qmr_mpls_qos_fc_id().begin(); 632 0 : std::vector<kQosIdFowardingClassPair> mpls_list; 633 0 : for(;qos_it != r->get_qmr_mpls_qos().end() && 634 0 : fc_it != r->get_qmr_mpls_qos_fc_id().end(); qos_it++, fc_it++) { 635 0 : kQosIdFowardingClassPair pair; 636 0 : pair.set_qos(*qos_it); 637 0 : pair.set_fc_id(*fc_it); 638 0 : mpls_list.push_back(pair); 639 0 : } 640 0 : data.set_mpls_exp_map(mpls_list); 641 : 642 0 : qos_it = r->get_qmr_dotonep().begin(); 643 0 : fc_it = r->get_qmr_dotonep_fc_id().begin(); 644 0 : std::vector<kQosIdFowardingClassPair> vlan_priority_list; 645 0 : for(;qos_it != r->get_qmr_dotonep().end() && 646 0 : fc_it != r->get_qmr_dotonep_fc_id().end(); 647 0 : qos_it++, fc_it++) { 648 0 : kQosIdFowardingClassPair pair; 649 0 : pair.set_qos(*qos_it); 650 0 : pair.set_fc_id(*fc_it); 651 0 : vlan_priority_list.push_back(pair); 652 0 : } 653 0 : data.set_vlan_priority_map(vlan_priority_list); 654 0 : list.push_back(data); 655 : 656 0 : uint16_t id = r->get_qmr_id(); 657 0 : UpdateContext(id); 658 0 : }