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