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