16 boost::asio::io_context &io)
17 :
ProtoHandler(agent, info, io), igmp_(pkt_info_->transp.igmp) {
64 (
sizeof(
struct ether_header) + ntohs(
pkt_info_->ip->ip_len))) {
70 if (ntohs(
pkt_info_->ip->ip_len) < iphlen) {
75 igmplen = ntohs(
pkt_info_->ip->ip_len) - iphlen;
102 IgmpInfo::VnIgmpDBState::IgmpSubnetStateMap::const_iterator it =
110 igmp_intf = it->second;
120 bool parse_ok =
false;
129 vm_itf, (
void *)
pkt_info_->transp.igmp, igmplen,
144 uint16_t checksum =
igmp_->igmp_cksum;
145 igmp_->igmp_cksum = 0;
157 if (
pkt_info_->packet_buffer() == NULL) {
161 char *buf = (
char *)
pkt_info_->packet_buffer()->data();
162 uint16_t buf_len =
pkt_info_->packet_buffer()->data_len();
163 memset(buf, 0, buf_len);
169 pkt_info_->eth = (
struct ether_header *)buf;
170 uint16_t eth_len = 0;
171 eth_len +=
EthHdr(buf, buf_len, vm_itf->
id(), smac, dmac, ETHERTYPE_IP);
173 uint16_t data_len = packet->
pkt_len_;
175 in_addr_t src_ip = htonl(gmp_addr.to_v4().to_ulong());
176 in_addr_t dst_ip = htonl(packet->
dst_addr_.to_v4().to_ulong());
178 pkt_info_->ip = (
struct ip *)(buf + eth_len);
180 ((uint8_t *)
pkt_info_->ip +
sizeof(
struct ip));
182 data_len +=
sizeof(
struct ip);
const MacAddress & vm_mac() const
bool HandleVmIgmpPacket()
bool GmpProcessPkt(const VmInterface *vm_itf, void *rcv_pkt, uint32_t packet_len, IpAddress ip_saddr, IpAddress ip_daddr)
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
const uint32_t id() const
const VnIpam * GetIpam(const IpAddress &ip) const
boost::asio::ip::address IpAddress
const MacAddress & GetVifMac(const Agent *) const
InterfaceTable * interface_table() const
uint16_t Csum(uint16_t *, std::size_t, uint32_t) const
void SendPacket(const VmInterface *vm_itf, const VrfEntry *vrf, const IpAddress &gmp_addr, GmpPacket *packet)
boost::shared_ptr< PktInfo > pkt_info_
IgmpSubnetStateMap igmp_state_map_
void IncrStatsRxUnknown()
int EthHdr(const MacAddress &src, const MacAddress &dest, const uint16_t proto)
#define IGMP_MIN_PACKET_LENGTH
uint32_t GetInterfaceIndex() const
void IncrStatsBadLength()
IgmpProto * GetIgmpProto() const
void Send(uint32_t itf, uint32_t vrf, uint16_t, PktHandler::PktModuleName)
IgmpHandler(Agent *agent, boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
void IncrSendStats(const VmInterface *vm_itf, bool tx_done)
const VnEntry * vn() const
void IncrRxOkPkt(unsigned long index)
void IncrStatsBadInterface()
const uint32_t vrf_id() const
VmInterface::VmiType vmi_type() const
void IncrStatsRejectedPkt()
bool igmp_enabled() const
const Interface * FindInterface(size_t index) const
DBTablePartBase * get_table_partition() const
DBTableBase::ListenerId vn_listener_id()
void IpHdr(uint16_t len, in_addr_t src, in_addr_t dest, uint8_t protocol, uint16_t id, uint8_t ttl)
void IncrRxBadPkt(unsigned long index)