13 boost::asio::io_context &io)
22 uint8_t len = ntohs(
pkt_info_->transp.udp->len) - 8;
23 uint8_t *data =
new uint8_t[len];
25 boost::asio::const_buffer buffer(boost::asio::buffer(data, len));
27 boost::system::error_code ec;
28 boost::asio::ip::udp::endpoint local_endpoint(
pkt_info_->ip_daddr,
30 boost::asio::ip::udp::endpoint remote_endpoint(
pkt_info_->ip_saddr,
34 buffer, local_endpoint, remote_endpoint,
51 const boost::asio::ip::udp::endpoint &local_endpoint,
52 const boost::asio::ip::udp::endpoint &remote_endpoint,
53 uint32_t interface_id,
const boost::asio::mutable_buffer &packet,
66 uint16_t buf_len =
pkt_info_->packet_buffer()->data_len();
67 char *ptr = (
char *)
pkt_info_->packet_buffer()->data();
68 memset(ptr, 0, buf_len);
69 pkt_info_->eth = (
struct ether_header *)ptr;
72 bool is_v4 = local_endpoint.address().is_v4();
75 uint8_t *data = boost::asio::buffer_cast<uint8_t *>(packet);
76 uint16_t eth_proto = is_v4 ? ETHERTYPE_IP : ETHERTYPE_IPV6;
78 GetMacIpLearningTable()->GetPairedMacAddress(
82 remote_endpoint.address());
85 mac = vm_interface->
vm_mac();
88 len +=
EthHdr(ptr + len, buf_len - len,
94 uint16_t ip_len =
sizeof(
struct ip) + sizeof(udphdr) + packet_length;
95 len +=
IpHdr(ptr + len, buf_len - len, ip_len,
96 htonl(local_endpoint.address().to_v4().to_ulong()),
97 htonl(remote_endpoint.address().to_v4().to_ulong()),
99 memcpy(ptr + len +
sizeof(udphdr), data, packet_length);
100 len +=
UdpHdr((udphdr *)(ptr + len), buf_len - len,
101 sizeof(udphdr) + packet_length,
102 htonl(local_endpoint.address().to_v4().to_ulong()),
103 local_endpoint.port(),
104 htonl(remote_endpoint.address().to_v4().to_ulong()),
105 remote_endpoint.port());
107 pkt_info_->ip6 = (
struct ip6_hdr *)(ptr + len);
108 Ip6Hdr((ip6_hdr *)(ptr + len),
109 sizeof(udphdr) + packet_length,
111 local_endpoint.address().to_v6().to_bytes().data(),
112 remote_endpoint.address().to_v6().to_bytes().data());
113 len +=
sizeof(ip6_hdr);
114 memcpy(ptr + len +
sizeof(udphdr), data, packet_length);
115 pkt_info_->transp.udp = (
struct udphdr *)(ptr + len);
116 UdpHdr((udphdr *)(ptr + len),
sizeof(udphdr) + packet_length,
117 local_endpoint.address().to_v6().to_bytes().data(),
118 local_endpoint.port(),
119 remote_endpoint.address().to_v6().to_bytes().data(),
120 remote_endpoint.port(), IPPROTO_UDP);
121 len +=
sizeof(udphdr);
124 len += packet_length;
130 const uint8_t *p = boost::asio::buffer_cast<
const uint8_t *>(packet);
const MacAddress & vm_mac() const
MacLearningProto * mac_learning_proto() const
InterfaceTable * interface_table() const
boost::shared_ptr< PktInfo > pkt_info_
uint16_t tx_vlan_id() const
int EthHdr(const MacAddress &src, const MacAddress &dest, const uint16_t proto)
BfdProto * GetBfdProto() const
void HandleReceiveSafe(boost::asio::const_buffer pkt, const boost::asio::ip::udp::endpoint &local_endpoint, const boost::asio::ip::udp::endpoint &remote_endpoint, const BFD::SessionIndex &session_index, uint8_t pkt_len, boost::system::error_code ec)
uint32_t GetInterfaceIndex() const
void Send(uint32_t itf, uint32_t vrf, uint16_t, PktHandler::PktModuleName)
BfdHandler(Agent *agent, boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
const uint32_t vrf_id() const
void Ip6Hdr(ip6_hdr *ip, uint16_t plen, uint8_t next_header, uint8_t hlim, uint8_t *src, uint8_t *dest)
void UdpHdr(uint16_t len, in_addr_t src, uint16_t src_port, in_addr_t dest, uint16_t dest_port)
const Interface * FindInterface(size_t index) const
static const uint32_t kInvalidIndex
void SendPacket(const boost::asio::ip::udp::endpoint &local_endpoint, const boost::asio::ip::udp::endpoint &remote_endpoint, uint32_t interface_id, const boost::asio::mutable_buffer &packet, int packet_length)
void IpHdr(uint16_t len, in_addr_t src, in_addr_t dest, uint8_t protocol, uint16_t id, uint8_t ttl)