[PolarSSL+FreeRTOS]"bad message length" & "malloc failed" Error 해결 방법

Posted by 카이젠8501 카이젠8501
2016.12.01 12:57 IT 개발/기타

PolarSSL “bad message length” & “malloc failed” Error 해결 방법

Environment

  • SSL : PolarSSL-1.3.8
  • RTOS : FreeRTOS-8.1.2
  • Network Stack : Lwip-1.4.1
  • MCU : RealTek RTL8195a

문제

Wi-Fi 모듈에서 SKT ThingPlug에 SSL 연결을 위한 기능을 구현 하는 중, SSL 연결이 되지 않는 문제가 발생 하였다.

원인 분석

정확한 원인을 분석하기 위하여 Wi-Fi 모듈과 ThingPlug 간에 주고 받는 패킷을 캡쳐 하였다. 패킷 분석 결과, SSL 서버와 Hand Shake 과정이 정상적으로 완료 되지 않는 것을 확인 하였다.

20161201_103207

SKT ThingPlug Server와 정상적인 통신 패킷을 확인 해 보기 위해, PC에서 SSL 연결을 시도 해 보았다.
연결이 성공 하는 경우, 아래 그림과 같이 Client Hello -> Server Hello 이후 SSL 서버가 Certificate를 송신하는 과정을 볼 수 있다.

20161201_104837

Certificate 과정의 패킷을 보면, 4개의 인증서를 송신하는 것을 볼 수 있다. 인증서는 1개의 sktiot.com 인증서와 sktiot.com의 신뢰성을 보장해 주는 상위 기관 인증서 3개를 송신 한다.

20161201_110219

20161201_105209

위의 4개의 인증서를 수신하기 위해서는 5410bytes 이상의 메모리가 필요 할 것으로 보이며, 위에서 발생한 “bad message length” 에러도 Wi-Fi 모듈에서 SSL 인증서를 처리 하기 위한 메모리가 부족하거나 설정이 작은 값으로 되어 있는 것으로 판단 된다.

문제 해결

“bad message length” Error

Wi-Fi 모듈에서 에러를 출력하는 부분을 확인해 보면, 아래와 같이 수신된 ssl message length가 SSL_MAX_CONTENT_LEN 값 보다 크면 해당 에러를 출력하는 코드를 볼 수 있다. 현재 SSL_MAX_CONTENT_LEN 값이 4096으로 되어 있어서 그보다 더 큰 Contents를 수신하지 못 했던 것으로 판단 되며, 값을 6144( 6Kbytes )로 수정 하였다.

if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
{
    SSL_DEBUG_MSG( 1, ( "bad message length" ) );
    return( POLARSSL_ERR_SSL_INVALID_RECORD );
}

“malloc failed” Error

SSL_MAX_CONTENT_LEN 값을 수정 하고 테스트 해 보니, 이번에는 malloc failed 에러가 발생 하였다.

위는 Heap 메모리가 부족해서 출력된 에러로 판단 되며, FreeRTOSConfig.h의 configTOTAL_HEAP_SIZE의 값을 (70 1024) —> ( 80 1024 )로 수정 후 정상적으로 SKT ThingPlug에 SSL 연결이 되는 것을 확인 하였다.



저작자 표시
신고
이 댓글을 비밀 댓글로

ARM TechCon 2016 전시회 참관 후기

Posted by 카이젠8501 카이젠8501
2016.11.03 16:55 IT 개발/기타

ARM TechCon 2016 전시회 참관 후기

전시회장에는 크게 ARM 부스와 mbed 부스로 나누어져 있었고, 나머지 기업들의 부스는 작게 분포 되어 있었습니다. mbed 부스에는 WIZwiki-W7500ECO가 전시되어 있었습니다.
(가장 아랫줄 4번째에 위치해 있는 WIZwiki-W7500ECO 보드)

Techcon_01

