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

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