OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
diag_pkt_handler.h
Go to the documentation of this file.
1 /*
2  * * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved.
3  * */
4 #ifndef vnsw_agent_diag_diag_pkt_handler_hpp
5 #define vnsw_agent_diag_diag_pkt_handler_hpp
6 
7 #include <boost/date_time/posix_time/posix_time.hpp>
8 #include <base/logging.h>
9 #include <base/address.h>
10 #include <base/timer.h>
11 
12 #include <cmn/agent_cmn.h>
13 #include <cmn/agent.h>
14 
15 struct AgentDiagPktData;
16 struct OverlayOamPktData;
17 struct PktInfo;
18 
19 // Pseudo header for TCP checksum
20 struct PseudoTcpHdr {
21  in_addr_t src;
22  in_addr_t dest;
23  uint8_t res;
24  uint8_t prot;
25  uint16_t len;
26  PseudoTcpHdr(in_addr_t s, in_addr_t d, uint16_t l) :
27  src(s), dest(d), res(0), prot(6), len(l) { }
28 };
29 
30 class DiagPktHandler : public ProtoHandler {
31 public:
32  static const uint8_t icmp_payload_len = 128;
33  DiagPktHandler(Agent *agent, boost::shared_ptr<PktInfo> info,
34  boost::asio::io_context &io) :
35  ProtoHandler(agent, info, io), done_(false),
36  diag_table_(agent->diag_table()) {}
37  virtual bool Run();
38  void SetReply();
39  void SetDiagChkSum();
40  void SetDiagChkSumV6();
41  void Reply();
42  void SendOverlayResponse();
43  const std::string &GetAddress() const { return address_; }
44  uint8_t* GetData() {
45  return (pkt_info_->data);
46  }
47  bool IsDone() const { return done_; }
48  void set_done(bool done) { done_ = done; }
49  void TcpHdr(in_addr_t, uint16_t, in_addr_t, uint16_t, bool , uint32_t, uint16_t);
50  void TcpHdr(uint16_t len, const uint8_t *src, uint16_t sport,
51  const uint8_t *dest, uint16_t dport, bool is_syn,
52  uint32_t seq_no, uint8_t next_hdr);
53 private:
54  bool IsTraceRoutePacket();
55  bool IsOverlayPingPacket();
56  void SetReturnCode(OverlayOamPktData *oamdata);
61  bool ParseIcmpData(const uint8_t *data, uint16_t data_len,
62  uint16_t *key, bool is_v4);
63  uint16_t TcpCsum(in_addr_t, in_addr_t, uint16_t , tcphdr *);
64  void Swap();
65  void TunnelHdrSwap();
66  void SwapL4();
67  void Swapv6L4();
68  void SwapIpHdr();
69  void SwapIp6Hdr();
70  void SwapEthHdr();
71  void BuildReply();
73 
74  bool done_;
76  std::string address_;
77 };
78 
79 #endif
void SendTimeExceededV6Packet()
void SetDiagChkSumV6()
in_addr_t dest
void set_done(bool done)
DiagPktHandler(Agent *agent, boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
PseudoTcpHdr(in_addr_t s, in_addr_t d, uint16_t l)
Agent * agent() const
Definition: proto_handler.h:80
boost::shared_ptr< PktInfo > pkt_info_
Definition: proto_handler.h:92
DiagTable * diag_table_
std::string address_
void SendTimeExceededPacket()
Definition: agent.h:358
void SegmentHealthCheckReply()
uint16_t TcpCsum(in_addr_t, in_addr_t, uint16_t, tcphdr *)
uint8_t * GetData()
void TcpHdr(in_addr_t, uint16_t, in_addr_t, uint16_t, bool, uint32_t, uint16_t)
void SetReturnCode(OverlayOamPktData *oamdata)
bool IsOverlayPingPacket()
bool HandleTraceRoutePacket()
bool ParseIcmpData(const uint8_t *data, uint16_t data_len, uint16_t *key, bool is_v4)
bool HandleTraceRouteResponse()
static const uint8_t icmp_payload_len
bool IsDone() const
virtual bool Run()
const std::string & GetAddress() const