전시회는 ARM과 협력하는 업체들로 구선되어 있었는데, 크게 SoC(Cadence, Synopsis 등), 소프트웨어 IDE(IAR 등), ARM 코어로 칩을 제작하는 회사(NXP, Renesas) 그리고 OS 및 클라우드(WIND River 등) 업체가 주를 이루었고 기타 대리점(Mouser)들이 있었습니다.

Multitech

우리가 중점적으로 주목한 곳은 mbed 부스였습니다. 먼저 커다란 화분 같이 생긴 부스가 눈에 띄었고 해당 부스로 발걸음을 옮겼습니다. 아래 그림에 있는 WaterBit이라는 이름의 제품은 Multitech라는 업체에서 mbed 플랫폼을 사용하여 만든 Prototype 제품이었습니다. 본 제품은 스마트 화분이고 Multitech에서 만든 게이트웨이와 클라우드 서비스를 이용하여 서비스를 제공합니다. 게이트웨이는 LoRa부터 Ethernet까지 각종 토신들을 원하는 대로 교체 장착 할 수 있게 되어 있었습니다.

Techcon_02

기타 mbed 부스

그리고 나서 옆에 mbed 부스들을 돌아보았는데, 전체적으로 우리가 지금까지 해왔던 펜타코드들과 크게 다르지 않았습니다. IoT 솔루션이라고 부르는 것들 모두 센서 그리고 클라우드 서비스로의 연결 범주를 벗어나지 않았습니다. 하지만 mbed에서 내세우고 강조하는 것은 mbed OS이며 이 OS 기반으로 모든 서비스와 어플리케이션이 가능하다는 점을 강조하는 것을 알수 있었습니다. 우리가 mbed 플랫폼을 제대로 이용하고 mbed Eco system과 융화 되기 위해서는, mbed OS는 선택이 아닌 필수가 될지도 모르겠다는 생각이 들었습니다. mbed 클라우드 또한 mbed OS 기반이었고 TLS 등의 Security 관련한 것들 또한 마찬가지였습니다.

다음은 mbed 전시회를 둘러보며 인상적이었던 것들을 소개 하겠습니다.

아래 그림의 Hexiwear는 NXP에서 나온 Smart Multimedia 개발 킷으로, 메인 제품에 도킹보드를 가지고 여러 가지 도킹 쉴드를 장착해 Wearable 기기들을 개발 할 수 있습니다. 초기에는 FreeRTOS와 Kinetics SDK로 개발환경이 구성되었지만 지금은 mbed Os 5로 변경되었다고 합니다.

Techcon_11

OpenAIS와 mbed-client, mbed OS를 이용하여 만든 원격으로 불을 On/Off 하는 Prototype과 스마트 팩토리 관련 Prototype 입니다.

Techcon_12

아래 그림은 작은 오락기( Tiny Arcade)이며, mbed 클라우드를 체험해 볼 수 있는 부스도 마련되어 있었습니다.

Techcon_13

저희 회사에 반가운 아두이노 부스도 볼 수 있었습니다. 아무래도 최근 아두이노 진영에서도 Cortex 계열 및 Linux를 위한 보드들이 많아 지면서 ARMTech Con에서 홍보를 하는게 아닌가라는 생각을 하였습니다. 오른쪽 사진은 Snap4Arduino라는 프로그램으로, 저희가 아는 스크래치 프로그램과 유사한 프로그램으로 소프트웨어 뿐 아니라 하드웨어 컨트롤이 가능하도록 개발된 프로그램입니다. Snap 쥬얼 프로그래밍 언어를 사용하여 쉽게 아두이노 보드를 컨트롤 할 수 있도록 개발된 것으로, 거의 모든 아두이노 보드를 지원하며 자동 환경 구성을 제공합니다. ( 참고로 무료이며, 한국어 지원이 가능합니다. )

Techcon_14

WindRiver

전시회장을 둘러보고 마지막으로 WindRiver 부스에 방문하였습니다. 아래 글은 WindRiver 기업을 소개하기 위한 페이지에 있는 글입니다. 글에 따르면 인텔의 자회사로 네트워크, 디지털 가전, 산업 및 자동화, 항공우주 및 방위산업, 모바일, 자동차 관련 부분 등 임베디드 관련 분야를 사업영역으로 하며 RTOS와 임베디드 리눅스 분야에서 인정 받고 있는 기업이라고 합니다.

