Пример #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);
		}
		
		
    }
}
Пример #2
0
/*!
    This property holds the message content.

    \par Access function:
    \li QString <b>content</b>() const
 */
QString IrcPrivateMessage::content() const
{
    Q_D(const IrcMessage);
    QString msg = d->param(1);
    if (flags() & (Identified | Unidentified))
        msg.remove(0, 1);
    const bool act = isAction();
    const bool req = isRequest();
    if (act) msg.remove(0, 8);
    if (req) msg.remove(0, 1);
    if (act || req) msg.chop(1);
    return msg;
}
Пример #3
0
DCM_COMMAND_CLASS::DCM_COMMAND_CLASS(DIMSE_CMD_ENUM commandId)

//  DESCRIPTION     : Constructor.
//  PRECONDITIONS   :
//  POSTCONDITIONS  :
//  EXCEPTIONS      : 
//  NOTES           :
//<<===========================================================================
{
    // constructor activities
    defineGroupLengthsM = true;
    commandIdM = commandId;
    isRequestM = isRequest(commandId);
    widTypeM = WAREHOUSE->dimse2widtype(commandId);
    return;
}
Пример #4
0
Json::Value JsonRpcPrivate::handleObject(Json::Value const & jsonObject) {
  Json::Value response;
  if (!jsonObject.isObject()) {
    Json::Value const null;
    response = invalidRequest(null);
  } else {
    Json::Value const id(jsonObject["id"]); //TODO: handle special responses (e.g. parse errors)
    if (isRequest(jsonObject)) {
      response = handleRequest(jsonObject, id);
    } else if (isResponse(jsonObject)) {
      Json::Value const null;
      response = null;
      handleResponse(jsonObject, id);
    } else {
      response = invalidRequest(id);
    }
  }
  return response;
}
Пример #5
0
bool BNetworkOperation::reply(int compressionLevel, const QVariant &variant)
{
    if (isRequest())
        return false;
    return connection()->sendReply(this, compressionLevel, variant);
}
Пример #6
0
bool BNetworkOperation::reply(int compressionLevel, const QByteArray &data)
{
    if (isRequest())
        return false;
    return connection()->sendReply(this, compressionLevel, data);
}
Пример #7
0
bool BNetworkOperation::reply(const QVariant &variant)
{
    if (isRequest())
        return false;
    return connection()->sendReply(this, variant);
}
Пример #8
0
bool BNetworkOperation::reply(const QByteArray &data)
{
    if (isRequest())
        return false;
    return connection()->sendReply(this, data);
}
Пример #9
0
 bool isAck() {
   return isRequest() && (isSend() ? send_scheme->isAck() : !strcmp(recv_request, "ACK"));
 }
Пример #10
0
 bool isCancel() {
   return isRequest() && (isSend() ? send_scheme->isCancel() : !strcmp(recv_request, "CANCEL"));
 }
