POD 의 전체적인 동작흐름을 파악하기 위해 POD 모듈과 호스트 사이의 데이터를 스니핑 해서 분석을 해본다. 여기서 POD 의 각 계층마다의 특징을 써보자!!

계층 역할
physical POD 의 삽입여부판단, personality change, buffer nego
link buffer nego 에서 약속한 buffer 크기보다 클 경우, 쪼개서 하나의 LPDU 로 만들어서 보낸다. 또한 pod 로 부터 오는 데이터를 받아서 파싱을 해서 만일 쪼개진 데이터라면, 기다렸다가 데이터를 모두 받으면, 트랜스 포트 계층으로 보낸다.
transport 데이터의 패킷화와 이동을 관리. 총 11개의 object tag 를 통해 서로의 통신을 해석할 수 있다. 보낼 데이터가 없더라도, 일정시간마다 주고 받아야 한다. POD 는 트랜스포트 계층상에서 host 의 요청이 있어야 데이터를 보낼 수 있다.
session 리소스들과 communication 할 수 있는 수단을 제공. 즉 리소스 사용에 대한 인허가 및 중계 역할을 한다. 총 7개의 object tag 를 통해 서로의 통신을 해석한다.
application 리소스들의 모임으로 구성. POD application 이 이용할 function 들의 모임이다. 여러가지의 object 로 구성된다.

패킷 분석

현재의 마지막 버전의 프로그램을 돌린 상태에서 POD 의 link layer 부분에서 데이터가 나가는 루틴에 print 문을 넣어서 host 가 pod 쪽으로 나가는 데이터와 pod 에서 host 쪽으로 들어오는 데이터를 역시 print 문으로 확인해보았다.

/* =========================================================================
    Required Function Decription
========================================================================= */
ERR_CI linkLayerBufRead(U8 cID, U16 *Access_Size)
{
	U8	podReg;
	U8	*buf_ptr;
	U16	bsize;
	int		i;
	U32	podIOBase;
 
	if(cID==COMMAND_CH)
	{
		buf_ptr = readCobuf;
 
		podIOBase = POD_CIO_BASE;
	}
	else
	{
		buf_ptr = readExbuf;
 
		podIOBase = POD_EIO_BASE;
	}
 
	if( ciApiPODExistCheck() )
	{
		bsize = SIZE_LS(podIOBase);
	}
	else	return( CI_ABORT );
 
	if( ciApiPODExistCheck() )
	{
		bsize |= ((SIZE_MS(podIOBase)<<8)&0xff00);
	}
	else	return( CI_ABORT );
 
	*Access_Size = bsize;
printf("read_value=");                       //  데이터를 읽어 오는 부분에 출력문을 넣었다.
	for(i=0; i<bsize; i++)
	{
		if( ciApiPODExistCheck() )
		{
			*(buf_ptr+i) = DATA_RD(podIOBase);
			printf("%X",*(buf_ptr+i));
		}
		else	return( CI_ABORT );
	}
	printf("\n");
#ifdef	STATUS_ERROR_TREAT
 
	if( ciApiPODExistCheck() )
	{
		podReg = STATUS_RD(podIOBase);
	}
	else	return( CI_ABORT );
 
	if(podReg&REbit)
	{
//		ciStatusFlag |= FlagCiPodReset;
 
//		sendToResetTask(POD_RESET);
//		task_suspend(0);
	}
	else if(podReg&IIRbit)
	{
		ciStatusFlag |= FlagCiPodReset;
 
		sendToResetTask(POD_RESET);
		task_suspend(0);
	}
#endif
 
	if(cID==COMMAND_CH)
	{
//		printf("Received Data from POD\n");
//		printf_pdu2( readCobuf, bsize );
	}
 
	return( CI_OK );
}
/* =========================================================================
    Required Function Decription
========================================================================= */
ERR_CI linkLayerBufWrite(U8 cID,U16 Access_Size)
{
	U8	podReg;
	U8	*buf_ptr;
	U8	transDataSize;
	int		i;
	U32	podIOBase;
 
	if(cID==COMMAND_CH)
	{
		buf_ptr = writeCoBuf;
//		printf("value=%X\n",writeCoBuf);
		podIOBase = POD_CIO_BASE;
	}
	else
	{
		buf_ptr = writeExBuf;
//	printf("value1=%X\n",writeCoBuf);
		podIOBase = POD_EIO_BASE;
	}
 
	if( ciApiPODExistCheck() )
	{
		COMMAND_WR(podIOBase) = HCbit;
	}
	else	return( CI_ABORT );
 
	while( 1 )
	{
		if( ciApiPODExistCheck() )
		{
			if( STATUS_RD(podIOBase)&FRbit )	break;
		}
		else	return( CI_ABORT );
	}
 
	transDataSize = (U8)(Access_Size&0x00FF);
	if( ciApiPODExistCheck() )
	{
		SIZE_LS(podIOBase)=transDataSize;
	}
	else	return( CI_ABORT );
 
	transDataSize = (U8)(Access_Size>>8);
	if( ciApiPODExistCheck() )
	{
		SIZE_MS(podIOBase)=transDataSize;
	}
	else	return( CI_ABORT );
	printf("wirte_value=");              // 데이터를 쓰는 부분에 출력문을 넣었다.
	for(i=0; i<Access_Size; i++)
	{
		//printf("\n");
		if( ciApiPODExistCheck() )
		{
			DATA_WR(podIOBase) = *(buf_ptr+i);
			printf("%X",*(buf_ptr+i));
		}
		else	return( CI_ABORT );
	}
printf("\n");
	if( ciApiPODExistCheck() )
	{
		COMMAND_WR(podIOBase)=0x00;
	}
	else	return( CI_ABORT );
 
#ifdef	STATUS_ERROR_TREAT
 
	if( ciApiPODExistCheck() )
	{
		podReg = STATUS_RD(podIOBase);
	}
	else	return( CI_ABORT );
 
	if(podReg&WEbit)
	{
//		ciStatusFlag |= FlagCiPodReset;
 
//		sendToResetTask(POD_RESET);
//		task_suspend(0);
	}
	else if(podReg&IIRbit)
	{
		ciStatusFlag |= FlagCiPodReset;
 
		sendToResetTask(POD_RESET);
		task_suspend(0);
	}
#endif
 
//	printf("POD_LINK :  Sending Data\n");
	printf_pdu2( writeCoBuf, Access_Size );
//printf("DATA_VALUE=%X\n",*(buf_ptr+i));
 
	return( CI_OK );			//20021211denver
}