임베디드 및 모바일 소프트웨어 분야에서 세계 시장을 선도하고 있는 윈드리버는 인텔의 자회사로 네트워크, 디지털 가전, 산업 및 자동화, 항공우주 및 방위산업, 모바일, 자동차 관련 부분 등 임베디드 기술이 필요한 거의 모든 분야를 사업 영역으로 하고 있습니다. 1981년부터 지난 30년간 임베디드 장비 내부의 컴퓨팅 환경 개선을 위해 노력해 왔으며 그 기술은 5억 개 이상의 제품에 적용되어 왔습니다.
 임베디드 소프트웨어 중에서도 OS분야에 있어서 강한 두각을 나타내고 있는 윈드리버는 글로벌 시장 조사 기관인 VDC 리서치 그룹이 발표한 2012년 “임베디드/실시간 운영 시스템”보고서에서 시장을 주도해 온 리더 기업으로 선정된 바 있습니다. 이 보고서에 따르면 윈드리버는 실시간 운영 시스템, RTOS 분야에 있어서 ‘VxWORKS’관련 제품 및 서비스를 통해 전세계 시장 매출의 40%이라는 기록적인 점유율을 달성했으며, 리눅스 플랫폼 및 관련 솔루션으로 전체 시장 매출액의 50 % 이상을 차지하면서 임베디드 리눅스 시장에서도 연속 4년째 리더 기업으로 인정받아 왔습니다. 윈드리버의 이와 같은 경이로운 시장 점유율은 2위 기업의 2배에 달하는 것으로 나타나 독보력인 리더십을 증명했다고 할 수 있습니다. 
또한 최근 주목 받고 있는 안드로이드 분야에서도 매우 활발한 활동을 벌이고 있는데, 윈드리버는 구글의 OHA(Open Handset Alliance) 창립 멤버로서 고객들이 실제적으로 시장에 영향력있는 모바일 제품을 출시할 수 있도록 강력한 안드로이드 서비스 비즈니스를 성공적으로 구축해 왔습니다. 뿐만 아니라 영향력 있는 다양한 오픈 소스 프로젝트 참여를 비롯해 모바일 기술 발전에도 많은 공헌을 하고 있습니다. 
아울러 윈드리버는 GENIVI 연합의 창립멤버로 GENIVI 플랫폼과 안드로이드 등 다양한 리눅스 기반의 자동차 플랫폼 분야에서도 영향력을 발휘하고 있습니다.

ARM TechCon 부스에서는 VxWORKS라는 RTOS와 HELIX라는 클라우드 시스템을 소개 하고 있었습니다. VxWORKS는 Cortex A, M, R에서 동작 할 수 있다고 설명 되었으나, CortexM0/M0+급의 MCU에서는 WindRiver Rocket이라는 RTOS를 사용하라고 권유 받았습니다. 현재 WindRiver Rocket은 Zephyr라는 새로운 이름의 프로젝트로 서비스 하고 있습니다.

Techcon_15

WindRiver의 서비스들을 이용하기 위한 SDK를 제공하고 있었으며, 아래 그림과 같이 특정 플랫폼에 대한 템플릿 예제와 온라인 컴파일러들을 제공함으로써 마치 ARM mbed와 같은 생태계를 만들려고 하는 것 처럼 보였습니다. 현재 SDK List에는 대부분 리눅스급의 퍼포먼스를 요구하는 디바이스들이 등록되어 있고, Cortex계열은 Freescale Freedom K64F 가 유일합니다. 하지만 이 보드 역시 Cortex M4 급으로 우리 칩 W7500/W7500P이 해당 SDK 리스트에 등록 가능한지는 조금 더 검토가 필요 할 것 같습니다.

Techcon_16

