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