OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
services_sandesh.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include "base/os.h"
6 #include <netinet/icmp6.h>
7 #include <boost/assign/list_of.hpp>
8 #include <pkt/pkt_handler.h>
9 #include <oper/mirror_table.h>
10 #include <oper/vn.h>
11 #include <pkt/pkt_init.h>
12 #include <services/services_init.h>
13 #include <services/dhcp_proto.h>
14 #include <services/dhcpv6_proto.h>
15 #include <services/arp_proto.h>
16 #include <services/bfd_proto.h>
17 #include <services/dns_proto.h>
18 #include <services/icmp_proto.h>
19 #include <services/igmp_proto.h>
20 #include <services/icmpv6_proto.h>
22 #include <services/services_types.h>
24 #include <bind/bind_resolver.h>
25 #include <vr_defs.h>
26 
27 #define SET_ICMPV6_INTERFACE_STATS(it, list) \
28  InterfaceIcmpv6Stats entry; \
29  VmInterface *vmi = it->first; \
30  const Icmpv6Proto::Icmpv6Stats &stats = it->second; \
31  entry.set_interface_index(vmi->id()); \
32  entry.set_icmpv6_router_solicit(stats.icmpv6_router_solicit_); \
33  entry.set_icmpv6_router_advert(stats.icmpv6_router_advert_); \
34  entry.set_icmpv6_ping_request(stats.icmpv6_ping_request_); \
35  entry.set_icmpv6_ping_response(stats.icmpv6_ping_response_); \
36  entry.set_icmpv6_neighbor_solicit(stats.icmpv6_neighbor_solicit_); \
37  entry.set_icmpv6_neighbor_solicited(stats.icmpv6_neighbor_solicited_); \
38  entry.set_icmpv6_neighbor_advert_solicited \
39  (stats.icmpv6_neighbor_advert_solicited_); \
40  entry.set_icmpv6_neighbor_advert_unsolicited \
41  (stats.icmpv6_neighbor_advert_unsolicited_); \
42  list.push_back(entry);
43 
44 std::map<uint16_t, std::string> g_ip_protocol_map =
45  boost::assign::map_list_of<uint16_t, std::string>
46  (1, "icmp")
47  (2, "igmp")
48  (4, "ipv4")
49  (6, "tcp")
50  (17, "udp")
51  (41, "ipv6")
52  (47, "gre");
53 
54 std::map<uint32_t, std::string> g_dhcp_msg_types =
55  boost::assign::map_list_of<uint32_t, std::string>
56  (DHCP_UNKNOWN, "Unknown")
57  (DHCP_DISCOVER, "Discover")
58  (DHCP_OFFER, "Offer")
59  (DHCP_REQUEST, "Request")
60  (DHCP_ACK, "Ack")
61  (DHCP_NAK, "Nack")
62  (DHCP_INFORM, "Inform")
63  (DHCP_DECLINE, "Decline")
64  (DHCP_RELEASE, "Release")
65  (DHCP_LEASE_QUERY, "Lease Query")
66  (DHCP_LEASE_UNASSIGNED, "Lease Unassigned")
67  (DHCP_LEASE_UNKNOWN, "Lease Unknown")
68  (DHCP_LEASE_ACTIVE, "Lease Active");
69 
70 std::map<uint32_t, std::string> g_dhcpv6_msg_types =
71  boost::assign::map_list_of<uint32_t, std::string>
72  (DHCPV6_UNKNOWN, "Unknown")
73  (DHCPV6_SOLICIT, "Solicit")
74  (DHCPV6_ADVERTISE, "Advertise")
75  (DHCPV6_REQUEST, "Request")
76  (DHCPV6_CONFIRM, "Confirm")
77  (DHCPV6_RENEW, "Renew")
78  (DHCPV6_REBIND, "Rebind")
79  (DHCPV6_REPLY, "Reply")
80  (DHCPV6_RELEASE, "Release")
81  (DHCPV6_DECLINE, "Decline")
82  (DHCPV6_RECONFIGURE, "Reconfigure")
83  (DHCPV6_INFORMATION_REQUEST, "Information Request");
84 
85 void ServicesSandesh::MacToString(const unsigned char *mac, std::string &mac_str) {
86  char mstr[32];
87  snprintf(mstr, 32, "%02x:%02x:%02x:%02x:%02x:%02x",
88  mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
89  mac_str.assign(mstr);
90 }
91 
92 std::string ServicesSandesh::IntToString(uint32_t val) {
93  std::ostringstream str;
94  str << val;
95  return str.str();
96 }
97 
98 std::string ServicesSandesh::IntToHexString(uint32_t val) {
99  std::ostringstream str;
100  str << "0x" << std::hex << val;
101  return str.str();
102 }
103 
104 void ServicesSandesh::PktToHexString(uint8_t *pkt, int32_t len,
105  std::string &msg) {
106  for (int32_t i = 0; i < len; i++) {
107  char val[4];
108  snprintf(val, 4, "%02x ", pkt[i]);
109  msg.append(val);
110  }
111 }
112 
113 std::string ServicesSandesh::IpProtocol(uint16_t prot) {
114  std::map<uint16_t, std::string>::iterator it = g_ip_protocol_map.find(prot);
115  if (it == g_ip_protocol_map.end()) {
116  return IntToString(prot);
117  }
118  return it->second;
119 }
120 
121 std::string &ServicesSandesh::DhcpMsgType(uint32_t msg_type) {
122  std::map<uint32_t, std::string>::iterator it = g_dhcp_msg_types.find(msg_type);
123  if (it == g_dhcp_msg_types.end())
124  return DhcpMsgType(DHCP_UNKNOWN);
125  return it->second;
126 }
127 
128 std::string &ServicesSandesh::Dhcpv6MsgType(uint32_t msg_type) {
129  std::map<uint32_t, std::string>::iterator it = g_dhcpv6_msg_types.find(msg_type);
130  if (it == g_dhcpv6_msg_types.end())
132  return it->second;
133 }
134 
135 void ServicesSandesh::PktStatsSandesh(std::string ctxt, bool more) {
136  PktStats *resp = new PktStats();
138  uint32_t total_rcvd = 0;
139  uint32_t total_sent = 0;
140  for (int i = 0; i < PktHandler::MAX_MODULES; ++i) {
141  total_rcvd += stats.received[i];
142  total_sent += stats.sent[i];
143  }
144  resp->set_total_rcvd(total_rcvd);
145  resp->set_dhcp_rcvd(stats.received[PktHandler::DHCP]);
146  resp->set_arp_rcvd(stats.received[PktHandler::ARP]);
147  resp->set_dns_rcvd(stats.received[PktHandler::DNS]);
148  resp->set_icmp_rcvd(stats.received[PktHandler::ICMP]);
149  resp->set_flow_rcvd(stats.received[PktHandler::FLOW]);
150  resp->set_mac_learning_msg_rcvd(stats.received[PktHandler::MAC_LEARNING]);
151  resp->set_dropped(stats.dropped);
152  resp->set_total_sent(total_sent);
153  resp->set_dhcp_sent(stats.sent[PktHandler::DHCP]);
154  resp->set_arp_sent(stats.sent[PktHandler::ARP]);
155  resp->set_dns_sent(stats.sent[PktHandler::DNS]);
156  resp->set_icmp_sent(stats.sent[PktHandler::ICMP]);
157  resp->set_dhcp_q_threshold_exceeded(stats.q_threshold_exceeded[PktHandler::DHCP]);
158  resp->set_arp_q_threshold_exceeded(stats.q_threshold_exceeded[PktHandler::ARP]);
159  resp->set_dns_q_threshold_exceeded(stats.q_threshold_exceeded[PktHandler::DNS]);
160  resp->set_icmp_q_threshold_exceeded(stats.q_threshold_exceeded[PktHandler::ICMP]);
161  resp->set_flow_q_threshold_exceeded(stats.q_threshold_exceeded[PktHandler::FLOW]);
162  resp->set_context(ctxt);
163  resp->set_more(more);
164  resp->Response();
165 }
166 
167 void ServicesSandesh::DhcpStatsSandesh(std::string ctxt, bool more) {
168  DhcpStats *dhcp = new DhcpStats();
169  const DhcpProto::DhcpStats &dstats =
171  dhcp->set_dhcp_discover(dstats.discover);
172  dhcp->set_dhcp_request(dstats.request);
173  dhcp->set_dhcp_inform(dstats.inform);
174  dhcp->set_dhcp_decline(dstats.decline);
175  dhcp->set_dhcp_other(dstats.other);
176  dhcp->set_dhcp_errors(dstats.errors);
177  dhcp->set_offers_sent(dstats.offers);
178  dhcp->set_acks_sent(dstats.acks);
179  dhcp->set_nacks_sent(dstats.nacks);
180  dhcp->set_relay_request(dstats.relay_req);
181  dhcp->set_relay_response(dstats.relay_resp);
182  dhcp->set_unknown_msg_drop(dstats.unknown_msg_drop);
183  dhcp->set_dhcp_disabled_drop(dstats.dhcp_disabled_drop);
184  dhcp->set_incorrect_mac(dstats.incorrect_mac);
185  dhcp->set_context(ctxt);
186  dhcp->set_more(more);
187  dhcp->Response();
188 }
189 
190 void ServicesSandesh::Dhcpv6StatsSandesh(std::string ctxt, bool more) {
191  Dhcpv6Stats *dhcp = new Dhcpv6Stats();
192  const Dhcpv6Proto::DhcpStats &dstats =
194  dhcp->set_dhcp_solicit(dstats.solicit);
195  dhcp->set_dhcp_advertise(dstats.advertise);
196  dhcp->set_dhcp_request(dstats.request);
197  dhcp->set_dhcp_confirm(dstats.confirm);
198  dhcp->set_dhcp_renew(dstats.renew);
199  dhcp->set_dhcp_rebind(dstats.rebind);
200  dhcp->set_dhcp_reply(dstats.reply);
201  dhcp->set_dhcp_release(dstats.release);
202  dhcp->set_dhcp_decline(dstats.decline);
203  dhcp->set_dhcp_reconfigure(dstats.reconfigure);
204  dhcp->set_information_request(dstats.information_request);
205  dhcp->set_dhcp_error(dstats.error);
206  dhcp->set_context(ctxt);
207  dhcp->set_more(more);
208  dhcp->Response();
209 }
210 
211 void ServicesSandesh::ArpStatsSandesh(std::string ctxt, bool more) {
212  ArpProto *arp_proto = Agent::GetInstance()->GetArpProto();
213  ArpStats *arp = new ArpStats();
214  const ArpProto::ArpStats &astats = arp_proto->GetStats();
215  arp->set_arp_entries(arp_proto->GetArpCacheSize());
216  arp->set_arp_requests(astats.arp_req);
217  arp->set_arp_replies(astats.arp_replies);
218  arp->set_arp_gratuitous(astats.arp_gratuitous);
219  arp->set_arp_resolved(astats.resolved);
220  arp->set_arp_max_retries_exceeded(astats.max_retries_exceeded);
221  arp->set_arp_errors(astats.errors);
222  arp->set_arp_invalid_packets(astats.arp_invalid_packets);
223  arp->set_arp_invalid_interface(astats.arp_invalid_interface);
224  arp->set_arp_invalid_vrf(astats.arp_invalid_vrf);
225  arp->set_arp_invalid_address(astats.arp_invalid_address);
226  arp->set_context(ctxt);
227  arp->set_more(more);
228  arp->Response();
229 }
230 
231 void ServicesSandesh::BfdStatsSandesh(std::string ctxt, bool more) {
232  BfdProto *bfd_proto = Agent::GetInstance()->GetBfdProto();
233  BfdStats *bfd = new BfdStats();
234  const BfdProto::BfdStats &stats = bfd_proto->GetStats();
235  bfd->set_bfd_sent(stats.bfd_sent);
236  bfd->set_bfd_received(stats.bfd_received);
237  bfd->set_bfd_receive_drop_count(stats.bfd_rx_drop_count);
238  bfd->set_bfd_receive_ka_enqueue_count(stats.bfd_rx_ka_enqueue_count);
239  bfd->set_bfd_active_sessions(bfd_proto->ActiveSessions());
240 
241  std::vector<BfdSandeshSessions> &bfd_list =
242  const_cast<std::vector<BfdSandeshSessions>&>(bfd->get_bfd_sessions());
243  BFD::Server *server = bfd_proto->bfd_communicator().GetServer();
244  BFD::Sessions *sessions = server->GetSessions();
245  BFD::Sessions::iterator it = sessions->begin();
246  while (it != sessions->end()) {
247  BFD::SessionKey key = *it;
248  BfdSandeshSessions session;
249  session.local_address = key.local_address.to_string();
250  session.remote_address = key.remote_address.to_string();
251  session.index = key.index.to_string();
252  session.remote_port = key.remote_port;
253 
254  BFD::Session *bfd_session = server->SessionByKey(key);
255  std::ostringstream ss, rem_ss;
256  ss << bfd_session->local_state();
257  session.local_status = ss.str();
258  rem_ss << bfd_session->remote_state().state;
259  session.remote_status = rem_ss.str();
260 
261  session.stats.rx_count = bfd_session->Stats().rx_count;
262  session.stats.tx_count = bfd_session->Stats().tx_count;
263  session.stats.rx_error_count = bfd_session->Stats().rx_error_count;
264  session.stats.tx_error_count = bfd_session->Stats().tx_error_count;
265  session.stats.receive_timer_expired_count =
266  bfd_session->Stats().receive_timer_expired_count;
267  session.stats.send_timer_expired_count =
268  bfd_session->Stats().send_timer_expired_count;
269 
270  bfd_list.push_back(session);
271  it++;
272  }
273 
274  bfd->set_context(ctxt);
275  bfd->set_more(more);
276  bfd->Response();
277 }
278 
279 void ServicesSandesh::DnsStatsSandesh(std::string ctxt, bool more) {
280  DnsStats *dns = new DnsStats();
282  uint8_t count = 0;
283  std::vector<string> &list =
284  const_cast<std::vector<string>&>(dns->get_dns_resolver());
285 
286  std::vector<string>dns_servers;
287  uint8_t resolver_count = Agent::GetInstance()->GetDnslist().size();
288  while (count < resolver_count) {
289  boost::split(dns_servers, Agent::GetInstance()->GetDnslist()[count],
290  boost::is_any_of(":"));
291  list.push_back(dns_servers[0]);
292  count++;
293  }
294 
296  uint16_t dscp = 0;
297  if (resolv) {
298  dscp = resolv->GetDscpValue();
299  }
300  dns->set_dscp(dscp);
301 
302  dns->set_dns_requests(nstats.requests);
303  dns->set_dns_resolved(nstats.resolved);
304  dns->set_dns_retransmit_reqs(nstats.retransmit_reqs);
305  dns->set_dns_unsupported(nstats.unsupported);
306  dns->set_dns_failures(nstats.fail);
307  dns->set_dns_drops(nstats.drop);
308  dns->set_context(ctxt);
309  dns->set_more(more);
310  dns->Response();
311 }
312 
313 void ServicesSandesh::IcmpStatsSandesh(std::string ctxt, bool more) {
314  IcmpStats *icmp = new IcmpStats();
316  icmp->set_icmp_gw_ping(istats.icmp_gw_ping);
317  icmp->set_icmp_gw_ping_err(istats.icmp_gw_ping_err);
318  icmp->set_icmp_drop(istats.icmp_drop);
319  icmp->set_context(ctxt);
320  icmp->set_more(more);
321  icmp->Response();
322 }
323 
324 void ServicesSandesh::Icmpv6StatsSandesh(std::string ctxt, bool more) {
325  Icmpv6Stats *icmp = new Icmpv6Stats();
326  const Icmpv6Proto::Icmpv6Stats &istats =
328  icmp->set_icmpv6_router_solicit(istats.icmpv6_router_solicit_);
329  icmp->set_icmpv6_router_advert(istats.icmpv6_router_advert_);
330  icmp->set_icmpv6_ping_request(istats.icmpv6_ping_request_);
331  icmp->set_icmpv6_ping_response(istats.icmpv6_ping_response_);
332  icmp->set_icmpv6_drop(istats.icmpv6_drop_);
333  icmp->set_icmpv6_neighbor_solicit(istats.icmpv6_neighbor_solicit_);
334  icmp->set_icmpv6_neighbor_solicited(istats.icmpv6_neighbor_solicited_);
335  icmp->set_icmpv6_neighbor_advert_solicited
337  icmp->set_icmpv6_neighbor_advert_unsolicited
339  icmp->set_context(ctxt);
340  icmp->set_more(more);
341  icmp->Response();
342 }
343 
344 void ServicesSandesh::IgmpStatsSandesh(std::string ctxt, bool more) {
345  IgmpStatsResponse *igmp = new IgmpStatsResponse();
347  igmp->set_bad_length(istats.bad_length);
348  igmp->set_bad_cksum(istats.bad_cksum);
349  igmp->set_bad_interface(istats.bad_interface);
350  igmp->set_not_local(istats.not_local);
351  igmp->set_rx_unknown(istats.rx_unknown);
352  igmp->set_rejected_pkt(istats.rejected_pkt);
353  igmp->set_context(ctxt);
354  igmp->set_more(more);
355  igmp->Response();
356 }
357 
358 void ServicesSandesh::FillPktData(PktTrace::Pkt &pkt, PktData &resp) {
359  switch (pkt.dir) {
360  case PktTrace::In:
361  resp.direction = "in";
362  break;
363  case PktTrace::Out:
364  resp.direction = "out";
365  break;
366  default:
367  resp.direction = "error";
368  break;
369  }
370  resp.len = pkt.len;
371 }
372 
373 uint16_t ServicesSandesh::FillVrouterHdr(PktTrace::Pkt &pkt, VrouterHdr &resp) {
374  boost::array<std::string, MAX_AGENT_HDR_COMMANDS> commands =
375  { { "switch", "route", "arp", "l2-protocol", "trap-nexthop",
376  "trap-resolve", "trap-flow-miss", "trap-l3-protocol",
377  "trap-diag", "trap-ecmp-resolve", "trap_source_mismatch",
378  "trap-dont-fragment", "trap-zero-ttl", "tor-control",
379  "trap-icmp-error", "trap-flow-hold-action",
380  "trap-route-alert", "trap-mac-learn", "trap-mac-move" } };
381  uint8_t *ptr = pkt.pkt;
382  AgentHdr *hdr = reinterpret_cast<AgentHdr *>(ptr);
383  resp.ifindex = hdr->ifindex;
384  resp.vrf = hdr->vrf;
385  uint16_t cmd = hdr->cmd;
386  if (cmd < MAX_AGENT_HDR_COMMANDS)
387  resp.cmd = commands.at(cmd);
388  else
389  resp.cmd = "unknown";
390  resp.cmd_param = hdr->cmd_param;
391  resp.nh = hdr->nh;
392  return sizeof(AgentHdr);
393 }
394 
395 int ServicesSandesh::FillMacHdr(struct ether_header *eth, MacHdr &resp) {
396  int len = sizeof(struct ether_header);
397  MacToString(eth->ether_dhost, resp.dest_mac);
398  MacToString(eth->ether_shost, resp.src_mac);
399  uint16_t type = ntohs(eth->ether_type);
400  uint8_t *ptr = (uint8_t *)eth + 12;
401  while (type == ETHERTYPE_VLAN) {
402  len += 4;
403  ptr += 4;
404  type = ntohs(*(uint16_t *)ptr);
405  }
406  resp.type = (type == 0x800) ? "ip" :
407  (type == 0x806) ? "arp" : IntToString(type);
408  return len;
409 }
410 
411 static uint32_t get_val(void *data) {
412  union {
413  uint8_t data[sizeof(uint32_t)];
414  uint32_t addr;
415  } bytes;
416  memcpy(bytes.data, data, sizeof(uint32_t));
417  return ntohl(bytes.addr);
418 }
419 
420 void ServicesSandesh::FillArpHdr(ether_arp *arp, ArpHdr &resp) {
421  uint16_t val = ntohs(arp->arp_hrd);
422  resp.htype = (val == 1) ? "ethernet" : IntToString(val);
423  val = ntohs(arp->arp_pro);
424  resp.protocol = (val == 0x800) ? "ip" : IntToString(val);
425  resp.hw_size = arp->arp_hln;
426  resp.prot_size = arp->arp_pln;
427  val = ntohs(arp->arp_op);
428  resp.opcode = (val == 1) ? "request" :
429  (val == 2) ? "response" : IntToString(val);
430  MacToString(arp->arp_sha, resp.sender_mac);
431  MacToString(arp->arp_tha, resp.target_mac);
432  Ip4Address spa(get_val(arp->arp_spa));
433  Ip4Address tpa(get_val(arp->arp_tpa));
434  resp.sender_ip = spa.to_string();
435  resp.target_ip = tpa.to_string();
436 }
437 
438 void ServicesSandesh::FillIpv4Hdr(struct ip *ip, Ipv4Hdr &resp) {
439  resp.vers = ip->ip_v;
440  resp.hdrlen = ip->ip_hl;
441  resp.tos = ip->ip_tos;
442  resp.len = ntohs(ip->ip_len);
443  resp.id = IntToHexString(ntohs(ip->ip_id));
444  resp.frag = IntToHexString(ntohs(ip->ip_off));
445  resp.ttl = ip->ip_ttl;
446  resp.protocol = IpProtocol(ip->ip_p);
447  resp.csum = IntToHexString(ntohs(ip->ip_sum));
448  Ip4Address sa(ntohl(ip->ip_src.s_addr));
449  Ip4Address da(ntohl(ip->ip_dst.s_addr));
450  resp.src_ip = sa.to_string();
451  resp.dest_ip = da.to_string();
452 }
453 
454 void ServicesSandesh::FillIpv6Hdr(ip6_hdr *ip, Ipv6Hdr &resp) {
455  resp.flow = ntohl(ip->ip6_flow);
456  resp.plen = ntohs(ip->ip6_plen);
457  resp.next_hdr = ip->ip6_nxt;
458  resp.hlim = ip->ip6_hlim;
459 
460  boost::system::error_code ec;
461  boost::asio::ip::address_v6::bytes_type src_addr;
462  memcpy(&src_addr[0], ip->ip6_src.s6_addr, 16);
463  boost::asio::ip::address_v6 src(src_addr);
464  resp.src_ip = src.to_string(ec);
465 
466  boost::asio::ip::address_v6::bytes_type dest_addr;
467  memcpy(&dest_addr[0], ip->ip6_dst.s6_addr, 16);
468  boost::asio::ip::address_v6 dest(dest_addr);
469  resp.dest_ip = dest.to_string(ec);
470 }
471 
472 void ServicesSandesh::FillIcmpv4Hdr(struct icmp *icmp, Icmpv4Hdr &resp) {
473  resp.type = (icmp->icmp_type == ICMP_ECHO) ? "echo request":
474  (icmp->icmp_type == ICMP_ECHOREPLY) ? "echo reply" :
475  IntToString(icmp->icmp_type);
476  resp.code = icmp->icmp_code;
477  resp.csum = IntToHexString(ntohs(icmp->icmp_cksum));
478 }
479 
480 void ServicesSandesh::FillIcmpv6Hdr(icmp6_hdr *icmp, Icmpv6Hdr &resp,
481  int32_t len) {
482  switch (icmp->icmp6_type) {
483  case ICMP6_ECHO_REQUEST:
484  resp.type = "echo request";
485  break;
486 
487  case ICMP6_ECHO_REPLY:
488  resp.type = "echo reply";
489  break;
490 
491  case ND_ROUTER_SOLICIT:
492  resp.type = "router solicit";
493  break;
494 
495  case ND_ROUTER_ADVERT:
496  resp.type = "router advertisement";
497  break;
498 
499  default:
500  resp.type = IntToString(icmp->icmp6_type);
501  break;
502  }
503  resp.code = icmp->icmp6_code;
504  resp.csum = IntToHexString(ntohs(icmp->icmp6_cksum));
505  PktToHexString((uint8_t *)icmp->icmp6_data8, len - 4, resp.rest);
506 }
507 
508 void ServicesSandesh::FillUdpHdr(udphdr *udp, UdpHdr &resp) {
509  resp.src_port = ntohs(udp->uh_sport);
510  resp.dest_port = ntohs(udp->uh_dport);
511  resp.length = ntohs(udp->uh_ulen);
512  resp.csum = IntToHexString(ntohs(udp->uh_sum));
513 }
514 
515 std::string
516 ServicesSandesh::FillOptionString(char *data, int32_t len, std::string msg) {
517  std::string str;
518  if (len > 0)
519  str.assign(data, len);
520  return (msg + str + "; ");
521 }
522 
523 std::string
524 ServicesSandesh::FillOptionInteger(uint32_t data, std::string msg) {
525  std::stringstream str;
526  str << msg << data << "; ";
527  return str.str();
528 }
529 
530 std::string
531 ServicesSandesh::FillOptionIp(uint32_t data, std::string msg) {
532  Ip4Address addr(data);
533  return msg + addr.to_string() + "; ";
534 }
535 
536 void
537 ServicesSandesh::FillHostRoutes(uint8_t *data, int len,
538  std::string &resp) {
539  std::stringstream routes;
540  int parsed = 0;
541  uint8_t *ptr = data;
542  while (parsed < len) {
543  uint32_t addr = 0;
544  int plen = *ptr++;
545  parsed++;
546  int j;
547  for (j = 0; plen && j <= (plen - 1) / 8; ++j) {
548  addr = (addr << 8) | *ptr++;
549  parsed++;
550  }
551  addr = addr << (4 - j) * 8;
552  Ip4Address prefix(addr);
553  Ip4Address route(get_val(ptr));
554  routes << prefix.to_string() << "/" << plen << " -> "
555  << route.to_string() << ";";
556  ptr += 4;
557  parsed += 4;
558  }
559  resp += routes.str();
560 }
561 
563  std::string &other, int32_t len) {
564  while (opt->code != DHCP_OPTION_END && len > 0) {
565  switch (opt->code) {
566  case DHCP_OPTION_PAD:
567  len -= 1;
568  opt = (Dhcpv4Options *)((uint8_t *)opt + 1);
569  continue;
570 
572  if (len >= (2 + opt->len))
573  resp += DhcpMsgType(*(uint8_t *)opt->data) + "; ";
574  break;
575 
577  if (len >= (2 + opt->len)) {
578  Ip4Address addr(get_val(opt->data));
579  resp += "Requested IP : " + addr.to_string() + "; ";
580  }
581  break;
582  }
583 
585  if (len >= (2 + opt->len))
586  resp += FillOptionString((char *)opt->data, opt->len,
587  "Host Name : ");
588  break;
589 
591  if (len >= (2 + opt->len))
592  resp += FillOptionString((char *)opt->data, opt->len,
593  "Domain Name : ");
594  break;
595 
596  case DHCP_OPTION_MESSAGE:
597  if (len >= (2 + opt->len))
598  resp += FillOptionString((char *)opt->data, opt->len,
599  "Msg : ");
600  break;
601 
603  if (len >= (2 + opt->len))
604  resp += FillOptionInteger(get_val(opt->data), "Lease time : ");
605  break;
606 
608  if (len >= (2 + opt->len))
609  resp += FillOptionIp(get_val(opt->data), "Subnet mask : ");
610  break;
611 
613  if (len >= (2 + opt->len))
614  resp += FillOptionIp(get_val(opt->data), "Broadcast : ");
615  break;
616 
617  case DHCP_OPTION_ROUTER:
618  if (len >= (2 + opt->len)) {
619  int16_t optlen = 0;
620  while (optlen < opt->len) {
621  resp += FillOptionIp(get_val(opt->data + optlen),
622  "Gateway : ");
623  optlen += 4;
624  }
625  }
626  break;
627 
628  case DHCP_OPTION_DNS:
629  if (len >= (2 + opt->len))
630  resp += FillOptionIp(get_val(opt->data), "DNS : ");
631  break;
632 
634  if (len >= (2 + opt->len))
635  resp += FillOptionIp(get_val(opt->data), "Time Server : ");
636  break;
637 
639  if (len >= (2 + opt->len))
640  resp += FillOptionIp(get_val(opt->data), "Server : ");
641  break;
642 
644  if (len >= (2 + opt->len)) {
645  resp += "Host Routes : ";
646  FillHostRoutes(opt->data, opt->len, resp);
647  }
648  break;
649 
650  default:
651  PktToHexString((uint8_t *)opt, opt->len + 2, other);
652  break;
653  }
654  len -= (2 + opt->len);
655  opt = (Dhcpv4Options *)((uint8_t *)opt + 2 + opt->len);
656  }
657 }
658 
659 void ServicesSandesh::FillDhcpv4Hdr(dhcphdr *dhcp, Dhcpv4Hdr &resp,
660  int32_t len) {
661  resp.op = (dhcp->op == 1) ? "request" : "reply";
662  resp.htype = (dhcp->htype == 1) ? "ethernet" : IntToString(dhcp->htype);
663  resp.hlen = dhcp->hlen;
664  resp.hops = dhcp->hops;
665  resp.xid = IntToHexString(dhcp->xid);
666  resp.secs = ntohs(dhcp->secs);
667  resp.flags =
668  (ntohs(dhcp->flags) & DHCP_BCAST_FLAG) ? "broadcast" : "unicast";
669  Ip4Address ciaddr(ntohl(dhcp->ciaddr));
670  Ip4Address yiaddr(ntohl(dhcp->yiaddr));
671  Ip4Address siaddr(ntohl(dhcp->siaddr));
672  Ip4Address giaddr(ntohl(dhcp->giaddr));
673  resp.ciaddr = ciaddr.to_string();
674  resp.yiaddr = yiaddr.to_string();
675  resp.siaddr = siaddr.to_string();
676  resp.giaddr = giaddr.to_string();
677  PktToHexString(dhcp->chaddr, DHCP_CHADDR_LEN, resp.chaddr);
678  PktToHexString(dhcp->sname, DHCP_NAME_LEN, resp.sname);
679  PktToHexString(dhcp->file, DHCP_FILE_LEN, resp.file);
680  PktToHexString(dhcp->options, 4, resp.cookie);
681  len -= (DHCP_FIXED_LEN + 4);
682  FillDhcpv4Options((Dhcpv4Options *)(dhcp->options + 4),
683  resp.dhcp_options, resp.other_options, len);
684 }
685 
686 void ServicesSandesh::FillDhcpv6Hdr(Dhcpv6Hdr *dhcp, Dhcpv6Header &resp,
687  int32_t len) {
688  resp.type = Dhcpv6MsgType(dhcp->type);
689  PktToHexString(dhcp->xid, 3, resp.xid);
690  PktToHexString((uint8_t *)dhcp + DHCPV6_FIXED_LEN, len - 4, resp.options);
691 }
692 
693 void ServicesSandesh::FillDnsHdr(dnshdr *dns, DnsHdr &resp, int32_t dnslen) {
694  if (dnslen < (int32_t)sizeof(dnshdr))
695  return;
696 
697  resp.xid = ntohs(dns->xid);
698  if (dns->flags.rd)
699  resp.flags += "recursion desired; ";
700  if (dns->flags.trunc)
701  resp.flags += "truncated; ";
702  if (dns->flags.auth)
703  resp.flags += "authoritative answer; ";
704  resp.flags += (!dns->flags.op) ? "query; " :
705  ((dns->flags.op == DNS_OPCODE_UPDATE)? "update; " :
706  "other op; ");
707  if (dns->flags.req) {
708  resp.flags += "response; ";
709  if (dns->flags.ret)
710  resp.flags += "failure response : " +
711  IntToString(dns->flags.ret) + "; ";
712  else
713  resp.flags += "success response; ";
714  } else {
715  resp.flags += "request; ";
716  }
717  if (dns->flags.cd)
718  resp.flags += "checking disabled; ";
719  if (dns->flags.ad)
720  resp.flags += "answer authenticated; ";
721  if (dns->flags.ra)
722  resp.flags += "recursion available; ";
723  resp.ques = ntohs(dns->ques_rrcount);
724  resp.ans = ntohs(dns->ans_rrcount);
725  resp.auth = ntohs(dns->auth_rrcount);
726  resp.add = ntohs(dns->add_rrcount);
727  dnslen -= sizeof(dnshdr);
728  ServicesSandesh::PktToHexString((uint8_t *)(dns + 1), dnslen, resp.rest);
729 }
730 
731 void ServicesSandesh::ArpPktTrace(PktTrace::Pkt &pkt, ArpPktSandesh *resp) {
732  ArpPkt data;
733  FillPktData(pkt, data.info);
734  uint16_t hdr_len = FillVrouterHdr(pkt, data.agent_hdr);
735  uint8_t *ptr = pkt.pkt + hdr_len;
736  ptr += FillMacHdr((struct ether_header *)ptr, data.mac_hdr);
737  FillArpHdr((ether_arp *)ptr, data.arp_hdr);
738  std::vector<ArpPkt> &list =
739  const_cast<std::vector<ArpPkt>&>(resp->get_pkt_list());
740  list.push_back(data);
741 }
742 
743 void ServicesSandesh::DhcpPktTrace(PktTrace::Pkt &pkt, DhcpPktSandesh *resp) {
744  DhcpPkt data;
745  FillPktData(pkt, data.info);
746  uint16_t hdr_len = FillVrouterHdr(pkt, data.agent_hdr);
747  uint8_t *ptr = pkt.pkt + hdr_len;
748  ptr += FillMacHdr((struct ether_header *)ptr, data.mac_hdr);
749  FillIpv4Hdr((struct ip *)ptr, data.ip_hdr);
750  ptr += (data.ip_hdr.hdrlen * 4);
751  FillUdpHdr((udphdr *)ptr, data.udp_hdr);
752  ptr += sizeof(udphdr);
753  PktHandler *pkt_handler = Agent::GetInstance()->pkt()->pkt_handler();
754  std::size_t trace_size = pkt_handler->PktTraceSize(PktHandler::DHCP);
755  int32_t remaining = std::min(pkt.len, trace_size) -
756  (sizeof(struct ether_header) +
757  data.ip_hdr.hdrlen * 4 + sizeof(udphdr));
758  FillDhcpv4Hdr((dhcphdr *)ptr, data.dhcp_hdr, remaining);
759  std::vector<DhcpPkt> &list =
760  const_cast<std::vector<DhcpPkt>&>(resp->get_pkt_list());
761  list.push_back(data);
762 }
763 
764 void ServicesSandesh::Dhcpv6PktTrace(PktTrace::Pkt &pkt, Dhcpv6PktSandesh *resp) {
765  Dhcpv6Pkt data;
766  FillPktData(pkt, data.info);
767  uint16_t hdr_len = FillVrouterHdr(pkt, data.agent_hdr);
768  uint8_t *ptr = pkt.pkt + hdr_len;
769  ptr += FillMacHdr((struct ether_header *)ptr, data.mac_hdr);
770  FillIpv6Hdr((ip6_hdr *)ptr, data.ip_hdr);
771  ptr += sizeof(ip6_hdr);
772  FillUdpHdr((udphdr *)ptr, data.udp_hdr);
773  ptr += sizeof(udphdr);
774  PktHandler *pkt_handler = Agent::GetInstance()->pkt()->pkt_handler();
775  std::size_t trace_size = pkt_handler->PktTraceSize(PktHandler::DHCPV6);
776  int32_t remaining = std::min(pkt.len, trace_size) -
777  (sizeof(struct ether_header) + sizeof(ip6_hdr) + sizeof(udphdr));
778  FillDhcpv6Hdr((Dhcpv6Hdr *)ptr, data.dhcp_hdr, remaining);
779  std::vector<Dhcpv6Pkt> &list =
780  const_cast<std::vector<Dhcpv6Pkt>&>(resp->get_pkt_list());
781  list.push_back(data);
782 }
783 
784 void ServicesSandesh::DnsPktTrace(PktTrace::Pkt &pkt, DnsPktSandesh *resp) {
785  DnsPkt data;
786  FillPktData(pkt, data.info);
787  uint16_t hdr_len = FillVrouterHdr(pkt, data.agent_hdr);
788  uint8_t *ptr = pkt.pkt + hdr_len;
789  ptr += FillMacHdr((struct ether_header *)ptr, data.mac_hdr);
790  FillIpv4Hdr((struct ip *)ptr, data.ip_hdr);
791  ptr += (data.ip_hdr.hdrlen * 4);
792  FillUdpHdr((udphdr *)ptr, data.udp_hdr);
793  ptr += sizeof(udphdr);
794  PktHandler *pkt_handler = Agent::GetInstance()->pkt()->pkt_handler();
795  std::size_t trace_size = pkt_handler->PktTraceSize(PktHandler::DNS);
796  int32_t remaining = std::min(pkt.len, trace_size) -
797  (sizeof(struct ether_header) +
798  data.ip_hdr.hdrlen * 4 + sizeof(udphdr));
799  FillDnsHdr((dnshdr *)ptr, data.dns_hdr, remaining);
800  std::vector<DnsPkt> &list =
801  const_cast<std::vector<DnsPkt>&>(resp->get_pkt_list());
802  list.push_back(data);
803 }
804 
805 void ServicesSandesh::IcmpPktTrace(PktTrace::Pkt &pkt, IcmpPktSandesh *resp) {
806  IcmpPkt data;
807  FillPktData(pkt, data.info);
808  uint16_t hdr_len = FillVrouterHdr(pkt, data.agent_hdr);
809  uint8_t *ptr = pkt.pkt + hdr_len;
810  ptr += FillMacHdr((struct ether_header *)ptr, data.mac_hdr);
811  FillIpv4Hdr((struct ip *)ptr, data.ip_hdr);
812  ptr += (data.ip_hdr.hdrlen * 4);
813  FillIcmpv4Hdr((struct icmp *)ptr, data.icmp_hdr);
814  std::vector<IcmpPkt> &list =
815  const_cast<std::vector<IcmpPkt>&>(resp->get_pkt_list());
816  list.push_back(data);
817 }
818 
819 void ServicesSandesh::Icmpv6PktTrace(PktTrace::Pkt &pkt, Icmpv6PktSandesh *resp) {
820  Icmpv6Pkt data;
821  FillPktData(pkt, data.info);
822  uint16_t hdr_len = FillVrouterHdr(pkt, data.agent_hdr);
823  uint8_t *ptr = pkt.pkt + hdr_len;
824  ptr += FillMacHdr((struct ether_header *)ptr, data.mac_hdr);
825  FillIpv6Hdr((ip6_hdr *)ptr, data.ip_hdr);
826  ptr += sizeof(ip6_hdr);
827  PktHandler *pkt_handler = Agent::GetInstance()->pkt()->pkt_handler();
828  std::size_t trace_size = pkt_handler->PktTraceSize(PktHandler::ICMPV6);
829  int32_t remaining = std::min(pkt.len, trace_size) -
830  (sizeof(struct ether_header) + sizeof(ip6_hdr));
831  FillIcmpv6Hdr((icmp6_hdr *)ptr, data.icmp_hdr, remaining);
832  std::vector<Icmpv6Pkt> &list =
833  const_cast<std::vector<Icmpv6Pkt>&>(resp->get_pkt_list());
834  list.push_back(data);
835 }
836 
837 void ServicesSandesh::OtherPktTrace(PktTrace::Pkt &pkt, PktSandesh *resp) {
838  PktDump data;
839  FillPktData(pkt, data.info);
840  uint16_t hdr_len = FillVrouterHdr(pkt, data.agent_hdr);
841  uint8_t *ptr = pkt.pkt + hdr_len;
842  ptr += FillMacHdr((struct ether_header *)ptr, data.mac_hdr);
843  PktHandler *pkt_handler = Agent::GetInstance()->pkt()->pkt_handler();
844  std::size_t trace_size = pkt_handler->PktTraceSize(PktHandler::FLOW);
845  int32_t remaining = std::min(pkt.len, trace_size) - sizeof(struct ether_header);
846  PktToHexString(ptr, remaining, data.pkt);
847  std::vector<PktDump> &list =
848  const_cast<std::vector<PktDump>&>(resp->get_pkt_list());
849  list.push_back(data);
850 }
851 
853  std::string ctxt, bool more = false) {
854  SandeshResponse *resp = NULL;
855  boost::function<void(PktTrace::Pkt &)> cb;
856  boost::array<std::string, PktHandler::MAX_MODULES> names =
857  { { "Invalid", "Flow", "Arp", "Dhcp", "Dhcpv6", "Dns",
858  "Icmp", "Icmpv6", "Diagnostics", "IcmpError", "RxPacket",
859  "MacLearning" } };
860 
861  switch (mod) {
862  case PktHandler::ARP:
863  resp = new ArpPktSandesh();
864  ArpStatsSandesh(ctxt, true);
865  static_cast<ArpPktSandesh *>(resp)->set_type(names.at(mod));
866  cb = boost::bind(&ServicesSandesh::ArpPktTrace, this, _1,
867  static_cast<ArpPktSandesh *>(resp));
868  break;
869 
870  case PktHandler::BFD:
871  BfdStatsSandesh(ctxt, false);
872  return;
873 
874  case PktHandler::DHCP:
875  resp = new DhcpPktSandesh();
876  DhcpStatsSandesh(ctxt, true);
877  static_cast<DhcpPktSandesh *>(resp)->set_type(names.at(mod));
878  cb = boost::bind(&ServicesSandesh::DhcpPktTrace, this, _1,
879  static_cast<DhcpPktSandesh *>(resp));
880  break;
881 
882  case PktHandler::DHCPV6:
883  resp = new Dhcpv6PktSandesh();
884  Dhcpv6StatsSandesh(ctxt, true);
885  static_cast<Dhcpv6PktSandesh *>(resp)->set_type(names.at(mod));
886  cb = boost::bind(&ServicesSandesh::Dhcpv6PktTrace, this, _1,
887  static_cast<Dhcpv6PktSandesh *>(resp));
888  break;
889 
890  case PktHandler::DNS:
891  resp = new DnsPktSandesh();
892  DnsStatsSandesh(ctxt, true);
893  static_cast<DnsPktSandesh *>(resp)->set_type(names.at(mod));
894  cb = boost::bind(&ServicesSandesh::DnsPktTrace, this, _1,
895  static_cast<DnsPktSandesh *>(resp));
896  break;
897 
898  case PktHandler::ICMP:
899  resp = new IcmpPktSandesh();
900  IcmpStatsSandesh(ctxt, true);
901  static_cast<IcmpPktSandesh *>(resp)->set_type(names.at(mod));
902  cb = boost::bind(&ServicesSandesh::IcmpPktTrace, this, _1,
903  static_cast<IcmpPktSandesh *>(resp));
904  break;
905 
906  case PktHandler::ICMPV6:
907  resp = new Icmpv6PktSandesh();
908  Icmpv6StatsSandesh(ctxt, true);
909  static_cast<Icmpv6PktSandesh *>(resp)->set_type(names.at(mod));
910  cb = boost::bind(&ServicesSandesh::Icmpv6PktTrace, this, _1,
911  static_cast<Icmpv6PktSandesh *>(resp));
912  break;
913 
914  case PktHandler::IGMP:
915  IgmpStatsSandesh(ctxt, false);
916  return;
917 
918  case PktHandler::FLOW:
919  case PktHandler::DIAG:
920  case PktHandler::INVALID:
922  resp = new PktSandesh();
923  static_cast<PktSandesh *>(resp)->set_type(names.at(mod));
924  cb = boost::bind(&ServicesSandesh::OtherPktTrace, this, _1,
925  static_cast<PktSandesh *>(resp));
926  break;
927 
928  default:
929  break;
930  }
931 
933  resp->set_context(ctxt);
934  resp->set_more(more);
935  resp->Response();
936 }
937 
938 void ServicesSandesh::MetadataHandleRequest(std::string ctxt, bool more = false) {
939  MetadataResponse *resp = new MetadataResponse();
940  resp->set_metadata_server_port(
941  Agent::GetInstance()->metadata_server_port());
942  const MetadataProxy::MetadataStats &stats =
944  resp->set_metadata_requests(stats.requests);
945  resp->set_metadata_responses(stats.responses);
946  resp->set_metadata_proxy_sessions(stats.proxy_sessions);
947  resp->set_metadata_internal_errors(stats.internal_errors);
948  resp->set_context(ctxt);
949  resp->set_more(more);
950  resp->Response();
951 }
952 
954 
955 void DhcpInfo::HandleRequest() const {
956  ServicesSandesh ssandesh;
957  ssandesh.HandleRequest(PktHandler::DHCP, context());
958 }
959 
960 void Dhcpv6Info::HandleRequest() const {
961  ServicesSandesh ssandesh;
962  ssandesh.HandleRequest(PktHandler::DHCPV6, context());
963 }
964 
965 void ArpInfo::HandleRequest() const {
966  ServicesSandesh ssandesh;
967  ssandesh.HandleRequest(PktHandler::ARP, context());
968 }
969 
970 void BfdInfo::HandleRequest() const {
971  ServicesSandesh ssandesh;
972  ssandesh.HandleRequest(PktHandler::BFD, context());
973 }
974 
975 void DnsInfo::HandleRequest() const {
976  ServicesSandesh ssandesh;
977  ssandesh.HandleRequest(PktHandler::DNS, context());
978 }
979 
980 void IcmpInfo::HandleRequest() const {
981  ServicesSandesh ssandesh;
982  ssandesh.HandleRequest(PktHandler::ICMP, context());
983 }
984 
985 void Icmpv6Info::HandleRequest() const {
986  ServicesSandesh ssandesh;
987  ssandesh.HandleRequest(PktHandler::ICMPV6, context());
988 }
989 
990 void IgmpStatsReq::HandleRequest() const {
991  ServicesSandesh ssandesh;
992  ssandesh.HandleRequest(PktHandler::IGMP, context());
993 }
994 
995 void GmpStatsReq::HandleRequest() const {
996  GmpStatsResponse *gmp = new GmpStatsResponse();
997  GmpProto *gmp_proto_ = Agent::GetInstance()->GetIgmpProto()->GetGmpProto();
998  const GmpProto::GmpStats &stats = gmp_proto_->GetStats();
999  gmp->set_gmp_g_add_count(stats.gmp_g_add_count_);
1000  gmp->set_gmp_g_del_count(stats.gmp_g_del_count_);
1001  gmp->set_gmp_sg_add_count(stats.gmp_sg_add_count_);
1002  gmp->set_gmp_sg_del_count(stats.gmp_sg_del_count_);
1003  gmp->set_context(context());
1004  gmp->set_more(false);
1005  gmp->Response();
1006 }
1007 
1008 static void SandeshError(const std::string msg, const std::string &context) {
1009  IgmpErrorResp *resp = new IgmpErrorResp();
1010  resp->set_resp(msg);
1011  resp->set_context(context);
1012  resp->set_more(false);
1013  resp->Response();
1014 }
1015 
1016 void InterfaceIgmpStatsReq::HandleRequest() const {
1017  std::string vn_uuid = get_vn_uuid();
1018  std::string gw = get_ipam_gateway();
1019  InterfaceIgmpStatsResponse *igmp = new InterfaceIgmpStatsResponse();
1020  IgmpStats rx_badpacket_stats;
1021  IgmpStats rx_okpacket_stats;
1022  IgmpInfo::IgmpItfStats stats;
1023 
1024  if (vn_uuid.empty() || gw.empty()) {
1025  SandeshError("Empty vn_uuid or gateway !!", context());
1026  return;
1027  }
1028 
1029  VnEntry *vn =
1030  Agent::GetInstance()->vn_table()->Find(StringToUuid(vn_uuid));
1031  if (!vn ) {
1032  SandeshError("Invalid UUID !!", context());
1033  return;
1034  }
1035 
1036  boost::system::error_code ec;
1037  IpAddress gateway = IpAddress(Ip4Address::from_string(gw, ec));
1038  if (Agent::GetInstance()->GetIgmpProto()->GetItfStats(vn, gateway,
1039  stats) == false ) {
1040  SandeshError("Stats not found !!", context());
1041  return;
1042  }
1043 
1044  igmp->set_rx_unknown(stats.rx_unknown);
1045  igmp->set_tx_packet(stats.tx_packet);
1046  igmp->set_tx_drop_packet(stats.tx_drop_packet);
1047 
1048  rx_badpacket_stats.undefined =
1049  stats.rx_badpacket[IGMP_UNDEFINED - 1];
1050  rx_badpacket_stats.igmp_membership_query =
1052  rx_badpacket_stats.igmp_v1_membership_report =
1054  rx_badpacket_stats.igmp_proto_dvmrp =
1055  stats.rx_badpacket[IGMP_PROTO_DVMRP - 1];
1056  rx_badpacket_stats.igmp_proto_pim =
1057  stats.rx_badpacket[IGMP_PROTO_PIM - 1];
1058  rx_badpacket_stats.igmp_cisco_trace =
1059  stats.rx_badpacket[IGMP_CISCO_TRACE - 1];
1060  rx_badpacket_stats.igmp_v2_membership_report =
1062  rx_badpacket_stats.igmp_group_leave =
1063  stats.rx_badpacket[IGMP_GROUP_LEAVE - 1];
1064  rx_badpacket_stats.igmp_mtrace_response =
1066  rx_badpacket_stats.igmp_mtrace_request =
1067  stats.rx_badpacket[IGMP_MTRACE_REQUEST - 1];
1068  rx_badpacket_stats.igmp_dwr =
1069  stats.rx_badpacket[IGMP_DWR - 1];
1070  rx_badpacket_stats.igmp_v3_membership_report =
1072  igmp->set_rx_badpacket_stats(rx_badpacket_stats);
1073 
1074  rx_okpacket_stats.undefined =
1075  stats.rx_okpacket[IGMP_UNDEFINED - 1];
1076  rx_okpacket_stats.igmp_membership_query =
1078  rx_okpacket_stats.igmp_v1_membership_report =
1080  rx_okpacket_stats.igmp_proto_dvmrp =
1081  stats.rx_okpacket[IGMP_PROTO_DVMRP - 1];
1082  rx_okpacket_stats.igmp_proto_pim =
1083  stats.rx_okpacket[IGMP_PROTO_PIM - 1];
1084  rx_okpacket_stats.igmp_cisco_trace =
1085  stats.rx_okpacket[IGMP_CISCO_TRACE - 1];
1086  rx_okpacket_stats.igmp_v2_membership_report =
1088  rx_okpacket_stats.igmp_group_leave =
1089  stats.rx_okpacket[IGMP_GROUP_LEAVE - 1];
1090  rx_okpacket_stats.igmp_mtrace_response =
1091  stats.rx_okpacket[IGMP_MTRACE_RESPONSE - 1];
1092  rx_okpacket_stats.igmp_mtrace_request =
1093  stats.rx_okpacket[IGMP_MTRACE_REQUEST - 1];
1094  rx_okpacket_stats.igmp_dwr =
1095  stats.rx_okpacket[IGMP_DWR - 1];
1096  rx_okpacket_stats.igmp_v3_membership_report =
1098  igmp->set_rx_okpacket_stats(rx_okpacket_stats);
1099 
1100  igmp->set_context(context());
1101  igmp->Response();
1102 }
1103 
1104 void MetadataInfo::HandleRequest() const {
1105  ServicesSandesh ssandesh;
1106  ssandesh.MetadataHandleRequest(context());
1107 }
1108 
1109 void MacLearningInfo::HandleRequest() const {
1110  ServicesSandesh ssandesh;
1111  ssandesh.HandleRequest(PktHandler::MAC_LEARNING, context());
1112 }
1113 
1114 void ShowAllInfo::HandleRequest() const {
1115  ServicesSandesh ssandesh;
1116  ssandesh.PktStatsSandesh(context(), true);
1117  ssandesh.HandleRequest(PktHandler::DHCP, context(), true);
1118  ssandesh.HandleRequest(PktHandler::ARP, context(), true);
1119  ssandesh.HandleRequest(PktHandler::DNS, context(), true);
1120  ssandesh.HandleRequest(PktHandler::ICMP, context(), true);
1121  ssandesh.HandleRequest(PktHandler::FLOW, context(), true);
1122  ssandesh.HandleRequest(PktHandler::DIAG, context(), true);
1123  ssandesh.HandleRequest(PktHandler::INVALID, context(), true);
1124  ssandesh.HandleRequest(PktHandler::MAC_LEARNING, context(), true);
1125  ssandesh.MetadataHandleRequest(context(), false);
1126 }
1127 
1128 void ClearAllInfo::HandleRequest() const {
1129  Agent *agent = Agent::GetInstance();
1130  PktHandler *pkt_handler = agent->pkt()->pkt_handler();
1131  pkt_handler->PktTraceClear(PktHandler::DHCP);
1132  pkt_handler->PktTraceClear(PktHandler::DHCPV6);
1133  pkt_handler->PktTraceClear(PktHandler::ARP);
1134  pkt_handler->PktTraceClear(PktHandler::DNS);
1135  pkt_handler->PktTraceClear(PktHandler::ICMP);
1136  pkt_handler->PktTraceClear(PktHandler::ICMPV6);
1137  pkt_handler->PktTraceClear(PktHandler::FLOW);
1138  pkt_handler->PktTraceClear(PktHandler::DIAG);
1139  pkt_handler->PktTraceClear(PktHandler::INVALID);
1141  pkt_handler->ClearStats();
1142  agent->GetDhcpProto()->ClearStats();
1143  agent->dhcpv6_proto()->ClearStats();
1144  agent->GetArpProto()->ClearStats();
1145  agent->GetDnsProto()->ClearStats();
1146  agent->GetIcmpProto()->ClearStats();
1147  agent->icmpv6_proto()->ClearStats();
1148  agent->services()->metadataproxy()->ClearStats();
1149 
1150  PktErrorResp *resp = new PktErrorResp();
1151  resp->set_context(context());
1152  resp->Response();
1153 }
1154 
1155 void PktTraceInfo::HandleRequest() const {
1156  uint32_t buffers = get_num_buffers();
1157  uint32_t flow_buffers = get_flow_num_buffers();
1158  PktTraceInfoResponse *resp = new PktTraceInfoResponse();
1159  PktHandler *handler = Agent::GetInstance()->pkt()->pkt_handler();
1160  if (buffers > PktTrace::kPktMaxNumBuffers ||
1161  flow_buffers > PktTrace::kPktMaxNumBuffers) {
1162  resp->set_resp("Invalid Input !!");
1163  buffers = handler->PktTraceBuffers(PktHandler::INVALID);
1164  flow_buffers = handler->PktTraceBuffers(PktHandler::FLOW);
1165  } else {
1166  handler->PktTraceBuffers(PktHandler::FLOW, flow_buffers);
1167  for (uint32_t i = 0; i < PktHandler::MAX_MODULES; ++i) {
1168  if (i == PktHandler::FLOW)
1169  continue;
1170  handler->PktTraceBuffers((PktHandler::PktModuleName)i, buffers);
1171  }
1172  }
1173  resp->set_num_buffers(buffers);
1174  resp->set_flow_num_buffers(flow_buffers);
1175  resp->set_context(context());
1176  resp->Response();
1177 }
1178 
1180 
1181 void ShowDnsEntries::HandleRequest() const {
1182  AgentDnsEntries *resp = new AgentDnsEntries();
1183  std::vector<VmDnsSandesh> dns_list;
1184  const DnsProto::DnsUpdateSet &dns_update_set =
1186  for (DnsProto::DnsUpdateSet::const_iterator it = dns_update_set.begin();
1187  it != dns_update_set.end(); ++it) {
1188  VmDnsSandesh vmdata;
1189  vmdata.vm = (*it)->itf->name();
1190  vmdata.is_floating = ((*it)->floatingIp ? "yes" : "no");
1191  if ((*it)->xmpp_data) {
1192  vmdata.virtual_dns = (*it)->xmpp_data->virtual_dns;
1193  vmdata.zone = (*it)->xmpp_data->zone;
1194  for (DnsItems::iterator item = (*it)->xmpp_data->items.begin();
1195  item != (*it)->xmpp_data->items.end(); ++item) {
1196  VmDnsRecord record;
1197  record.name = (*item).name;
1198  record.type = BindUtil::DnsType((*item).type);
1199  record.data = (*item).data;
1200  record.ttl = (*item).ttl;
1201  record.eclass = BindUtil::DnsClass((*item).eclass);
1202  vmdata.records.push_back(record);
1203  }
1204  }
1205  dns_list.push_back(vmdata);
1206  }
1207  resp->set_dns_list(dns_list);
1208  resp->set_context(context());
1209  resp->Response();
1210 }
1211 
1212 void VmVdnsListReq::HandleRequest() const {
1213  VmVdnsListResponse *resp = new VmVdnsListResponse();
1214  resp->set_context(context());
1215 
1216  const DnsProto::VmDataMap& vm_list = Agent::GetInstance()->GetDnsProto()->all_vms();
1217  std::vector<VmVdnsListEntry> &list =
1218  const_cast<std::vector<VmVdnsListEntry>&>(resp->get_rlist());
1219  DnsProto::VmDataMap::const_iterator it = vm_list.begin();
1220  while (it != vm_list.end()) {
1221  const VmInterface *itf = it->first;
1222  VmVdnsListEntry entry;
1223  entry.set_name(itf->name());
1224  entry.set_vm_interface_index(itf->id());
1225  list.push_back(entry);
1226  ++it;
1227  }
1228  resp->Response();
1229 }
1230 
1231 void VmVdnsDataReq::HandleRequest() const {
1232  VmVdnsDataResponse *resp = new VmVdnsDataResponse();
1233  resp->set_context(context());
1234 
1235  Agent *agent = Agent::GetInstance();
1236  const VmInterface *vmi = static_cast<const VmInterface *>
1237  (agent->interface_table()->FindInterface(get_vm_interface_index()));
1238  if (vmi == NULL) {
1239  resp->Response();
1240  return;
1241  }
1242  const DnsProto::VmDataMap& all_vms = agent->GetDnsProto()->all_vms();
1243  DnsProto::VmDataMap::const_iterator it = all_vms.find(vmi);
1244  if (it == all_vms.end()) {
1245  resp->Response();
1246  return;
1247  }
1248  const DnsProto::IpVdnsMap &ip_list = it->second;
1249  DnsProto::IpVdnsMap::const_iterator ip_it = ip_list.begin();
1250  std::vector<VmVdnsDataEntry> &list =
1251  const_cast<std::vector<VmVdnsDataEntry>&>(resp->get_rlist());
1252  while (ip_it != ip_list.end()) {
1253  VmVdnsDataEntry entry;
1254  Ip4Address ip4(ip_it->first);
1255  entry.set_ip(ip4.to_string());
1256  entry.set_vdns_name(ip_it->second);
1257  list.push_back(entry);
1258  ++ip_it;
1259  }
1260  resp->Response();
1261 }
1262 
1263 void FipVdnsDataReq::HandleRequest() const {
1264  FipVdnsDataResponse *resp = new FipVdnsDataResponse();
1265  resp->set_context(context());
1266  const DnsProto::DnsFipSet& fip_list = Agent::GetInstance()->GetDnsProto()
1267  ->fip_list();
1268  std::vector<FipVdnsEntry> &list =
1269  const_cast<std::vector<FipVdnsEntry>&>(resp->get_rlist());
1270  DnsProto::DnsFipSet::const_iterator it = fip_list.begin();
1271  while (it != fip_list.end()) {
1272  FipVdnsEntry entry;
1273  const DnsProto::DnsFipEntry *fip = (*it).get();
1274  IpAddress ip(fip->floating_ip_);
1275  entry.set_vn(fip->vn_->GetName());
1276  entry.set_ip(ip.to_string());
1277  entry.set_vm_interface(fip->interface_->name());
1278  entry.set_vdns_name(fip->vdns_name_);
1279  list.push_back(entry);
1280  ++it;
1281  }
1282 
1283  resp->Response();
1284 }
1285 
1287 
1288 void ShowArpCache::HandleRequest() const {
1289  ArpCacheResp *resp = new ArpCacheResp();
1290  resp->set_context(context());
1291  ArpSandesh *arp_sandesh = new ArpSandesh(resp);
1292  const ArpProto::ArpCache &cache =
1294  for (ArpProto::ArpCache::const_iterator it = cache.begin();
1295  it != cache.end(); it++) {
1296  if (!arp_sandesh->SetArpEntry(it->first, it->second))
1297  break;
1298  }
1299  arp_sandesh->Response();
1300  delete arp_sandesh;
1301 }
1302 
1303 void ShowGratuitousArpCache::HandleRequest() const {
1304  ArpCacheResp *resp = new ArpCacheResp();
1305  resp->set_context(context());
1306  ArpSandesh *arp_sandesh = new ArpSandesh(resp);
1307  const ArpProto::GratuitousArpCache &cache =
1309  for (ArpProto::GratuitousArpCache::const_iterator it = cache.begin();
1310  it != cache.end(); it++) {
1311  for (ArpProto::ArpEntrySet::iterator sit = it->second.begin();
1312  sit != it->second.end(); sit++) {
1313  arp_sandesh->SetArpEntry(it->first, *sit);
1314  }
1315  }
1316 
1317  arp_sandesh->Response();
1318  delete arp_sandesh;
1319 }
1320 
1321 bool ArpSandesh::SetArpEntry(const ArpKey &key, const ArpEntry *entry) {
1322  ArpCacheResp *vresp = static_cast<ArpCacheResp *>(resp_);
1323  ArpSandeshData data;
1324  boost::asio::ip::address_v4 ip(key.ip);
1325  data.set_ip(ip.to_string());
1326  data.set_vrf(key.vrf->GetName());
1327  if (entry->get_interface())
1328  data.set_interface_name(entry->get_interface()->name());
1329  std::string mac_str;
1330  ServicesSandesh::MacToString(entry->mac_address(), mac_str);
1331  data.set_mac(mac_str);
1332  switch (entry->state()) {
1333  case ArpEntry::INITING:
1334  data.set_state("initing");
1335  break;
1336  case ArpEntry::RESOLVING:
1337  data.set_state("resolving");
1338  break;
1339  case ArpEntry::ACTIVE:
1340  data.set_state("active");
1341  break;
1342  case ArpEntry::RERESOLVING:
1343  data.set_state("re-resolving");
1344  break;
1345  }
1346 
1347  std::vector<ArpSandeshData> &list =
1348  const_cast<std::vector<ArpSandeshData>&>(vresp->get_arp_list());
1349  list.push_back(data);
1350  iter_++;
1352  // send partial sandesh
1353  ArpCacheResp *resp = new ArpCacheResp();
1354  resp->set_context(resp_->context());
1356  resp_->set_more(true);
1357  resp_->Response();
1358  resp_ = resp;
1359  }
1360  return true;
1361 }
1362 
1364  ArpProto::InterfaceArpMap::const_iterator &it,
1365  std::vector<InterfaceArpStats> &list) {
1366  InterfaceArpStats data;
1367  data.set_interface_index(it->first);
1368  data.set_arp_requests(it->second.stats.arp_req);
1369  data.set_arp_replies(it->second.stats.arp_replies);
1370  data.set_arp_resolved(it->second.stats.resolved);
1371  list.push_back(data);
1372 }
1373 
1374 void InterfaceArpStatsReq::HandleRequest() const {
1375  InterfaceArpStatsResponse *resp = new InterfaceArpStatsResponse();
1376  resp->set_context(context());
1377  ArpSandesh arp_sandesh(resp);
1378  const ArpProto::InterfaceArpMap &imap =
1380  std::vector<InterfaceArpStats> &list =
1381  const_cast<std::vector<InterfaceArpStats>&>(resp->get_stats_list());
1382  if (get_interface_index() != -1) {
1383  ArpProto::InterfaceArpMap::const_iterator it = imap.find
1384  (get_interface_index());
1385  if (it != imap.end()) {
1386  arp_sandesh.SetInterfaceArpStatsEntry(it, list);
1387  }
1388  arp_sandesh.Response();
1389  return;
1390  }
1391  for (ArpProto::InterfaceArpMap::const_iterator it = imap.begin();
1392  it != imap.end(); it++) {
1393  arp_sandesh.SetInterfaceArpStatsEntry(it, list);
1394  }
1395  arp_sandesh.Response();
1396 }
1397 
1398 void InterfaceIcmpv6StatsReq::HandleRequest() const {
1399  Agent * agent = Agent::GetInstance();
1400  InterfaceIcmpv6StatsResponse *resp = new InterfaceIcmpv6StatsResponse();
1401  resp->set_context(context());
1402  const Icmpv6Proto::VmInterfaceMap &imap =
1403  (agent->icmpv6_proto()->vm_interfaces());
1404  std::vector<InterfaceIcmpv6Stats> &list =
1405  const_cast<std::vector<InterfaceIcmpv6Stats>&>(resp->get_stats_list());
1406  if (get_interface_index() != -1) {
1407  VmInterface *vm_intf = static_cast<VmInterface *>(
1408  agent->interface_table()->FindInterface(get_interface_index()));
1409  if (vm_intf) {
1410  Icmpv6Proto::VmInterfaceMap::const_iterator it = imap.find(vm_intf);
1411  if (it != imap.end()) {
1412  SET_ICMPV6_INTERFACE_STATS(it, list);
1413  }
1414  }
1415  } else {
1416  for (Icmpv6Proto::VmInterfaceMap::const_iterator it = imap.begin();
1417  it != imap.end(); it++) {
1418  SET_ICMPV6_INTERFACE_STATS(it, list);
1419  }
1420  }
1421  resp->Response();
1422 }
Direction dir
Definition: pkt_trace.h:25
void ClearStats()
Definition: pkt_handler.h:301
uint32_t gmp_g_del_count_
Definition: gmp_proto.h:135
std::map< uint16_t, std::string > g_ip_protocol_map
void HandleRequest(PktHandler::PktModuleName mod, std::string ctxt, bool more)
std::size_t len
Definition: pkt_trace.h:26
in_addr_t yiaddr
Definition: dhcp_handler.h:222
void Dhcpv6StatsSandesh(std::string ctxt, bool more)
#define DHCP_OPTION_PAD
Definition: dhcp_handler.h:16
std::map< VmInterface *, Icmpv6Stats > VmInterfaceMap
Definition: icmpv6_proto.h:77
const BfdStats & GetStats() const
Definition: bfd_proto.h:130
void IcmpStatsSandesh(std::string ctxt, bool more)
void FillArpHdr(ether_arp *arp, ArpHdr &resp)
ServicesModule * services() const
Definition: agent.cc:973
uint32_t arp_invalid_packets
Definition: arp_proto.h:73
#define DHCP_OPTION_MSG_TYPE
Definition: dhcp_handler.h:69
uint32_t ifindex
Definition: pkt_handler.h:180
static Agent * GetInstance()
Definition: agent.h:436
static boost::uuids::uuid StringToUuid(const std::string &str)
Definition: string_util.h:145
uint32_t unknown_msg_drop
Definition: dhcp_proto.h:64
#define DHCP_REQUEST
Definition: dhcp_handler.h:185
uint32_t errors
Definition: arp_proto.h:72
void FillPktData(PktTrace::Pkt &pkt, PktData &resp)
void FillIpv6Hdr(ip6_hdr *ip, Ipv6Hdr &resp)
uint8_t options[DHCP_MAX_OPTION_LEN]
Definition: dhcp_handler.h:228
#define DHCP_LEASE_UNASSIGNED
Definition: dhcp_handler.h:192
std::string IpProtocol(uint16_t prot)
void PktToHexString(uint8_t *pkt, int32_t len, std::string &msg)
MetadataProxy * metadataproxy()
Definition: services_init.h:32
uint8_t xid[3]
const uint32_t id() const
Definition: interface.h:123
#define DHCP_OPTION_IP_LEASE_TIME
Definition: dhcp_handler.h:67
uint32_t gmp_sg_add_count_
Definition: gmp_proto.h:137
std::string IntToString(uint32_t val)
static std::string & Dhcpv6MsgType(uint32_t msg_type)
void FillIcmpv4Hdr(struct icmp *icmp, Icmpv4Hdr &resp)
uint32_t resolved
Definition: arp_proto.h:70
std::vector< string > & GetDnslist()
Definition: agent.h:700
State state() const
Definition: arp_entry.h:37
void ClearStats()
Definition: dhcp_proto.h:117
uint32_t information_request
Definition: dhcpv6_proto.h:50
#define DHCPV6_CONFIRM
uint8_t htype
Definition: dhcp_handler.h:215
#define DHCP_INFORM
Definition: dhcp_handler.h:190
boost::asio::ip::address IpAddress
Definition: address.h:13
uint32_t icmpv6_neighbor_advert_solicited_
Definition: icmpv6_proto.h:73
boost::asio::ip::address local_address
Definition: bfd_common.h:114
uint8_t sname[DHCP_NAME_LEN]
Definition: dhcp_handler.h:226
#define IGMP_V3_MEMBERSHIP_REPORT
Definition: igmp_proto.h:24
#define DHCP_LEASE_ACTIVE
Definition: dhcp_handler.h:194
const DnsStats & GetStats() const
Definition: dns_proto.h:221
#define DHCP_FIXED_LEN
Definition: dhcp_handler.h:199
#define DHCP_OFFER
Definition: dhcp_handler.h:184
#define DHCP_OPTION_REQ_IP_ADDRESS
Definition: dhcp_handler.h:66
#define DHCP_BCAST_FLAG
Definition: dhcp_handler.h:207
#define DHCP_LEASE_QUERY
Definition: dhcp_handler.h:191
uint8_t ra
Definition: bind_util.h:85
uint32_t xid
Definition: dhcp_handler.h:218
const DhcpStats & GetStats() const
Definition: dhcpv6_proto.h:75
uint32_t rx_okpacket[IGMP_MAX_TYPE]
Definition: igmp_proto.h:50
const ArpCache & arp_cache()
Definition: arp_proto.h:103
void DhcpStatsSandesh(std::string ctxt, bool more)
uint8_t auth
Definition: bind_util.h:78
InterfaceTable * interface_table() const
Definition: agent.h:465
uint16_t secs
Definition: dhcp_handler.h:219
uint16_t ans_rrcount
Definition: bind_util.h:106
VnTable * vn_table() const
Definition: agent.h:495
uint32_t icmpv6_neighbor_solicit_
Definition: icmpv6_proto.h:71
#define DHCP_LEASE_UNKNOWN
Definition: dhcp_handler.h:193
const PktStats & GetStats() const
Definition: pkt_handler.h:300
const string & GetName() const
Definition: vrf.h:100
void FillIcmpv6Hdr(icmp6_hdr *icmp, Icmpv6Hdr &resp, int32_t len)
uint8_t op
Definition: bind_util.h:79
void ClearStats()
Definition: dhcpv6_proto.h:76
void DhcpPktTrace(PktTrace::Pkt &pkt, DhcpPktSandesh *resp)
ArpProto * GetArpProto() const
Definition: agent.h:978
uint32_t arp_gratuitous
Definition: arp_proto.h:69
uint8_t chaddr[DHCP_CHADDR_LEN]
Definition: dhcp_handler.h:225
uint32_t retransmit_reqs
Definition: dns_proto.h:114
const InterfaceArpMap & interface_arp_map()
Definition: arp_proto.h:105
#define DHCP_OPTION_END
Definition: dhcp_handler.h:176
IpAddress floating_ip_
Definition: dns_proto.h:126
const DnsFipSet & fip_list() const
Definition: dns_proto.h:224
std::map< ArpKey, ArpEntrySet > GratuitousArpCache
Definition: arp_proto.h:33
const IgmpStats & GetStats() const
Definition: igmp_proto.h:151
void FillDhcpv4Options(Dhcpv4Options *opt, std::string &resp, std::string &other, int32_t len)
void ClearStats()
Definition: arp_proto.h:155
BFDRemoteSessionState remote_state() const
Definition: bfd_session.cc:289
#define DHCPV6_SOLICIT
boost::asio::ip::address remote_address
Definition: bfd_common.h:115
void ClearStats()
Definition: icmpv6_proto.h:121
in_addr_t ciaddr
Definition: dhcp_handler.h:221
const VmInterface * interface_
Definition: dns_proto.h:127
#define DHCP_OPTION_DNS
Definition: dhcp_handler.h:22
uint16_t flags
Definition: dhcp_handler.h:220
#define DHCPV6_REPLY
const GratuitousArpCache & gratuitous_arp_cache()
Definition: arp_proto.h:104
const Icmpv6Stats & GetStats() const
Definition: icmpv6_proto.h:119
void OtherPktTrace(PktTrace::Pkt &pkt, PktSandesh *resp)
uint8_t op
Definition: dhcp_handler.h:214
Dhcpv6Proto * dhcpv6_proto() const
Definition: agent.h:984
std::map< uint32_t, InterfaceArpInfo > InterfaceArpMap
Definition: arp_proto.h:88
uint32_t PktTraceSize(PktModuleName mod) const
Definition: pkt_handler.h:310
BfdProto * GetBfdProto() const
Definition: agent.h:990
void PktTraceClear(PktModuleName mod)
Definition: pkt_handler.h:303
virtual void Response()
Definition: p/sandesh.h:502
#define IGMP_PROTO_PIM
Definition: igmp_proto.h:17
in_addr_t siaddr
Definition: dhcp_handler.h:223
static std::string & DhcpMsgType(uint32_t msg_type)
#define IGMP_V1_MEMBERSHIP_REPORT
Definition: igmp_proto.h:15
uint32_t sent[MAX_MODULES]
Definition: pkt_handler.h:252
#define IGMP_DWR
Definition: igmp_proto.h:23
std::map< uint32_t, std::string > g_dhcp_msg_types
uint8_t req
Definition: bind_util.h:80
std::set< DnsUpdateIpc *, UpdateCompare > DnsUpdateSet
Definition: dns_proto.h:142
uint32_t send_timer_expired_count
Definition: bfd_session.h:49
uint8_t type
Definition: load_balance.h:109
DhcpProto * GetDhcpProto() const
Definition: agent.h:981
#define DHCPV6_RENEW
Definition: agent.h:358
void FillDnsHdr(dnshdr *dns, DnsHdr &resp, int32_t dnslen)
uint32_t max_retries_exceeded
Definition: arp_proto.h:71
std::string FillOptionInteger(uint32_t data, std::string msg)
#define DHCP_OPTION_SUBNET_MASK
Definition: dhcp_handler.h:17
IgmpProto * GetIgmpProto() const
Definition: agent.h:1002
SessionIndex index
Definition: bfd_common.h:116
int tx_error_count
Definition: bfd_session.h:47
uint32_t icmp_gw_ping
Definition: icmp_proto.h:18
uint64_t bfd_sent
Definition: bfd_proto.h:67
const ArpStats & GetStats() const
Definition: arp_proto.h:154
SandeshResponse * resp_
uint32_t incorrect_mac
Definition: dhcp_proto.h:66
bool SetArpEntry(const ArpKey &key, const ArpEntry *entry)
uint32_t icmpv6_neighbor_advert_unsolicited_
Definition: icmpv6_proto.h:74
std::string FillOptionIp(uint32_t data, std::string msg)
std::string context() const
Definition: p/sandesh.h:311
#define DHCP_ACK
Definition: dhcp_handler.h:187
#define SET_ICMPV6_INTERFACE_STATS(it, list)
int rx_error_count
Definition: bfd_session.h:46
uint64_t bfd_received
Definition: bfd_proto.h:68
uint32_t arp_replies
Definition: arp_proto.h:68
uint8_t type
static BindResolver * Resolver()
Definition: bind_resolver.h:43
dns_flags flags
Definition: bind_util.h:104
uint32_t vrf
Definition: pkt_handler.h:181
uint32_t ActiveSessions() const
Definition: bfd_proto.h:131
#define IGMP_GROUP_LEAVE
Definition: igmp_proto.h:20
#define DHCPV6_DECLINE
virtual BFD::Server * GetServer() const
Definition: bfd_proto.h:84
uint16_t add_rrcount
Definition: bind_util.h:108
uint32_t arp_invalid_vrf
Definition: arp_proto.h:75
#define DHCPV6_OPTION_UNKNOWN
#define DHCPV6_ADVERTISE
#define DHCP_NAK
Definition: dhcp_handler.h:188
void PktTraceIterate(PktModuleName mod, PktTraceCallback cb)
PktHandler * pkt_handler() const
Definition: pkt_init.h:31
#define IGMP_MTRACE_REQUEST
Definition: igmp_proto.h:22
uint32_t bad_interface
Definition: igmp_proto.h:129
std::map< uint32_t, std::string > g_dhcpv6_msg_types
void FillUdpHdr(udphdr *udp, UdpHdr &resp)
#define DHCP_CHADDR_LEN
Definition: dhcp_handler.h:196
static const std::size_t kPktMaxNumBuffers
Definition: pkt_trace.h:16
uint16_t auth_rrcount
Definition: bind_util.h:107
uint8_t GetDscpValue()
uint8_t trunc
Definition: bind_util.h:77
std::set< SessionKey > Sessions
Definition: bfd_server.h:23
uint32_t gmp_sg_del_count_
Definition: gmp_proto.h:138
uint32_t gmp_g_add_count_
Definition: gmp_proto.h:134
uint32_t nh
Definition: pkt_handler.h:189
const Interface * get_interface() const
Definition: arp_entry.h:39
uint16_t FillVrouterHdr(PktTrace::Pkt &pkt, VrouterHdr &resp)
uint8_t cd
Definition: bind_util.h:82
const VnEntry * vn_
Definition: dns_proto.h:125
VnEntry * Find(const boost::uuids::uuid &vn_uuid)
Definition: vn.cc:759
#define DHCP_OPTION_HOST_NAME
Definition: dhcp_handler.h:28
in_addr_t giaddr
Definition: dhcp_handler.h:224
const DhcpStats & GetStats() const
Definition: dhcp_proto.h:116
void PktStatsSandesh(std::string ctxt, bool more)
#define IGMP_PROTO_DVMRP
Definition: igmp_proto.h:16
static uint16_t DnsClass(const std::string &cl)
Definition: bind_util.cc:112
#define DHCP_OPTION_BCAST_ADDRESS
Definition: dhcp_handler.h:44
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
uint8_t hops
Definition: dhcp_handler.h:217
Definition: vn.h:151
void PktTraceBuffers(PktModuleName mod, uint32_t buffers)
Definition: pkt_handler.h:304
const IcmpStats & GetStats() const
Definition: icmp_proto.h:36
const DnsUpdateSet & update_set() const
Definition: dns_proto.h:182
#define DHCPV6_UNKNOWN
void Icmpv6StatsSandesh(std::string ctxt, bool more)
#define DHCP_NAME_LEN
Definition: dhcp_handler.h:197
#define DHCP_FILE_LEN
Definition: dhcp_handler.h:198
uint32_t arp_invalid_address
Definition: arp_proto.h:76
std::string FillOptionString(char *data, int32_t len, std::string msg)
BfdCommunicator & bfd_communicator()
Definition: bfd_proto.h:124
const MetadataStats & metadatastats() const
#define IGMP_MTRACE_RESPONSE
Definition: igmp_proto.h:21
std::string IntToHexString(uint32_t val)
uint16_t remote_port
Definition: bfd_common.h:117
void MetadataHandleRequest(std::string ctxt, bool more)
#define DHCP_DECLINE
Definition: dhcp_handler.h:186
uint32_t rx_badpacket[IGMP_MAX_TYPE]
Definition: igmp_proto.h:49
void ClearStats()
Definition: dns_proto.h:222
DnsProto * GetDnsProto() const
Definition: agent.h:987
#define DHCP_RELEASE
Definition: dhcp_handler.h:189
IcmpProto * GetIcmpProto() const
Definition: agent.h:993
void set_context(std::string context)
Definition: p/sandesh.h:310
static uint32_t get_val(void *data)
void Dhcpv6PktTrace(PktTrace::Pkt &pkt, Dhcpv6PktSandesh *resp)
uint32_t arp_invalid_interface
Definition: arp_proto.h:74
#define DHCP_OPTION_TIME_SERVER
Definition: dhcp_handler.h:20
int FillMacHdr(struct ether_header *eth, MacHdr &resp)
static const uint8_t entries_per_sandesh
uint32_t receive_timer_expired_count
Definition: bfd_session.h:48
uint64_t bfd_rx_ka_enqueue_count
Definition: bfd_proto.h:70
void IcmpPktTrace(PktTrace::Pkt &pkt, IcmpPktSandesh *resp)
uint32_t resolved
Definition: dns_proto.h:113
const VmDataMap & all_vms() const
Definition: dns_proto.h:223
BFDState local_state() const
Definition: bfd_session.cc:143
const Interface * FindInterface(size_t index) const
Definition: interface.cc:323
Icmpv6Proto * icmpv6_proto() const
Definition: agent.h:996
uint32_t requests
Definition: dns_proto.h:112
std::map< ArpKey, ArpEntry * > ArpCache
Definition: arp_proto.h:28
const VmInterfaceMap & vm_interfaces()
Definition: icmpv6_proto.h:108
uint32_t arp_req
Definition: arp_proto.h:67
uint8_t ad
Definition: bind_util.h:83
const std::string & name() const
Definition: interface.h:114
void IgmpStatsSandesh(std::string ctxt, bool more)
void DnsStatsSandesh(std::string ctxt, bool more)
uint8_t data[0]
Definition: dhcp_handler.h:257
static uint16_t DnsType(const std::string &tp)
Definition: bind_util.cc:125
uint32_t cmd_param
Definition: pkt_handler.h:183
#define IGMP_V2_MEMBERSHIP_REPORT
Definition: igmp_proto.h:19
uint32_t dhcp_disabled_drop
Definition: dhcp_proto.h:65
void FillHostRoutes(uint8_t *data, int len, std::string &resp)
const string & GetName() const
Definition: vn.h:162
uint32_t unsupported
Definition: dns_proto.h:115
void SetInterfaceArpStatsEntry(ArpProto::InterfaceArpMap::const_iterator &it, std::vector< InterfaceArpStats > &list)
uint8_t pkt[kPktMaxTraceSize]
Definition: pkt_trace.h:27
uint16_t xid
Definition: bind_util.h:103
BFDStats & Stats()
Definition: bfd_session.h:73
#define DHCP_OPTION_DOMAIN_NAME
Definition: dhcp_handler.h:31
uint32_t icmpv6_neighbor_solicited_
Definition: icmpv6_proto.h:72
#define DHCP_UNKNOWN
Definition: dhcp_handler.h:182
uint16_t cmd
Definition: pkt_handler.h:182
const VrfEntry * vrf
Definition: arp_entry.h:18
uint8_t ret
Definition: bind_util.h:81
#define DHCPV6_RECONFIGURE
void BfdStatsSandesh(std::string ctxt, bool more)
void SandeshError(const std::string &msg, const std::string &context)
Definition: dns_mgr.cc:781
uint8_t rd
Definition: bind_util.h:76
Sessions * GetSessions()
Definition: bfd_server.h:60
PktModule * pkt() const
Definition: agent.cc:965
uint32_t bfd_rx_drop_count
Definition: bfd_proto.h:69
const std::string to_string() const
Definition: bfd_common.h:75
uint8_t hlen
Definition: dhcp_handler.h:216
#define DHCP_OPTION_SERVER_IDENTIFIER
Definition: dhcp_handler.h:70
uint32_t icmp_gw_ping_err
Definition: icmp_proto.h:19
void Icmpv6PktTrace(PktTrace::Pkt &pkt, Icmpv6PktSandesh *resp)
uint16_t ques_rrcount
Definition: bind_util.h:105
std::map< uint32_t, std::string > IpVdnsMap
Definition: dns_proto.h:143
#define DHCPV6_REQUEST
#define DHCPV6_FIXED_LEN
uint8_t file[DHCP_FILE_LEN]
Definition: dhcp_handler.h:227
const MacAddress & mac_address() const
Definition: arp_entry.h:38
#define DHCP_OPTION_CLASSLESS_ROUTE
Definition: dhcp_handler.h:127
#define DHCP_DISCOVER
Definition: dhcp_handler.h:183
#define DHCPV6_RELEASE
void FillIpv4Hdr(struct ip *ip, Ipv4Hdr &resp)
#define IGMP_CISCO_TRACE
Definition: igmp_proto.h:18
static void MacToString(const unsigned char *mac, std::string &mac_str)
void ArpStatsSandesh(std::string ctxt, bool more)
std::map< const VmInterface *, IpVdnsMap > VmDataMap
Definition: dns_proto.h:145
void ArpPktTrace(PktTrace::Pkt &pkt, ArpPktSandesh *resp)
void ClearStats()
Definition: icmp_proto.h:37
#define IGMP_UNDEFINED
Definition: igmp_proto.h:13
virtual void set_more(const bool val)=0
#define DHCP_OPTION_MESSAGE
Definition: dhcp_handler.h:72
uint32_t q_threshold_exceeded[MAX_MODULES]
Definition: pkt_handler.h:254
void FillDhcpv4Hdr(dhcphdr *dhcp, Dhcpv4Hdr &resp, int32_t len)
std::string vdns_name_
Definition: dns_proto.h:128
#define DHCPV6_REBIND
#define DHCPV6_INFORMATION_REQUEST
const GmpStats & GetStats() const
Definition: gmp_proto.h:178
std::size_t GetArpCacheSize()
Definition: arp_proto.h:102
std::set< DnsFipEntryPtr, DnsFipEntryCmp > DnsFipSet
Definition: dns_proto.h:138
void DnsPktTrace(PktTrace::Pkt &pkt, DnsPktSandesh *resp)
#define DHCP_OPTION_ROUTER
Definition: dhcp_handler.h:19
void FillDhcpv6Hdr(Dhcpv6Hdr *dhcp, Dhcpv6Header &resp, int32_t len)
#define IGMP_MEMBERSHIP_QUERY
Definition: igmp_proto.h:14
in_addr_t ip
Definition: arp_entry.h:17
GmpProto * GetGmpProto()
Definition: igmp_proto.h:153
uint32_t received[MAX_MODULES]
Definition: pkt_handler.h:253