현재는 WindRiver 담당자에게 연락처를 남겨 놓은 상태이고, 해당 담당자를 통해 저희 보드가 WindRiver SDK 리스트에 등록하기 위해서는 어떤 절차가 필요한지 문의 해 놓은 상태 입니다


저작자 표시
신고
이 댓글을 비밀 댓글로

mbed connect 2016 참관 후기

Posted by 카이젠8501 카이젠8501
2016.11.03 16:42 IT 개발/기타

mbed connect

mbed connect 일정동안 keynote 발표를 들으면서, ARM이 강조하고 싶은 2 Keyword는 mbed os, Security 라는 생각이 들었습니다.

특히 아래 그림에서 볼 수 있듯이, ARM에서는 TrustZone 기능이 추가/보완 된 ARM-v8M 아키텍쳐 기반의 H/W를 사용하고 그 위에 mbed os 를 S/W로 사용하면 보안에 강력한 임베디드 디바이스를 구성 할 수 있다고 설명하고 있습니다.

01_mbedconnect

Security

현재 보안이 매우 중요해지고 있음에도 불구하고, 소형 임베디드 디바이스는 제한적인 보호 상태이거나, 개발자에게 높은 전문 기술 지식을 요구하는 소프트웨어 관리 보안 시스템에만 의존하고 있는 상황이라고 합니다. 이에 마이크 뮬러(Mike Muller) ARM 최고기술책임자(CTO)는 ARMv8-M에 구현된 하드웨어 아키텍처 보안을 적용시킴으로써 훨씬 더 쉽게 보안을 구축하고 효율적으로 실행할 수 있도록 도울 수 있다고 설명하였습니다.

ARMv6-M & ARMv7-M 대비 ARMv8-M의 특징은 아래와 같습니다. 아직까지는 ARMv8-M 아키텍처 기반의 Core(예, Cortex-M0,M0+ ….)는 존재하지 않으나, Cortex-M0,M0+와 대응되는 제품군을 ARMv8-M baseline으로 Cortex-M3,M4,M7과 대응되는 제품군을 ARMv8-M mainline으로 전환 할 것으로 보입니다.

02_mbedconnect

기존 아키텍처(ARMv6-M,ARMv7-M)와 가장 큰 특징적인 차이는 ARM TrustZone 기능의 추가 이며, TrustZone은 여러 방식으로 변이되는 소프트웨어 공격 및 일반 하드웨어 공격을 막아 낼 수 있는 향상된 기술을 저렴한 비용으로 구현하기 위해 개발 되었다고 합니다.
TrustZone은 아래 그림과 같이 Non-secure state(RTOS와 Application)와 암호화 및 Key 매지니먼트, 무결성 검사와 같은 민감한 작업을 처리하는 Secure state 사이에 독립성을 제공합니다.

03_mbedconnect

이 아키텍처의 가장 큰 핵심은 별도의 보안 구역(trusted)을 만들어 이 안에서 작업을 한 후 정보를 박스에 넣고 열쇠를 채워 비신뢰 보드로 넘기게 되는데, 이 비신뢰 모드에서는 이 박스가 어떻게 생겼고 열쇠가 어떻게 잠겼으며 그 안에 어떤 내용이 채워져 있는지 볼 수 없게 하는 방식 입니다.

간단하게 정리하면, ARM은 ARMv8-M 아키텍처를 사용하여 SoC 레벨에서 Security를 위한 기능을 제공하고 있으며 기존 Software 레벨에서 제공하는 보안 기술(ex, SSL/TLS)와 같이 사용하여 보다 더 강화된 보안을 보다 더 쉽게 사용 할 수 있다고 강조 하고 있습니다.

하지만 아직 ARMv8-M 아키텍처를 이용한 Core가 시중에 나와 있지 않은 관계로, 위즈네트에서는 조금 더 시간을 가지고 ARMv8-M 아키텍처를 사용한 Core들의 동향을 지켜 봐야 할 것 같습니다.

mbed OS