분석을 하기전에, 각각의 계층에서는 hex 값으로 분석한다. 관련 문서를 옆에 두고 차근차근히 살펴보자~
이제, 출력문의 결과를 가지고 본격적으로 분석을 해보자!
각각의 LPDU 는 2 바이트의 헤더로 이루어져 있다. 첫 번째 바이트는 트랜스포트 계층의 TPDU 의 조각이다. 두 번째 바이트는 이 데이터가 더있는지(More) 마지막인지(Last) 구분한다.

비트값 설명
두번째바이트 1 데이터가 더있다.(More)
두번째바이트 0 이것이 마지막 데이터이다.(Last)
wirte_value=108211         
||
read_value=10831180210
 Starting POD
wirte_value=10A011
read_value=10802180
wirte_value=108111
read_value=10A0719140104180210
 
[MSG-POD-RM] POD_RM OPEN
wirte_value=
CM_MSG : POD inserted, changed from PSIP_DB into SI_DB
10A0A192700104101
read_value=1080210
wirte_value=10A091902019F80100
read_value=1080210
wirte_value=10A011
read_value=10802180
wirte_value=108111
read_value=10A082091902019F8011080210
recevie profile
wirte_value=10A091902019F80120
read_value=1080210
wirte_value=10A011
read_value=10802180
wirte_value=108111
read_value=10A082091902019F8010080210
wirte_value=10A0291902019F8011200104104008102081030420200430A004102404114041
read_value=1080210
wirte_value=10A011
read_value=10802180
wirte_value=108111
read_value=10A07191404008180210
 
[MSG-POD-MMI] POD_MMI OPEN
wirte_value=10A0A1927004008102
read_value=10802180
wirte_value=108111
read_value=10A0719140208180210
 
[MSG-POD-INFO] POD_INFO OPEN
wirte_value=10A0A192700208103
read_value=10802180
wirte_value=10A0121902039F8020901E03200010
read_value=10802180
wirte_value=108111
read_value=10A0719140A004180210
 
[MSG-POD-EC] POD_EC OPEN
wirte_value=This message is from EC.
 
[MSG-POD-EC] Send SI
108111
read_value=10A0719141404180210
 
[MSG-POD-GD] POD_DIAG OPEN
wirte_value=10A0A192700A004104
read_value=10802180
wirte_value=10A0C1902049F8E0301FFC
read_value=10802180
wirte_value=10A0A192701404105
read_value=10802180
wirte_value=108111
read_value=10A07191402404180210
 
[MSG-POD-TIME] POD_TIME OPEN
wirte_value=108111
read_value=180A0820B91902039F8021820AE20004000D49726465746F204163636573731748544D4C2F4170706C69496E666F4D656E752E68746D6C100F436F70792070726F746563746
96F6E1648544D4C2F436F707950726F744D656E752E68746D6C300194E6574776F726B20696E746572666163652044
read_value=1056532F3136371148544D4C2F4456534D656E752E68746D6C600A446961676E6F737469631848544D4C2F446961676E6F737469634D656E752E68746D6C80210
==POD==DATA_FILL=============
wirte_value=108111
read_value=10A0820F1902049F8E1605001080210
wirte_value=10A0A1927002404106
read_value=10802180
wirte_value=108111
read_value=10A07191402004380210
 
[MSG-POD-HC] POD_HC OPEN
wirte_value=10A0A1927002004307
read_value=10802180
wirte_value=108111
read_value=10A0820A1902069F84421F80210
  • computer/digitalarena/pod_data_분석.txt
  • Last modified: 3 years ago
  • by likewind