示例#1
0
文件: ccn.cpp 项目: LXiong/ccn
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);
}