이전 mbed OS 2(“Classic”), mbed OS 3 (“Eventing OS”)와 비교하여 가장 큰 차이점은, mbed OS 5에는 RTOS, connectivity, security component가 maintenance core로 포함되었다는 것입니다. 이전에는 분리 되어 있던 Network Stack과 mbed cloud client가 포함되고, 보안을 위한 mbed TLS, Security APIs(mbed uVisor)가 추가 된 것을 볼 수 있습니다.
Network Stack에는 Ethernet, BLE, Wi-Fi, 6LoWPAN, Thread 등이 있습니다.

05_mbedconnect

mbed OS 또한 Security를 강조하고 있으며, 이를 반영하기 위해 mbed OS의 구조를 조금씩 업그레이드 하고 있음을 확인 하였습니다. 앞에서 설명한 내용은 Hardware(SoC) 측면에서 보안 기술을 적용하는 반면, mbed OS는 mbed TLS, mbed uVisor를 이용하여 Software 측면에서 보안 기술을 개발하고 적용하였습니다.

04_mbedconnect

mbed OS에서는 Security code compartment, Communication security, Lifecycle security로 나누어서 IoT 단말의 보안을 관리 합니다.

06_mbedconnect

Security code compartment ( uVisor )

먼저 Security code compartment를 위해서는 uVisor라는 기술을 사용하는데, mbed uVisor는 OS에서 가장 하위 계층에 위치하며, MPU(Memory Protection Unit)을 통해 Cortex-M3, M4, M7 Core 상에 ‘boxes’라고 명 명하는 격리된 보안 영역(예, 샌드박스)을 생성하는 일종의 하이퍼바이저 로써 기기 자체 보호 기능 입니다.

uVisor의 주요 기능은 ACLs(Access Control Lists)이며, 아래 그림을 보면 ACLs의 개념을 쉽게 이해 할 수 있습니다. User는 uVisor를 통해 Application 혹은 Task를 Box로 묶어서 관리 할 수 있고, 해당 Box만 접근 할 수 있는 MCU의 Peripheral 들을 지정 할 수 있습니다. 예를 들어 User가 Box1이라고 지정한 Application에서는 Timer와 UART만 사용할 수 있도록 설정해 놓았는데, Flash나 I2C와 같은 Peripheral을 사용하려면 Memory Fault와 같은 Error를 발생시켜 OS 내에 악성코드나 외부의 공격 코드로부터 훼손된 시스템 컴퍼넌트, 드라이버로 부터 Box를 보호 할 수 있다는 개념입니다.

08_mbedconnect

Communication Security

SSL은 안전하지 않은 데이터를 암호화 하여 안전하게 전달하기 위해 사용 합니다. SSL 버전 1은 실제로 발표 되지 않았었고, SSL 버전 2가 공개 적으로 발표되었는데 많은 보안 취약점이 있었다고 합니다. 그래서 그것을 보완한 버전이 SSL 버전 3이며 공식적으로 표준화 한 이름이 TLS 입니다. 이를 같이 묶어서 SSL/TLS라고 부릅니다.
mbed에서는 mbedTLS를 지원 함으로써 데이터를 암호화 하여 송/수신 할 수 있는 기능을 제공하고 있습니다.

Lifecycle Security

mbed cloud client에서는 Key Value, Device ID 및 특정 설정 값들을 이용하여 Device의 상태를 관리 하거나 제어 할 수 있는 기능을 제공합니다. 또한 Device의 Firmware도 원격에서 Upgrade 및 Downgrade 하는 기능도 제공합니다.

Conculution

mbed OS를 사용하여 mbed에서 추구하는 보안 기능을 사용하기에는 W7500, W7500P의 한계를 확인 할 수 있었습니다. 우선 Cortex M0/M0+에서는 MPU(Memory Protected Unit)을 지원하지 않기 때문에 Secure code를 보장하기 위한 uVisor 기능을 사용할 수 없습니다.
또한 W7500, W7500P는 RAM size가 부족하여 mbed TLS와 같은 Communication Security의 사용도 어려운 것으로 판단 됩니다.