Пример #11
0
bool Message::isResponse() const
{
    return (!isEmpty() && !isRequest());
}
Пример #12
0
std::string SIPMessage::method() {
    if (!isRequest())
        return "";
    else
        return rline.substr(0, rline.find(" "));
}
Пример #13
0
int main(void)
{
	struct pollfd sfd[3];
	const long timeout=500; //connection timeout in seconds

	struct timespec ts_timeout;

	int size;

	field *pmessage;

	fldformat *frm;

	isomessage smessage;

	GOOGLE_PROTOBUF_VERIFY_VERSION;

	frm=loadNetFormat();

	if(!frm)
	{
		printf("Error: Can't load format\n");
		return 1;
	}

	printf("Message format loaded\n");

	sfd[2].fd=tcpinit();

	if(sfd[2].fd==-1)
	{
		printf("Error: Unable to start TCP connection\n");
		freeFormat(frm);
		return 1;
	}

	sfd[0].fd=ipcopen((char *)"visa");

	if(sfd[0].fd==-1)
	{
		printf("Error: Unable to connect to switch\n");
		close(sfd[2].fd);
		freeFormat(frm);
		return 1;
	}

	if (signal(SIGINT, catch_sigint) == SIG_ERR)
		printf("Warning: unable to set the signal handler\n");

	sfd[0].events=POLLIN;
	sfd[1].events=POLLIN;

	while (1)
	{
		printf("Waiting for a connection...\n");

		errno=0;
		sfd[1].fd=tcpconnect(sfd[2].fd);
		if(sfd[1].fd==-1)
		{
			if(sigint_caught)
			{
				printf("onnection aborted^\n");
				break;
			}

			printf("Connection error: %s\n", strerror(errno));
			sleep(1);
			continue;
		}

		printf("Connected.\n");

		while (1)
		{
			printf("Waiting for a message...\n");

			ts_timeout.tv_sec=timeout;
			ts_timeout.tv_nsec=0;
			errno=0;

			size=ppoll(sfd, 2, &ts_timeout, NULL);

			//printf("poll: %d: %hd, %hd: %s\n", size, sfd[0].revents, sfd[1].revents, strerror(errno));

			if(size==-1)
			{
				if(sigint_caught)
				{
					printf("losing connection^\n");
					break;
				}

				printf("Error: poll (%hd, %hd): %s\n", sfd[0].revents, sfd[1].revents, strerror(errno));
				if(sfd[1].revents)
					break;
				else
				{
					usleep(100000);
					continue;
				}
			}
			else if(size==0)
			{
				printf("Error: Connection is inactive, closing it %ld, %ld\n", ts_timeout.tv_sec, ts_timeout. tv_nsec);
				break;
			}

			if(sfd[1].revents & POLLIN)
			{
				printf("Receiving message from net\n");

				size=tcprecvmsg(sfd[1].fd, &pmessage, frm);

				if(size==-1)
				{
					printf("Closing connection\n");
					break;
				}
				else if(size==0)
					continue;

				print_message(pmessage);

				if(isNetMgmt(pmessage))
				{
					if(isNetRequest(pmessage))
					{
						if(!processNetMgmt(pmessage))
						{
							printf("Error: Unable to process Network Management request. Message dropped.\n");
							freeField(pmessage);
							continue;
						}

						print_message(pmessage);

						size=tcpsendmsg(sfd[1].fd, pmessage);

						if(size==-1)
						{
							printf("Closing connection\n");
							freeField(pmessage);
							break;
						}
						else if(size==0)
						{
							freeField(pmessage);
							continue;
						}

						printf("Network Management Message sent (%d bytes)\n", size);
					}

					freeField(pmessage);
					continue;
				}

				if(translateNetToSwitch(&smessage, pmessage)!=0)
				{
					printf("Error: Unable to translate the message to format-independent representation.\n");

					if(isNetRequest(pmessage))
					{
						if(!declineNetMsg(pmessage))
						{
							printf("Error: Unable to decline the request. Message dropped.\n");
							freeField(pmessage);
							continue;
						}

						print_message(pmessage);

						size=tcpsendmsg(sfd[1].fd, pmessage);

						if(size==-1)
						{
							printf("Closing connection\n");
							freeField(pmessage);
							break;
						}
						else if(size==0)
						{
							freeField(pmessage);
							continue;
						}

						printf("Decline message sent (%d bytes)\n", size);
					}

					freeField(pmessage);
					continue;
				}

				printf("Converted message:\n");
				smessage.PrintDebugString();

				size=ipcsendmsg(sfd[0].fd, &smessage, (char *)"switch");

				if(size<=0)
				{
					printf("Error: Unable to send the message to switch\n");

					if(isNetRequest(pmessage))
					{
						if(!declineNetMsg(pmessage))
						{
							printf("Error: Unable to decline the request. Message dropped.\n");
							freeField(pmessage);
							continue;
						}

						print_message(pmessage);

						size=tcpsendmsg(sfd[1].fd, pmessage);

						if(size==-1)
						{
							printf("Closing connection\n");
							freeField(pmessage);
							break;
						}
						else if(size==0)
						{
							freeField(pmessage);
							continue;
						}

						printf("Decline message sent (%d bytes)\n", size);
					}

					freeField(pmessage);
					continue;
				}

				freeField(pmessage);

				printf("Message sent, size is %d bytes.\n", size);
			}

			if(sfd[0].revents & POLLIN)
			{
				printf("Receiving message from switch\n");

				if(ipcrecvmsg(sfd[0].fd, &smessage)<0)
					continue;

				printf("\nOutgoingMessage:\n");
		                smessage.PrintDebugString();

				pmessage=translateSwitchToNet(&smessage, frm);

				if(!pmessage)
				{
					printf("Error: Unable to translate the message from format-independent representation.\n");

					if(isRequest(&smessage))
					{
						if(!declineMsg(&smessage))
						{
							printf("Error: Unable to decline the request. Message dropped.\n");
							continue;
						}

						smessage.PrintDebugString();

						size=ipcsendmsg(sfd[0].fd, &smessage, (char *)"switch");

						if(size<=0)
						{
							printf("Error: Unable to return the declined message to switch. Message dropped.\n");
							continue;
						}

						printf("Decline message sent (%d bytes)\n", size);

					}
					continue;
				}

				print_message(pmessage);

				size=tcpsendmsg(sfd[1].fd, pmessage);

				freeField(pmessage);

				if(size==-1)
				{
					printf("Closing connection\n");

					if(isRequest(&smessage))
					{
						if(!declineMsg(&smessage))
						{
							printf("Error: Unable to decline the request. Message dropped.\n");
							continue;
						}

						smessage.PrintDebugString();

						size=ipcsendmsg(sfd[0].fd, &smessage, (char *)"switch");

						if(size<=0)
						{
							printf("Error: Unable to return the declined message to switch. Message dropped.\n");
							continue;
						}

						printf("Decline message sent (%d bytes)\n", size);

					}
					break;
				}
				else if(size==0)
				{
					if(isRequest(&smessage))
					{
						if(!declineMsg(&smessage))
						{
							printf("Error: Unable to decline the request. Message dropped.\n");
							continue;
						}

						smessage.PrintDebugString();

						size=ipcsendmsg(sfd[0].fd, &smessage, (char *)"switch");

						if(size<=0)
						{
							printf("Error: Unable to return the declined message to switch. Message dropped.\n");
							continue;
						}

						printf("Decline message sent (%d bytes)\n", size);
					}
					continue;
				}

				printf("Message sent (%d bytes)\n", size);
			}

		}

		tcpclose(sfd[1].fd);

		printf("Disconnected.\n");

		if(sigint_caught)
			break;
	}

	tcpclose(sfd[2].fd);
	ipcclose(sfd[0].fd);
	freeFormat(frm);
	google::protobuf::ShutdownProtobufLibrary();
	
	return 0;
}