5 #include <netinet/icmp6.h>
21 boost::shared_ptr<PktInfo> info,
22 boost::asio::io_context *io) :
30 if (
pkt_info_->len < (
sizeof(
struct ether_header) +
sizeof(
struct ip6_hdr)))
56 uint16_t buff_len =
pkt_info_->packet_buffer()->data_len();
58 int len = ntohs(
pkt_info_->ip6->ip6_plen);
66 boost::system::error_code ec;
74 if (source_address.is_unspecified())
81 uint16_t eth_len =
EthHdr(buff, buff_len, interface,
82 agent()->vhost_interface()->mac(),
86 pkt_info_->ip6 = (
struct ip6_hdr *)(buff + eth_len);
88 255, source_address.to_bytes().data(),
89 pkt_info_->ip_saddr.to_v6().to_bytes().data());
91 icmp6_hdr *icmp =
pkt_info_->transp.icmp6 =
94 icmp->icmp6_type = ICMP6_PACKET_TOO_BIG;
96 icmp->icmp6_mtu = htonl(
pkt_info_->agent_hdr.mtu);
97 icmp->icmp6_cksum = 0;
101 pkt_info_->ip_saddr.to_v6().to_bytes().data(),
bool SendIcmpv6Error(VmInterface *intf)
const VnIpam * GetIpam(const IpAddress &ip) const
InterfaceTable * interface_table() const
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
void increment_interface_errors()
boost::shared_ptr< PktInfo > pkt_info_
int EthHdr(const MacAddress &src, const MacAddress &dest, const uint16_t proto)
uint32_t GetInterfaceIndex() const
virtual ~Icmpv6ErrorHandler()
boost::asio::ip::address_v6 Ip6Address
Ip4Address router_id() const
void Send(uint32_t itf, uint32_t vrf, uint16_t, PktHandler::PktModuleName)
bool layer3_forwarding() const
const VnEntry * vn() const
void Ip6Hdr(ip6_hdr *ip, uint16_t plen, uint8_t next_header, uint8_t hlim, uint8_t *src, uint8_t *dest)
Icmpv6ErrorProto * proto_
#define ICMP_UNREACH_HDR_LEN
static const int ICMPV6_PAYLOAD_LEN
Icmpv6ErrorHandler(Agent *agent, Icmpv6ErrorProto *proto, boost::shared_ptr< PktInfo > info, boost::asio::io_context *io)
const Interface * FindInterface(size_t index) const
#define IPV6_ICMP_NEXT_HEADER
uint16_t Icmpv6Csum(const uint8_t *src, const uint8_t *dest, icmp6_hdr *icmp, uint16_t plen) const
SandeshTraceBufferPtr Icmpv6TraceBuf