====== 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 /* ========================================================================= 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 분석을 하기전에, 각각의 계층에서는 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 ---- {{indexmenu>:#1|skipns=/^(wiki|etc|diary|playground)$/ skipfile=/^(todays|about|guestbook)$/ nsort rsort}} ----