14 #include "diag/diag_types.h"
19 using namespace boost::posix_time;
22 DiagEntry(ping_req->get_source_ip(), ping_req->get_dest_ip(),
23 ping_req->get_protocol(), ping_req->get_source_port(),
24 ping_req->get_dest_port(), ping_req->get_vrf_name(),
25 ping_req->get_interval() * 100, ping_req->get_count(), diag_table),
26 data_len_(ping_req->get_packet_size()), context_(ping_req->context()),
39 ad->
rtt_ = microsec_clock::universal_time();
51 boost::shared_ptr<PktInfo> pkt_info(
new PktInfo(agent,
len_,
53 uint8_t *msg = pkt_info->packet_buffer()->data();
69 pkt_info->UpdateHeaderPtr();
71 htonl(
dip_.to_v4().to_ulong()),
dport_,
false, rand(),
74 ntohl(
sip_.to_v4().to_ulong()),
75 ntohl(
dip_.to_v4().to_ulong()), IPPROTO_TCP,
80 pkt_info->eth = (
struct ether_header *)(pkt_info->pkt);
81 pkt_info->ip6 = (
struct ip6_hdr *)(pkt_info->eth + 1);
82 pkt_info->transp.tcp = (
struct tcphdr *)(pkt_info->ip6 + 1);
84 (uint8_t *)
sip_.to_v6().to_string().c_str(),
sport_,
85 (uint8_t *)
dip_.to_v6().to_string().c_str(),
dport_,
86 false, rand(), IPPROTO_TCP);
87 pkt_handler->
Ip6Hdr(pkt_info->ip6,
88 data_len_ +
sizeof(tcphdr) +
sizeof(
struct ip6_hdr),
90 sip_.to_v6().to_bytes().data(),
91 dip_.to_v6().to_bytes().data());
107 boost::shared_ptr<PktInfo> pkt_info(
new PktInfo(agent,
len_,
109 uint8_t *msg = pkt_info->packet_buffer()->data();
110 memset(msg, 0,
len_);
126 pkt_info->UpdateHeaderPtr();
129 pkt_handler->
IpHdr(
data_len_ +
sizeof(udphdr) +
sizeof(
struct ip),
130 ntohl(
sip_.to_v4().to_ulong()),
131 ntohl(
dip_.to_v4().to_ulong()), IPPROTO_UDP,
136 pkt_info->eth = (
struct ether_header *)(pkt_info->pkt);
137 pkt_info->ip6 = (
struct ip6_hdr *)(pkt_info->eth + 1);
138 pkt_info->transp.udp = (
struct udphdr *)(pkt_info->ip6 + 1);
143 pkt_handler->
Ip6Hdr(pkt_info->ip6,
144 data_len_ +
sizeof(udphdr) +
sizeof(
struct ip6_hdr),
146 sip_.to_v6().to_bytes().data(),
147 dip_.to_v6().to_bytes().data());
203 PingResp *resp =
new PingResp();
205 resp->set_resp(
"Timed Out");
206 resp->set_seq_no(seqno);
208 resp->set_more(
true);
213 std::ostringstream td_str;
216 td_str << td.minutes() <<
"m " << td.seconds() <<
"s";
217 }
else if (td.total_milliseconds()) {
218 td_str << td.total_milliseconds() <<
"ms";
219 }
else if (td.total_microseconds()) {
220 td_str << td.total_microseconds() <<
"us";
222 td_str << td.total_nanoseconds() <<
"ns";
230 PingResp *resp =
new PingResp();
233 resp->set_seq_no(ntohl(ad->
seq_no_));
236 time_duration rtt = microsec_clock::universal_time() - ad->
rtt_;
240 resp->set_rtt(rtt_str);
242 resp->set_resp(
"Success");
244 resp->set_more(
true);
249 PingSummaryResp *resp =
new PingSummaryResp();
255 std::string avg_rtt_string;
257 resp->set_average_rtt(avg_rtt_string);
260 resp->set_request_sent(
seq_no_);
263 resp->set_pkt_loss(pkt_loss_percent);
268 void PingReq::HandleRequest()
const {
270 boost::system::error_code ec;
274 IpAddress sip(IpAddress::from_string(get_source_ip(), ec));
276 err_str =
"Invalid source IP";
280 IpAddress dip(IpAddress::from_string(get_dest_ip(), ec));
282 err_str =
"Invalid destination IP";
286 uint8_t proto = get_protocol();
287 if (proto != IPPROTO_TCP && proto != IPPROTO_UDP) {
288 err_str =
"Invalid protocol. Valid Protocols are TCP and UDP";
293 err_str =
"Invalid VRF";
310 err_str =
"VM not present on this server";
319 PingErrResp *resp =
new PingErrResp;
320 resp->set_error_response(err_str);
321 resp->set_context(context());
const Interface * GetInterface() const
DiagPktHandler * CreateUdpPkt(Agent *agent)
uint32_t GetMaxAttempts()
static Agent * GetInstance()
VrfEntry * FindVrfFromName(const string &name)
const uint32_t id() const
boost::posix_time::ptime rtt_
const Interface * vhost_interface() const
boost::asio::ip::address IpAddress
static const MacAddress & vrrp_mac()
void set_len(uint32_t len)
InetUnicastRouteEntry * FindRoute(const IpAddress &ip)
const MacAddress & mac() const
static const uint32_t KPing6TcpHdr
static const uint32_t KPingTcpHdr
Base class for all Route entries in agent.
InetUnicastAgentRouteTable * GetInet4UnicastRouteTable(const std::string &vrf_name)
int EthHdr(const MacAddress &src, const MacAddress &dest, const uint16_t proto)
static const uint32_t KPingUdpHdr
Ping(const PingReq *pr, DiagTable *diag_table)
const NextHop * GetActiveNextHop() const
EventManager * event_manager() const
void Send(uint32_t itf, uint32_t vrf, uint16_t, PktHandler::PktModuleName)
PktInfo * pkt_info() const
const uint32_t vrf_id() const
void TcpHdr(in_addr_t, uint16_t, in_addr_t, uint16_t, bool, uint32_t, uint16_t)
void Ip6Hdr(ip6_hdr *ip, uint16_t plen, uint8_t next_header, uint8_t hlim, uint8_t *src, uint8_t *dest)
virtual void HandleReply(DiagPktHandler *handler)
VrfTable * vrf_table() const
DiagPktHandler * CreateTcpPkt(Agent *agent)
void time_duration_to_string(time_duration &td, std::string &str)
void UdpHdr(uint16_t len, in_addr_t src, uint16_t src_port, in_addr_t dest, uint16_t dest_port)
virtual void RequestTimedOut(uint32_t seq_no)
boost::posix_time::time_duration avg_rtt_
virtual void SendRequest()
static const uint32_t KPing6UdpHdr
InetUnicastAgentRouteTable * GetInet6UnicastRouteTable(const std::string &vrf_name)
void FillAgentHeader(AgentDiagPktData *pkt)
void IpHdr(uint16_t len, in_addr_t src, in_addr_t dest, uint8_t protocol, uint16_t id, uint8_t ttl)
virtual void SendSummary()