IoT 서비스가 활성화 되면서 경량 기기에 대한 다양한 기능적 요구가 증가함에 따라 OS 운영이 불가피하게 되었고, 인터넷 연결 특성으로 인한 보안 위협에 대한 대비도 강조되고 있습니다. 이에 위즈네트는 mbed OS와 mbed Security 및 mbed 이외의 다른 RTOS 및 Security를 사용할 수 있을 만큼의 퍼포먼스를 가진 MCU 라인업을 구축 하기 위한 방안을 장기적으로 고려 해 봐야 될 것 같습니다.

그래도 Connectivity 쪽으로 접근하면 희망적으로 WIZnet과 ARM mbed가 공생할 수 있는 포인트들이 있다고 생각합니다. 예를 들어, ST, Freescale 등 다른 회사의 MCU에 mbed OS를 사용하고 Wi-Fi 및 Ethernet Interface를 사용하고 싶은 경우 WizFi250/WizFi310 및 WIznet의 Ethernet Module들을 활용 할 수 있도록 가이드 할 수 있습니다.

단, 위의 모듈들이 mbed OS를 활용하는 고객들을 만족시키기 위해서는, WIZnet 모듈에 대한 mbed OS 라이브러리 지원 및 유지 보수 작업에 지금 보다 더 많은 시간을 투자 해야 한다고 생각합니다.
( *참고 : 이미 WizFi250과 Ethernet Module을 mbed platform 에서 사용할 수 있도록 라이브러리나 드라이버가 준비되어 있지만, 이는 상위 버전(ex, mbed OS5)과 호환이 안됨. 즉, mbed OS5를 위한 갱신된 라이브리 필요. )


참고자료 

- http://aqwerf.tistory.com/12

- http://www.insightsemicon.com/news/article.html?no=128289

- http://m.autoelectronics.co.kr/article/articleView.asp?idx=1904

- https://gigglehd.com/zbxe/newsreport/13542447

- http://blog.daum.net/_blog/BlogTypeView.do?blogid=0Idbt&articleno=7593753&categoryId=404972&regdt=20151005145502




저작자 표시
신고
이 댓글을 비밀 댓글로

W7500 TCP Network Speed Test using WIZwiki-W7500ECO

Posted by 카이젠8501 카이젠8501
2015.10.08 15:13 IT 개발/기타

W7500 TCP Network Speed Test using WIZwiki-W7500ECO

WIZwiki-W7500ECO

WIZnet WIZwiki Platform based on WIZnet’s MCU. WIZnet WIZwiki-W7500eco is a WIZwiki platform board based on W7500. The IOP4IoT W7500 chip is one-chip solution which integrates an ARM Cortex-M0, 128KB Flash and hardwired TCP/IP core for various embedded application platform especially internet of things. If you use WIZwiki-W7500eco, you will be able to easily develop a prototype.

wizwiki-w7500eco3dtop

Test Scenario

  • WIZwiki-W7500ECO

    • Run TCP Echo Server which receive data and then send to tcp client.
  • PC

    • Run TCP client using my test tool.
    • It can be used for simple tcp test and check tcp speed.

To check TCP speed of WIZwiki-W7500, I upload TCP echo server binary to WIZwiki-W7500ECO.
I send data which is 1Mbytes to WIZwiki-W7500ECO using my test tool and then test tool will receive data from WIZwiki-W7500ECO for checking TCP communication speed.

20150826_220148

Test Result

Test Condition 1

There are change points for this test.

  • Change System Clock ( 20MHz, 48MHz )
  • Change RAM buffer ( 2048, 4096, 8192 )

20150826_184249

Comment about Test Condition 1

WIZwiki-W7500ECO TCP Speed depended upon it’s system clock. After test, I got result as below.

  • Buffer size of variable in the code didn’t make much difference to the speed.
  • When using 20MHz of WIZwiki-W7500ECO’s system clock, average speed is 4.7Mbps.
  • When using 48MHz of WIZwiki-W7500ECO’s system clock, average speed is 8.5Mbps.

