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