void CEtherArpHandler::handle(CSmartPtr<CMsgQueue>& queue) { LOG_INFO_FMT("%s recv new msg ..., queue size = %lu", toString().c_str(), queue->size()); CSmartPtr<CMsg> msg; while (queue->try_pop(msg)) { INT4 sockfd = msg->getSockfd(); const CSmartPtr<CSwitch>& srcSw = CServer::getInstance()->getSwitchMgr()->findSwBySockFd(sockfd); // 获取packetin 信息 packet_in_info_t* packetIn = msg->getPacketIn(); arp_t* pkt = (arp_t*)packetIn->data; // 保存源主机信息 CHost* srcHost = CHostMgr::getInstance()->addHost(srcSw, 0, packetIn->inport, pkt->sendmac, pkt->sendip); // 查找目标主机 CHost* dstHost = CHostMgr::getInstance()->findHostByIp(pkt->targetip); // 如果源主机和目标主机都存在 if ((NULL != srcHost) && (NULL != dstHost)) { arp_t arp_pkt; // 如果是Arp Request if (isRequest(pkt)) { LOG_INFO("Create Arp Reply"); // 创建Arp Reply回应报文并且转发 create_arp_reply_pkt(&arp_pkt, srcHost, dstHost); forward(srcSw, srcHost->getPortNo(), sizeof(arp_pkt), &arp_pkt); } // 如果是Arp Reply if (isReply(pkt)) { LOG_INFO("forward Arp Reply"); // 转发Arp Reply回应报文 forward(dstHost->getSw(), dstHost->getPortNo(), sizeof(arp_pkt), &arp_pkt); } } // 如果不存在 else { LOG_INFO("flood Arp request"); // 将这个包广播 // flood(packetIn); } } }