Session Layer
이번에는 Session Layer 에 대해서 알아보자! 편의상 세션 레이어 또는 세션 계층이라고 부르겠다.
세션 계층은 역시나 트랜스 포트 계층과 어플리케이션 계층 사이에 존재한다. resource 사용에 대한 허가 및 중개 역할을 한다.
트랜스포트 계층과 마찬가지로 여러가지 오브젝트를 제공한다.
소스를 직접 보면 알겠지만, 큰 틀은 기존의 링크 , 전송 계층과 비슷하다.
크게 두 가지, 바로 위에서 내려오는 데이터에 SPDU 를 붙여 내려보내는 것과 올라오는 데이터를 파싱하여 윗 단계로 보내는 일이다.
역할 및 분석
/* =========================================================================
Required Function Decription
========================================================================= */
void sessionTask()
{
CABLE_Q *pPodMsg, podMsg;
while(1)
{
pPodMsg = message_receive_timeout (pSessionQid, TIMEOUT_INFINITY);
podMsg = *pPodMsg;
message_release (pSessionQid, pPodMsg);
switch(podMsg.tag)
{
case CI_TRANS_TAG: // 세션 계층으로 부터 올라올 때
#ifdef LAYER_DEBUG_CHECK
ARENA_Print(("\n[DEBUG-PODLayer-SessionLayer-sessionTask]Rcv Trans Msg In Session \n"));
#endif
parse_SPDU(&podMsg);
free(podMsg.ptr);
break;
case CI_RESOURCE_TAG: // 리소스에서 부터 내려올 때
// reTransport = 1;
#ifdef LAYER_DEBUG_CHECK
ARENA_Print(("\n[DEBUG-PODLayer-SessionLayer-sessionTask]Rcv Resource Msg In Session \n"));
#endif
task_delay(3*TICKS_10MS);// task_delay(5*TICKS_10MS);
make_SPDU(&podMsg);
free(podMsg.ptr);
break;
case CI_LAYER_CLOSE_TAG: // 세션 계층을 종료할 때
// printf("\n[POD_CI] SESSION TASK SUSPEND\n");
message_delete_queue (pSessionQid);
task_exit (0);
break;
default:
#ifdef ERR_CHECK
{
ARENA_Print(("[ERROR-PODLayer-SessionLayer-Task] Illegal Message Tag(SESSION) = %d\n",podMsg.tag));
}
#endif
break;
}
}
}
세션 계층에서도 여러가지 tag 들이 있다. 우선 위의 세가지 중에서 전송계층에서 올라오는 데이터를 파싱하는 루틴부터 살펴보자. 여기서는 총 7가지의 tag 가 붙을 수 있다.
| Topen_session_request | 0x91 |
| Topen_session_reponse | 0x92 |
| Tcreate_session | 0x93 |
| Tcreate_session_response | 0x94 |
| Tcreate_session_request | 0x95 |
| Tcreate_session_response | 0x96 |
| Tsession_number | 0x90 |
위의 표에 대응되는 hex 값을 보고 처리한다
이번에는 리소스로 부터 내려오는 데이터에 SPDU 를 만들어 붙이는 루틴을 보자!~
/* =========================================================================
Required Function Decription
========================================================================= */
void make_SPDU(struct MESSAGE_Q* msgbuf)
{
U8 *spdu, *spdu_ptr;
U32 spdu_size;
spdu_size = msgbuf->size+4;
spdu = (U8*)malloc(spdu_size);
spdu_ptr = spdu;
memcpy(spdu+4, msgbuf->ptr, msgbuf->size);
*spdu = SESSION_NUMBER; // session_number 를 넣는다.
*(++spdu) = 2;
*(++spdu) = (U8)(msgbuf->ssnb>>8);
*(++spdu) = (U8)(msgbuf->ssnb);
#ifdef LAYER_DEBUG_CHECK
ARENA_Print(("\n[DEBUG-PODLayer-SessionLayer-make_SPDU]SPDU SIZE %d snnb %d PTR %d\n",spdu_size,msgbuf->ssnb,sizeof(spdu_ptr)));
#endif
S2T_send(spdu_ptr, spdu_size, msgbuf->tcid, msgbuf->ssnb); // 전송 계층으로 보낸다.
}
결론적으로 말하자면, 세션 계층은 다른 계층과 마찬가지로 리소스 레이어와 전송 계층 사이에 존재함으로서, 자신의 SPDU 를 덧붙이거나 파싱한다.