Transport Layer

이번에는 Transport Layer 에 대해서 알아보자!! 여기서는 편의상 Transport Layer 를 '전송 계층' 이라고 부르겠다.
역시 소스를 살펴보기 전에 과연 어떤 일을 하는 놈(?) 인지 알아보도록 하자!!

  1. 링크 계층과 세션 계층 사이에 존재하는 계층
  2. 각각의 POD 에 대응하도록 transport ID 를 부여해서 자신에게 전달된 데이터인지 구별하여 진로를 결정한다.
  3. 최소 300MS 마다 polling message 를 통해 pod 와 host 가 서로 죽었는지 살았는지 확인한다.

이제 소스를 한번 분석해 보자!

/* =========================================================================
    Required Function Decription
========================================================================= */
void transportTask()
{
	CABLE_Q	 *pPodMsg, podMsg;	
 
	while(1)
	{
		pPodMsg = message_receive_timeout (pTransportQid, TIMEOUT_INFINITY);
		podMsg = *pPodMsg;
		message_release (pTransportQid, pPodMsg);
 
		switch(podMsg.tag)
		{
			case CI_LINK_TAG:
				parse_TPDU(&podMsg);
				if(podMsg.ptr!=NULL)		
					free(podMsg.ptr);
			break;
 
			case CI_SESSION_TAG:
				make_TPDU(&podMsg);
				if(podMsg.ptr!=NULL)		
					free(podMsg.ptr);			   	
			break;
 
			case CI_LAYER_CLOSE_TAG:			
				message_delete_queue (pLinkQid);
				task_exit (0);		
			break;
 
			default:
			#ifdef ERR_CHECK
			{
				ARENA_Print(("[ERROR-PODLayer-TRANSPORT-Task] Illegal Message Tag(TRANSPORT) = %d\n",podMsg.tag));
			}
			#endif
			break;
		}
	}
}

이 것 역시 task 로 되어 있다. 각각의 case 문에 따라서 수행되는 것 또한 달라진다.

  1. CI_LINK_TAG : 링크 레이어로 내려 보낼 때 기존의 데이터에 TPDU 를 덧 붙인다.
  2. CI_SESSION_TAG : 세션 레이어로 올려 보낼 때 기존의 데이터에서 TPDU 를 파싱한다.
  3. CI_LAYER_CLOSE_TAG : 레이어를 종료할 때

가장 먼저 CI_LINK_TAG 부터 살펴보자!!
트랜스 포트 계층에서는 POD 모듈로 부터 오는 데이터를 파싱할 때, 과연 이것이 어떤 목적으로 보내온 것인지 부터 분석해야 한다.
POD 스펙 문서에서는 create 와 reply 두가지 밖에는 나와 있지 않지만, 프로그램을 보면 총 5가지로 분류 했다.

  1. Create_T_C_Reply : 세션 열기(open)
  2. Delete_T_C : 연결에 대한 삭제
  3. D_T_C_Reply : 연결에 대한 응답
  4. T_DATA_MORE : 데이터가 더 있음
  5. T_DATA_LAST : 마지막 데이터임

각각의 어떠한 상황인지는 bit 값을 보고 판단한다. 위의 5가지 경우 중, T_DATA_LAST 를 제외하고는 모두 하단의 링크 레이어로 보낸다.
T_DATA_LAST(0xa0) 값이 파싱되어 나오면, 데이터를 상위의 세션 레이어로 보낸다.

이번에는 CI_SESSION_TAG 를 보자!
세션 레이어로 부터 데이터가 넘어오면, 트랜스포트 계층에서는 일정한 메모리공간을 잡아 TPDU 포함(데이터, 사이즈, tcid) 를 덧붙이고는 링크 계층으로 넘긴다.

마지막으로 CI_LAYER_CLOSE_TAG 를 보자!
이것은 트랜스포트 계층을 종료할 때 사용된다.

  • computer/digitalarena/transport_layer.txt
  • Last modified: 3 years ago
  • by likewind