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
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::function< void(PktTrace::Pkt &)> PktTraceCallback
PacketBuffer * packet_buffer() const
bool IsSegmentHealthCheckPacket(const PktInfo *pkt_info, const Interface *interface)
int ParseVxlan(PktInfo *pkt_info, uint8_t *pkt)
void AllocPacketBuffer(Agent *agent, uint32_t module, uint16_t len, uint32_t mdata)
boost::shared_ptr< PacketBuffer > PacketBufferPtr
bool is_fat_flow_src_prefix
void Enqueue(PktModuleName module, boost::shared_ptr< PktInfo > pkt_info)
int ParseEthernetHeader(PktInfo *pkt_info, uint8_t *pkt)
void SendMessage(PktModuleName mod, InterTaskMsg *msg)
void SetOuterIp(PktInfo *pkt_info, uint8_t *pkt)
DBTableBase::ListenerId iid_
static const uint32_t kMulticastControlWord
PacketBufferPtr packet_buffer_ptr() const
PktHandler::PktModuleName module
int ParseUserPkt(PktInfo *pkt_info, Interface *intf, PktType::Type &pkt_type, uint8_t *pkt)
boost::asio::ip::address IpAddress
struct ether_header * eth
IpAddress ip_ff_src_prefix
PktInfo(Agent *agent, uint32_t buff_len, PktHandler::PktModuleName module, uint32_t mdata)
void set_len(uint32_t len)
bool IsToRDevice(uint32_t vrf_id, const IpAddress &ip)
void PktSent(PktModuleName mod)
void PktRcvd(PktModuleName mod)
InterTaskMsg(uint16_t command)
struct ether_header * eth
const PktStats & GetStats() const
void Register(PktModuleName type, RcvQueueFunc cb)
const PacketBufferPtr buff
bool ProcessBfdDataPacket(boost::shared_ptr< PacketBufferEnqueueItem > item)
uint64_t GetBfdKaEnqueueCount()
boost::function< bool(boost::shared_ptr< PktInfo >)> RcvQueueFunc
void AddPktTrace(PktModuleName module, PktTrace::Direction dir, const PktInfo *pkt)
PacketBufferPtr packet_buffer_
PktHandlerQueue work_queue_
WorkQueue< boost::shared_ptr< PacketBufferEnqueueItem > > PktHandlerQueue
bool IsDHCPPacket(PktInfo *pkt_info)
uint32_t PktTraceSize(PktModuleName mod) const
int ParseMplsHdr(PktInfo *pkt_info, uint8_t *pkt)
void PktTraceClear(PktModuleName mod)
void SetOuterMac(PktInfo *pkt_info)
uint32_t sent[MAX_MODULES]
PacketBufferEnqueueItem(const AgentHdr &h, const PacketBufferPtr &b)
uint64_t GetPktEnqueueCount()
bool IsManagedTORPacket(Interface *intf, PktInfo *pkt_info, PktType::Type &pkt_type, uint8_t *pkt, bool *pkt_ok)
PktHandler(Agent *, PktModule *pkt_module)
IpAddress ip_ff_dst_prefix
bool IsBFDHealthCheckPacket(const PktInfo *pkt_info, const Interface *interface)
static const uint32_t kMulticastControlWordSize
int ParseMPLSoGRE(PktInfo *pkt_info, uint8_t *pkt)
AgentHdr(uint32_t ifindex_p, uint32_t vrf_p, uint16_t cmd_p, uint32_t param1, uint32_t param2)
bool IsGwPacket(const Interface *intf, const IpAddress &dst_ip)
bool IsValidInterface(uint32_t ifindex, Interface **interface)
void PktTraceIterate(PktModuleName mod, PktTraceCallback cb)
bool IsDiagPacket(PktInfo *pkt_info)
void Send(const AgentHdr &hdr, const PacketBufferPtr &buff)
bool ProcessPacket(boost::shared_ptr< PacketBufferEnqueueItem > item)
PktModuleName ParsePacket(const AgentHdr &hdr, PktInfo *pkt_info, uint8_t *pkt)
PktModule * pkt_module() const
bool ValidateIpPacket(PktInfo *pkt_info)
AgentHdr(uint32_t ifindex_p, uint32_t vrf_p, uint16_t cmd_p)
void PktTraceBuffers(PktModuleName mod, uint32_t buffers)
uint32_t GetUdpPayloadLength() const
const AgentHdr & GetAgentHdr() const
int ParseMPLSoUDP(PktInfo *pkt_info, uint8_t *pkt)
void reset_packet_buffer()
bool IgnoreFragmentedPacket(PktInfo *pkt_info)
void CalculatePortIP(PktInfo *pkt_info)
PktModuleName ParseBfdDataPacket(const AgentHdr &hdr, PktInfo *pkt_info, uint8_t *pkt)
void PktQThresholdExceeded(PktModuleName mod)
DISALLOW_COPY_AND_ASSIGN(PktHandler)
int ParseUdp(PktInfo *pkt_info, uint8_t *pkt)
const PktHandlerQueue * work_queue() const
Proto * bfd_keepalive_proto_
size_t NumEnqueues() const
boost::array< Proto *, MAX_MODULES > proto_list_
boost::array< PktTrace, MAX_MODULES > pkt_trace_
uint32_t PktTraceBuffers(PktModuleName mod) const
bool is_fat_flow_dst_prefix
uint32_t EncapHeaderLen() const
int ParseControlWord(PktInfo *pkt_info, uint8_t *pkt, const MplsLabel *mpls)
VmInterface::FatFlowIgnoreAddressType ignore_address
void PktModuleEnqueue(PktModuleName mod, const AgentHdr &hdr, boost::shared_ptr< PktInfo > pkt_info, uint8_t *pkt)
PktHandlerQueue work_queue_bfd_ka_
bool ComputeForwardingMode(PktInfo *pkt_info, const Interface *intf) const
std::size_t hash(const Agent *agent, const EcmpLoadBalance &ecmp_has_fields_to_use) const
bool IsFlowPacket(PktInfo *pkt_info)
int ParseUDPTunnels(PktInfo *pkt_info, uint8_t *pkt)
uint32_t q_threshold_exceeded[MAX_MODULES]
void HandleRcvPkt(const AgentHdr &hdr, const PacketBufferPtr &buff)
boost::shared_ptr< PktInfo > PktInfoPtr
int ParseIpPacket(PktInfo *pkt_info, PktType::Type &pkt_type, uint8_t *ptr)
uint32_t received[MAX_MODULES]