Transport Layer
이번에는 Transport Layer 에 대해서 알아보자!! 여기서는 편의상 Transport Layer 를 '전송 계층' 이라고 부르겠다.
역시 소스를 살펴보기 전에 과연 어떤 일을 하는 놈(?) 인지 알아보도록 하자!!
역할
- 링크 계층과 세션 계층 사이에 존재하는 계층
- 각각의 POD 에 대응하도록 transport ID 를 부여해서 자신에게 전달된 데이터인지 구별하여 진로를 결정한다.
- 최소 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 문에 따라서 수행되는 것 또한 달라진다.
- CI_LINK_TAG : 링크 레이어로 내려 보낼 때 기존의 데이터에 TPDU 를 덧 붙인다.
- CI_SESSION_TAG : 세션 레이어로 올려 보낼 때 기존의 데이터에서 TPDU 를 파싱한다.
- CI_LAYER_CLOSE_TAG : 레이어를 종료할 때
가장 먼저 CI_LINK_TAG 부터 살펴보자!!
트랜스 포트 계층에서는 POD 모듈로 부터 오는 데이터를 파싱할 때, 과연 이것이 어떤 목적으로 보내온 것인지 부터 분석해야 한다.
POD 스펙 문서에서는 create 와 reply 두가지 밖에는 나와 있지 않지만, 프로그램을 보면 총 5가지로 분류 했다.
- Create_T_C_Reply : 세션 열기(open)
- Delete_T_C : 연결에 대한 삭제
- D_T_C_Reply : 연결에 대한 응답
- T_DATA_MORE : 데이터가 더 있음
- T_DATA_LAST : 마지막 데이터임
각각의 어떠한 상황인지는 bit 값을 보고 판단한다. 위의 5가지 경우 중, T_DATA_LAST 를 제외하고는 모두 하단의 링크 레이어로 보낸다.
T_DATA_LAST(0xa0) 값이 파싱되어 나오면, 데이터를 상위의 세션 레이어로 보낸다.
이번에는 CI_SESSION_TAG 를 보자!
세션 레이어로 부터 데이터가 넘어오면, 트랜스포트 계층에서는 일정한 메모리공간을 잡아 TPDU 포함(데이터, 사이즈, tcid) 를 덧붙이고는 링크 계층으로 넘긴다.
마지막으로 CI_LAYER_CLOSE_TAG 를 보자!
이것은 트랜스포트 계층을 종료할 때 사용된다.