Test Condition 2

W7500 has one 16KB TX memory for Socket n TX Buffer Blocks and one 16KB RX memory for Socket n RX buffer Blocks.

16KB TX memory is initially allocated in 2KB size for each Socket TX Buffer Block (2KB X 8 = 16KB). The initial allocated 2KB size of Socket n TX Buffer can be re-allocated by using ‘Socket n TX Buffer Size Register (Sn_TXBUF_SIZE)’. Once all Sn_TXBUF_SIZE registers have been configured, Socket TX Buffer is allocated with the configured size of 16KB TX Memory and is assigned sequentially from Socket 0 to Socket 7. Its physical memory address is automatically determined in 16KB TX memory. Therefore, the total sum of Sn_TXBUF_SIZE should not exceed 16 in case of error in data transmission.

wztoe_memory_map

There are chage point for second test.

  • Change Socket RX/TX Buffer of W7500 ( 2048, 8192, 16,384 )

20150827_083215

Comment about Test Condition 2

  • Socket TX/RX buffer size didn’t make much difference to the speed.
  • When using 2Kbytes of Socket buffer, average speed is 8.116Mbps
  • When using 8Kbytes of Socket buffer, average speed is 9.099Mbps
  • When using 16Bytes of Socket buffer, average speed is 9.142Mbps


저작자 표시
신고
이 댓글을 비밀 댓글로
    • 이청열
    • 2017.01.23 15:35 신고
    좋은 글 감사합니다.

    혹 PC에서 실행한 Test Toll을 어디서 구할 수 없나요?
    • 안녕하세요.^^
      아래 주소에 가시면 실행파일을 다운로드 하실 수 있습니다.
      https://github.com/kaizen8501/IPV6_TestTool/blob/master/Release/S2E_TestTool(20150828).exe

      코드가 필요하시다면 아래 주소를 참고 하시기 바랍니다.
      https://github.com/kaizen8501/IPV6_TestTool

      출처: http://kaizen8501.tistory.com/108#comment11622035 [카이젠의 임베디드 DIY 공작소]

IPv6 Ready Log Phase-2 테스트 환경 구축

Posted by 카이젠8501 카이젠8501
2015.10.08 15:08 IT 개발/기타

IPv6 Ready Log Phase-2

Environment

20150703_081923

Needed Tools

Install FreeBSD-7.3

You can download FreeBSD image file at this Link.
If you want to download FreeBSD-7.3, Use this Link.

Installing perl-relatd modules

# (cd /usr/ports/lang/p5-Expect && make install)
# (cd /usr/ports/security/p5-Digest-MD5 && make install)
# (cd /usr/ports/textproc/p5-YAML && make install)

Install IPV6 Evaluation Platform

Download v6eval-3.3.3.tar.gz

# tar zxvf v6eval-3.3.3.tar.gz
# cd v6eval-3.3.3
# make
# make install

After installing platform, You can see the new directory at /usr/local/v6eval

Install ct package : ct-2.1.1

This is IPv6 conformance test package.

# tar -xvf ct-2.1.1.tar.gz
# cp -rf ct-2.1.1 /usr/local/v6eval/
# cd /usr/local/v6eval/ct-2.1.1
# make install

Install Ipv6 Self Test Script : Self_Test_5-0-0

# tar -xvf Self_Test_5-0-0.tar
# cp -rf Self_Test_5.0.0 /usr/local/
# vi /etc/rc.conf
  ipv6_enable="YES"
  ifconfig_fxp0="up"
  ipv6_network_interfaces="fxp0"
  ipv6_default_interface="fxp0"
# cd /usr/local/v6eval/etc
# cp tn.def.sample tn.def
# cp nut.def.sample nut.def

Interface might change other name as em0. It is dependet on environment of TN(Tester Node).

  • em : Intel(R) PRO/1000 Gigabit Ethernet adapter driver
  • fxp : Inter(R) PRO/100 Ethernet device driver

