5 #ifndef vnsw_agent_pkt_handler_hpp
6 #define vnsw_agent_pkt_handler_hpp
9 #include <sys/socket.h>
10 #include <netinet/if_ether.h>
11 #include <netinet/ip.h>
12 #include <netinet/ip6.h>
13 #include <netinet/ip_icmp.h>
14 #include <netinet/igmp.h>
16 #include <tbb/atomic.h>
17 #include <boost/array.hpp>
28 #define DNS_SERVER_PORT 53
29 #define DHCP_SERVER_PORT 67
30 #define DHCP_CLIENT_PORT 68
31 #define DHCPV6_SERVER_PORT 547
32 #define DHCPV6_CLIENT_PORT 546
33 #define BFD_SINGLEHOP_CONTROL_PORT 3784
34 #define BFD_ECHO_PORT 3785
35 #define BFD_MULTIHOP_CONTROL_PORT 4784
36 #define VXLAN_UDP_DEST_PORT 4789
37 #define IANA_MPLS_OVER_UDP_DEST_PORT 6635
38 #define MPLS_OVER_UDP_DEST_PORT 51234
41 #define ARP_TX_BUFF_LEN 128
42 #define IPC_HDR_LEN (sizeof(struct ether_header) + sizeof(struct agent_hdr))
43 #define VLAN_PROTOCOL 0x8100
44 #define DEFAULT_IP_TTL 64
46 #define BGP_SERVICE_TTL_REV_FLOW 2
47 #define BGP_SERVICE_TTL_FWD_FLOW 255
48 #define DEFAULT_IP_ID 0
49 #define VLAN_HDR_LEN 4
51 #define ICMP_UNREACH_HDR_LEN 8
53 #define ETHERTYPE_QINQ 0x88A8
54 #define ETHERTYPE_PBB 0x88E7
55 #define PBB_HEADER_LEN 4
152 INVALID = MAX_AGENT_HDR_COMMANDS
166 AgentHdr(uint32_t ifindex_p, uint32_t vrf_p, uint16_t cmd_p) :
171 AgentHdr(uint32_t ifindex_p, uint32_t vrf_p, uint16_t cmd_p,
172 uint32_t param1, uint32_t param2) :
226 typedef boost::function<bool(boost::shared_ptr<PktInfo>)>
RcvQueueFunc;
292 bool ProcessPacket(boost::shared_ptr<PacketBufferEnqueueItem> item);
334 boost::shared_ptr<PktInfo> pkt_info, uint8_t *pkt);
boost::asio::ip::address IpAddress
uint32_t EncapHeaderLen() const
int ParseMplsHdr(PktInfo *pkt_info, uint8_t *pkt)
bool IgnoreFragmentedPacket(PktInfo *pkt_info)
bool IsManagedTORPacket(Interface *intf, PktInfo *pkt_info, PktType::Type &pkt_type, uint8_t *pkt, bool *pkt_ok)
int ParseUDPTunnels(PktInfo *pkt_info, uint8_t *pkt)
int ParseControlWord(PktInfo *pkt_info, uint8_t *pkt, const MplsLabel *mpls)
uint64_t GetBfdKaEnqueueCount()
WorkQueue< boost::shared_ptr< PacketBufferEnqueueItem > > PktHandlerQueue
void PktTraceClear(PktModuleName mod)
uint32_t PktTraceBuffers(PktModuleName mod) const
int ParseVxlan(PktInfo *pkt_info, uint8_t *pkt)
int ParseUdp(PktInfo *pkt_info, uint8_t *pkt)
void SetOuterMac(PktInfo *pkt_info)
void PktModuleEnqueue(PktModuleName mod, const AgentHdr &hdr, boost::shared_ptr< PktInfo > pkt_info, uint8_t *pkt)
void Send(const AgentHdr &hdr, const PacketBufferPtr &buff)
PktModuleName ParseBfdDataPacket(const AgentHdr &hdr, PktInfo *pkt_info, uint8_t *pkt)
const PktStats & GetStats() const
bool IsGwPacket(const Interface *intf, const IpAddress &dst_ip)
int ParseEthernetHeader(PktInfo *pkt_info, uint8_t *pkt)
uint64_t GetPktEnqueueCount()
Proto * bfd_keepalive_proto_
bool IsSegmentHealthCheckPacket(const PktInfo *pkt_info, const Interface *interface)
DISALLOW_COPY_AND_ASSIGN(PktHandler)
PktHandlerQueue work_queue_bfd_ka_
void CalculatePortIP(PktInfo *pkt_info)
void SetOuterIp(PktInfo *pkt_info, uint8_t *pkt)
bool ValidateIpPacket(PktInfo *pkt_info)
void PktTraceBuffers(PktModuleName mod, uint32_t buffers)
boost::function< void(PktTrace::Pkt &)> PktTraceCallback
bool IsValidInterface(uint32_t ifindex, Interface **interface)
int ParseIpPacket(PktInfo *pkt_info, PktType::Type &pkt_type, uint8_t *ptr)
static const uint32_t kMulticastControlWord
int ParseMPLSoUDP(PktInfo *pkt_info, uint8_t *pkt)
bool IsBFDHealthCheckPacket(const PktInfo *pkt_info, const Interface *interface)
int ParseMPLSoGRE(PktInfo *pkt_info, uint8_t *pkt)
boost::function< bool(boost::shared_ptr< PktInfo >)> RcvQueueFunc
void HandleRcvPkt(const AgentHdr &hdr, const PacketBufferPtr &buff)
bool IsDiagPacket(PktInfo *pkt_info)
void AddPktTrace(PktModuleName module, PktTrace::Direction dir, const PktInfo *pkt)
void Enqueue(PktModuleName module, boost::shared_ptr< PktInfo > pkt_info)
int ParseUserPkt(PktInfo *pkt_info, Interface *intf, PktType::Type &pkt_type, uint8_t *pkt)
boost::array< PktTrace, MAX_MODULES > pkt_trace_
PktHandler(Agent *, PktModule *pkt_module)
boost::array< Proto *, MAX_MODULES > proto_list_
bool ComputeForwardingMode(PktInfo *pkt_info, const Interface *intf) const
void SendMessage(PktModuleName mod, InterTaskMsg *msg)
bool ProcessPacket(boost::shared_ptr< PacketBufferEnqueueItem > item)
PktModuleName ParsePacket(const AgentHdr &hdr, PktInfo *pkt_info, uint8_t *pkt)
void Register(PktModuleName type, RcvQueueFunc cb)
DBTableBase::ListenerId iid_
static const uint32_t kMulticastControlWordSize
uint32_t PktTraceSize(PktModuleName mod) const
bool ProcessBfdDataPacket(boost::shared_ptr< PacketBufferEnqueueItem > item)
bool IsToRDevice(uint32_t vrf_id, const IpAddress &ip)
PktHandlerQueue work_queue_
bool IsDHCPPacket(PktInfo *pkt_info)
PktModule * pkt_module() const
bool IsFlowPacket(PktInfo *pkt_info)
const PktHandlerQueue * work_queue() const
void PktTraceIterate(PktModuleName mod, PktTraceCallback cb)
size_t NumEnqueues() const
boost::shared_ptr< PacketBuffer > PacketBufferPtr
boost::shared_ptr< PktInfo > PktInfoPtr
AgentHdr(uint32_t ifindex_p, uint32_t vrf_p, uint16_t cmd_p)
AgentHdr(uint32_t ifindex_p, uint32_t vrf_p, uint16_t cmd_p, uint32_t param1, uint32_t param2)
InterTaskMsg(uint16_t command)
PacketBufferEnqueueItem(const AgentHdr &h, const PacketBufferPtr &b)
const PacketBufferPtr buff
void PktRcvd(PktModuleName mod)
uint32_t sent[MAX_MODULES]
uint32_t received[MAX_MODULES]
void PktQThresholdExceeded(PktModuleName mod)
uint32_t q_threshold_exceeded[MAX_MODULES]
void PktSent(PktModuleName mod)
PktInfo(Agent *agent, uint32_t buff_len, PktHandler::PktModuleName module, uint32_t mdata)
void reset_packet_buffer()
IpAddress ip_ff_src_prefix
std::size_t hash(const Agent *agent, const EcmpLoadBalance &ecmp_has_fields_to_use) const
bool is_fat_flow_dst_prefix
PacketBufferPtr packet_buffer_ptr() const
void AllocPacketBuffer(Agent *agent, uint32_t module, uint16_t len, uint32_t mdata)
uint32_t GetUdpPayloadLength() const
struct ether_header * eth
PacketBuffer * packet_buffer() const
bool is_fat_flow_src_prefix
IpAddress ip_ff_dst_prefix
PacketBufferPtr packet_buffer_
void set_len(uint32_t len)
const AgentHdr & GetAgentHdr() const
PktHandler::PktModuleName module
VmInterface::FatFlowIgnoreAddressType ignore_address
struct ether_header * eth