void AppLayerCCNClient(Node* node, Message* msg) { NodeData* nodeData; nodeData = (NodeData*)node->appData.nodeData; Node* source_node; source_node = MAPPING_GetNodePtrFromHash(GlobalNodeData::nodeHash, source_node_id); nodeData->source_nodeData = (NodeData*)source_node->appData.nodeData; NodeData* source_nodeData; source_nodeData = nodeData->source_nodeData; switch(msg->eventType) { // タイマーメッセージ case MSG_APP_TimerExpired: // タイマーメッセージ { AppTimer* timer; timer = (AppTimer *)MESSAGE_ReturnInfo(msg); // timer messageの種類によって処理を分ける switch(timer->type) { case APP_TIMER_SEND_PKT: { printf("この表示がなければ、APP_TIMER_SEND_PKTはビデオストリーミング確定 "); clocktype send_delayTime; uint32_t chunk_num; map<uint32_t, clocktype>::iterator it; chunk_num = 0; do { chunk_num++; it = source_nodeData->dataGenerateTime_map.find(chunk_num); if(it == source_nodeData->dataGenerateTime_map.end()) { ERROR_ReportError("dataGenerateTime_map error\n"); } send_delayTime = it->second - node->getNodeTime(); } while(send_delayTime < 0); nodeData->set_lastChunkNum(msg_videoData_name + node->nodeId % 3, chunk_num - 1); nodeData->set_lastRecvMsg(msg_videoData_name + node->nodeId % 3, chunk_num - 1); CcnMsg* ccnMsg; do { ccnMsg = new CcnMsg(); ccnMsg->ccn_method = nodeData->ccn_method; ccnMsg->resent_times = 0; ccnMsg->msg_type = Interest; ccnMsg->msg_name = msg_videoData_name + node->nodeId % 3; ccnMsg->msg_chunk_num = nodeData->return_lastChunkNum(ccnMsg) + 1; ccnMsg->EncodeFullNameMsg(); ccnMsg->sender_node_id = node->nodeId; ccnMsg->source_node_id = source_node_id; ccnMsg->payload_length = 30; ccnMsg->hops_limit = 20; ccnMsg->interest_genTime = node->getNodeTime(); ccnMsg->content_type = VideoData; ccnMsg->end_chunk_num = UINT32_MAX; it = source_nodeData->dataGenerateTime_map.find(ccnMsg->msg_chunk_num); ccnMsg->data_genTime = it->second; nodeData->set_lastChunkNum(ccnMsg); nodeData->fibSend(node, ccnMsg); if(ccnMsg->ccn_method == DEFAULT) { nodeData->make_reTransMsg(node, ccnMsg); nodeData->set_lastRecvMsg(msg_videoData_name + node->nodeId % 3, UINT32_MAX - 3); nodeData->reqMapInput(node, ccnMsg); } else if(ccnMsg->ccn_method == DEFAULT_FAST) { nodeData->make_reTransMsg(node, ccnMsg); nodeData->set_lastRecvMsg(msg_videoData_name + node->nodeId % 3, UINT32_MAX - 3); nodeData->reqMapInput(node, ccnMsg); } else if(ccnMsg->ccn_method == PRIOR) { nodeData->reqMapInput_PRIOR(node, ccnMsg); break; } else if(ccnMsg->ccn_method == PROPOSAL) { nodeData->set_lastRecvMsg(msg_videoData_name + node->nodeId % 3, UINT32_MAX - 1); nodeData->reqMapInput(node, ccnMsg); //printf("[node%d][msg%d] sendInterest\n", node->nodeId, ccnMsg->msg_name); break; } } while(nodeData->set_windowSize(node, ccnMsg)); break; } // APP_TIMER_SEND_PKT case APP_TIMER_DATA_SEND_PKT: { printf("この表示がなければ、APP_TIMER_DATA_SEND_PKTはいらない子。てかどうやってここはいるんだ… "); CcnMsg* ccnMsg; for(int i = 0; i < 3; i++) { ccnMsg = new CcnMsg(); ccnMsg->resent_times = 0; ccnMsg->ccn_method = PRIOR; ccnMsg->msg_type = Data; ccnMsg->msg_name = msg_videoData_name + i; ccnMsg->msg_chunk_num = nodeData->return_lastChunkNum(ccnMsg) + 1; ccnMsg->EncodeFullNameMsg(); ccnMsg->sender_node_id = node->nodeId; ccnMsg->source_node_id = source_node_id; ccnMsg->payload_length = nodeData->tcp_mss; ccnMsg->hops_limit = 20; ccnMsg->interest_genTime = node->getNodeTime(); ccnMsg->content_type = VideoData; ccnMsg->end_chunk_num = UINT32_MAX; map<uint32_t, clocktype>::iterator it; it = nodeData->dataGenerateTime_map.find(ccnMsg->msg_chunk_num); ccnMsg->data_genTime = it->second; clocktype send_delayTime; send_delayTime = ccnMsg->data_genTime - node->getNodeTime(); if(send_delayTime < 0) send_delayTime = 0; nodeData->set_lastChunkNum(ccnMsg); nodeData->pitSend_PRIOR(node, nodeData->NewCcnMsg(ccnMsg), send_delayTime); APP_SetTimer(node, APP_CCN_CLIENT, 0, APP_CCN_LISTEN_PORT, APP_TIMER_DATA_SEND_PKT, send_delayTime); } delete ccnMsg; break; } // APP_TIMER_DATA_SEND_PKT case APP_TIMER_fakeINTEREST_SEND_PKT: { printf("この表示がなければ、APP_TIMER_fakeINTEREST_SEND_PKTはいらない子。てかここどうやって入るんだ… "); // 動画の配信分をすべて出す CcnMsg* ccnMsg; for(int i = 0; i < 3; i++) { ccnMsg = new CcnMsg(); ccnMsg->resent_times = 0; ccnMsg->ccn_method = PROPOSAL; ccnMsg->msg_type = fakeInterest; ccnMsg->msg_name = msg_videoData_name + i; ccnMsg->msg_chunk_num = nodeData->return_lastChunkNum(ccnMsg) + 1; ccnMsg->EncodeFullNameMsg(); ccnMsg->sender_node_id = node->nodeId; ccnMsg->source_node_id = source_node_id; ccnMsg->payload_length = nodeData->tcp_mss; ccnMsg->hops_limit = 20; ccnMsg->interest_genTime = node->getNodeTime(); ccnMsg->content_type = VideoData; ccnMsg->end_chunk_num = UINT32_MAX; map<uint32_t, clocktype>::iterator it; it = nodeData->dataGenerateTime_map.find(ccnMsg->msg_chunk_num); ccnMsg->data_genTime = it->second; clocktype send_delayTime; send_delayTime = ccnMsg->data_genTime - node->getNodeTime(); if(send_delayTime < 0) send_delayTime = 0; nodeData->set_lastChunkNum(ccnMsg); nodeData->fibModSend(node, nodeData->NewCcnMsg(ccnMsg), send_delayTime); APP_SetTimer(node, APP_CCN_CLIENT, 0, APP_CCN_LISTEN_PORT, APP_TIMER_fakeINTEREST_SEND_PKT, send_delayTime); } delete ccnMsg; break; } // APP_TIMER_fakeINTEREST_SEND_PKT case APP_TIMER_REGULAR_SEND_PKT: { //printf("この表示は 予想ではたくさんでる。APP_TIMER_REGULAR_SEND_PKT\n"); clocktype send_delayTime; uint32_t chunk_num; map<uint32_t, clocktype>::iterator it; uint32_t next_msgName = global_node_data->return_MsgName(); uint32_t end_chunk_num = next_msgName % 40 + 10; CcnMsg* ccnMsg; do { ccnMsg = new CcnMsg(); ccnMsg->resent_times = 0; ccnMsg->ccn_method = DEFAULT; ccnMsg->msg_type = Interest; ccnMsg->msg_name = next_msgName; ccnMsg->msg_chunk_num = nodeData->return_lastChunkNum(ccnMsg) + 1; ccnMsg->EncodeFullNameMsg(); ccnMsg->sender_node_id = node->nodeId; ccnMsg->source_node_id = source_node_id; ccnMsg->payload_length = 30; ccnMsg->hops_limit = 20; ccnMsg->content_type = CommonData; ccnMsg->end_chunk_num = end_chunk_num; ccnMsg->interest_genTime = node->getNodeTime(); ccnMsg->data_genTime = node->getNodeTime(); nodeData->set_lastChunkNum(ccnMsg); nodeData->reqMapInput(node, ccnMsg); nodeData->fibSend_DEFAULT(node, ccnMsg); nodeData->make_reTransMsg(node, ccnMsg); if(ccnMsg->msg_chunk_num > ccnMsg->end_chunk_num) break; } while(nodeData->set_windowSize(node, ccnMsg)); APP_SetTimer(node, APP_CCN_CLIENT, 0, APP_CCN_LISTEN_PORT, APP_TIMER_REGULAR_SEND_PKT, nodeData->commonPacketGenerateTime); break; } // APP_TIMER_REGULAR_SEND_PKT default: ERROR_ReportError("Undefined timer type\n"); } break; } // MSG_APP_TimerExpired case MSG_APP_FromTransOpenResult: // TCPでactive open処理が完了 { // データ送信処理 // 送信データの操作は出来る限りHostの処理にしておく // ここでは送信処理だけ TransportToAppOpenResult *openResult; openResult = (TransportToAppOpenResult*) MESSAGE_ReturnInfo(msg); //TCPコネクションが不成立時(失敗) if (openResult->connectionId < 0) { char buf[MAX_STRING_LENGTH]; ctoa(node->getNodeTime(),buf); node->appData.numAppTcpFailure++; break; } // バッファーからccnメッセージを取り出し CcnMsg* ccnMsg; ccnMsg = nodeData->BufferRetrieve_Client(node, msg); nodeData->StatisticalInfo_sendCcnMsg(node, ccnMsg); ccnMsg->App_TcpSendCcnMsg(node, msg); break; } // MSG_APP_FromTransOpenResult case MSG_APP_FromTransDataSent: // TCPでデータ転送終了 TransportToAppDataSent *openResult; openResult = (TransportToAppDataSent*) MESSAGE_ReturnInfo(msg); APP_TcpCloseConnection(node, openResult->connectionId); break; case MSG_APP_FromTransCloseResult: break; default: ERROR_ReportError("msg->eventType error: undefined eventType\n"); } MESSAGE_Free(node, msg); }