Modify tn.def and nut.def

# vi /usr/local/v6eval/etc/tn.def

tn.def

  • Added # at Remote Controal Configuration as below.
  • Deleted # at filter ipv6.
  • Added link name
#
# tn.def
#
#  Information about the Tester Node (TN)
#

#
# Remote Controal Configuration
#
#RemoteDevice    cuad0
#RemoteDebug    0
#RemoteIntDebug    0
#RemoteLog    1
#RemoteSpeed    0
#RemoteLogout    0
#RemoteMethod    serial
filter    ipv6

#linkname    interface    BOGUS ether source address
#        name        of the Tester Interface
Link0        em0        00:0C:xx:xx:xx:xx
#Link0        ed0        00:00:00:00:01:00
#Link1        de1        00:00:00:00:01:01
#Link2        de2        00:00:00:00:01:02
#Link3        de4        00:00:00:00:01:03

nut.def

Wirte information of NUT which you want to test at nut.def as below.
You have to change “HostName” and link information.

#
# nut.def
#
#  Information about the Node Under Test (NUT)
#

# System type
System        manual

# System information
TargetName    FreeBSD/i386 4.9-RELEASE + kame-20040726-freebsd49-snap

# Name
#HostName    target.tahi.org
HostName     kaizen-a34x

# Type
#   host, router, special
Type        host

# Super user name and it's password
# if you select manual as "System", you don't care "User" and "Password"
#
User        root
Password    v6eval

#linkname    interface    The EXACT ether source address
#        name        of the Interface Under Test
Link0         eth0       00:E0:xx:xx:xx:xx
#Link1        fxp1       00:00:92:a7:6d:f6
#Link2        de0        00:c0:f6:b0:aa:ef
#Link3        de1        00:00:92:a7:6d:f8
#Link4        de2        00:90:27:14:ce:e3

To run the test

If NUT is a host, You can execute these command for test. When all tests are completed, you can see the results at /usr/local/Self_Test_5-0-0-/index.html

# cd /usr/local/Self-Test-5-0-0
# make ipv6ready_p2_host

At the NUT side, You can see to communicate ipv6 packet using wireshark.

20150703_103122


저작자 표시
신고
이 댓글을 비밀 댓글로

[C언어]문자열에서 특정 문자열 추출 하기

Posted by 카이젠8501 카이젠8501
2014.01.01 23:51 IT 개발/기타

문자열에서 특정 문자열 추출 하기

char *index  (char *str1, char ch) 는 문자열 str1을 처음부터 검색하여 ch 문자를 찾아 포인터를 리턴 한다.

char *rindex (char *str1, char ch) 는 문자열 str1을 뒤부터 검색하여 ch 문자를 찾아 포인터를 리턴 한다.


문자열을 찾지 못하면 NULL을 리턴한다.



위 함수를 사용한 예제는 아래와 같습니다. ( 아래 예제는 forum.falinux.com 에서 사용한 예제를 참고 하였습니다. )


#include <string.h>

#include <stdio.h>


int main()

{

char data[] = "[Connect 0]";

char *sp, *dp;

char mydata[100] = {0x00,};


sp = index(data,' ');

dp = rindex(data,']');


strncpy(mydata, sp+1, dp-sp-1);

printf("[%s]\r\n",mydata);

}


결과는

[0]

입니다.



저는 위와 동일한 동작을 AVR 기반의 Arduino MCU에서 수행하려고 하니, AVR 라이브러리에는 index()와 rindex() 함수를 이용 할 수 없었습니다. 때문에 저는 아래와 같이 사용 하였습니다.


#include <string.h>

#include <stdio.h>


int main()

{

char data[] = "[Connect 0]";

char *sp, *dp;

char mydata[100] = {0x00,};


sp = strstr(data," ");

dp = strstr(data,']');


strncpy(mydata, sp+1, dp-sp-1);

printf("[%s]\r\n",mydata);

}


결과는

[0]

입니다.



저작자 표시
신고
이 댓글을 비밀 댓글로