6 #include <netinet/udp.h>
12 #include "diag/diag_types.h"
19 using namespace boost::posix_time;
22 DiagEntry(traceroute_req->get_source_ip(), traceroute_req->get_dest_ip(),
23 traceroute_req->get_protocol(), traceroute_req->get_source_port(),
24 traceroute_req->get_dest_port(),
Agent::GetInstance()->fabric_vrf_name(),
25 traceroute_req->get_interval() * 100,traceroute_req->get_max_attempts(), diag_table),
27 remote_vm_mac_(traceroute_req->get_vm_remote_mac()), ttl_(2),
28 max_ttl_(traceroute_req->get_max_hops()),
29 context_(traceroute_req->context()) {
43 boost::system::error_code ec;
44 uint8_t data_len = 50;
60 boost::shared_ptr<PktInfo> pkt_info(
new PktInfo(agent,
len_,
62 uint8_t *buf = pkt_info->packet_buffer()->data();
67 boost::posix_time::ptime senttime = microsec_clock::universal_time();
72 pkt_info->eth = (
struct ether_header *)(buf);
75 pkt_info->ip = (
struct ip *)(pkt_info->eth +1);
76 pkt_info->transp.udp = (
struct udphdr *)(pkt_info->ip + 1);
78 len = data_len+2 *
sizeof(udphdr)+
sizeof(
VxlanHdr)+
79 sizeof(
struct ip) + sizeof(struct ether_header);
83 pkt_handler->
IpHdr(len +
sizeof(
struct ip), ntohl(tunnelsrc.to_ulong()),
84 ntohl(tunneldst.to_ulong()), IPPROTO_UDP,
88 + sizeof(struct ether_header));
89 vxlanhdr->
vxlan_id = ntohl(vxlan_id << 8);
93 pkt_info->eth = (
struct ether_header *)(vxlanhdr + 1);
98 pkt_info->ip = (
struct ip *)(pkt_info->eth +1);
99 Ip4Address dip = Ip4Address::from_string(
"127.0.0.1", ec);
100 pkt_info->transp.udp = (
struct udphdr *)(pkt_info->ip + 1);
101 len = data_len+
sizeof(
struct udphdr);
104 pkt_handler->
IpHdr(len +
sizeof(
struct ip), ntohl(
sip_.to_v4().to_ulong()),
105 ntohl(dip.to_ulong()),
proto_,
120 void OverlayTraceReq::HandleRequest()
const {
122 boost::system::error_code ec;
128 IpAddress sip(IpAddress::from_string(get_source_ip(), ec));
130 err_str =
"Invalid source IP";
135 err_str =
"V6 is not supported";
139 IpAddress dip(IpAddress::from_string(get_dest_ip(), ec));
141 err_str =
"Invalid destination IP";
146 err_str =
"V6 is not supported";
150 uint8_t proto = get_protocol();
151 if (proto != IPPROTO_TCP && proto != IPPROTO_UDP) {
152 err_str =
"Invalid protocol - Supported protocols are TCP & UDP";
158 err_str =
"Invalid VN segment";
166 err_str =
"Invalid vxlan segment";
171 get_vm_remote_mac(), agent);
173 err_str =
"Invalid remote mac";
179 overlaytraceroute->
Init();
184 TraceRouteErrResp *resp =
new TraceRouteErrResp;
185 resp->set_error_response(err_str);
186 resp->set_context(context());
uint32_t GetMaxAttempts()
static Agent * GetInstance()
static boost::uuids::uuid StringToUuid(const std::string &str)
VrfEntry * fabric_vrf() const
static const uint32_t kVxlanRABit
const Interface * vhost_interface() const
boost::asio::ip::address IpAddress
void set_len(uint32_t len)
InterfaceTable * interface_table() const
const Ip4Address * GetDip() const
VnTable * vn_table() const
const MacAddress & mac() const
std::string ToString() const
void RequestTimedOut(uint32_t seqno)
void FillOamPktHeader(OverlayOamPktData *pktdata, uint32_t vxlan_id, const boost::posix_time::ptime &time)
const AgentPath * GetActivePath() const
NextHop * nexthop() const
int EthHdr(const MacAddress &src, const MacAddress &dest, const uint16_t proto)
OverlayTraceRoute(const OverlayTraceReq *req, DiagTable *diag_table)
#define VXLAN_UDP_DEST_PORT
virtual ~OverlayTraceRoute()
const std::string & fabric_interface_name() const
Ip4Address router_id() const
EventManager * event_manager() const
void Send(uint32_t itf, uint32_t vrf, uint16_t, PktHandler::PktModuleName)
virtual void HandleReply(DiagPktHandler *handler)
static const MacAddress in_dst_mac_
const Ip4Address * GetSip() const
AgentDBEntry * Find(const DBEntry *key, bool ret_del)
PktInfo * pkt_info() const
boost::uuids::uuid vn_uuid_
MacAddress remote_vm_mac_
const uint32_t vrf_id() const
VnEntry * Find(const boost::uuids::uuid &vn_uuid)
boost::asio::ip::address_v4 Ip4Address
uint32_t HashValUdpSourcePort()
static const uint32_t kVxlanIBit
virtual void SendRequest()
VxLanId * Find(uint32_t vxlan_id)
VxLanTable * vxlan_table() const
void UdpHdr(uint16_t len, in_addr_t src, uint16_t src_port, in_addr_t dest, uint16_t dest_port)
static void SendSandeshReply(const std::string &address, const std::string &context, bool more)
const MacAddress * GetDmac() const
static const uint32_t kOverlayUdpHdrLength
static BridgeRouteEntry * L2RouteGet(VxLanId *vxlan, string remotemac, Agent *agent)
static const MacAddress in_source_mac_
void IpHdr(uint16_t len, in_addr_t src, in_addr_t dest, uint8_t protocol, uint16_t id, uint8_t ttl)