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 를 덧붙이거나 파싱한다.