Ejemplo n.º 1
0
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);
		}
		
		
    }
}