POD DATA 분석
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