2014년 5월 6일 화요일

NanoQplus is IPv6 Ready!



NanoQplus가 IPv6 Ready 로고를 획득했다. IPv6 Ready는 IPv6 Forum이 주관하는 인증 프로그램으로 어떤 장치가 IPv6 통신을 수행하기에 적합한지에 관한 것이다. IPv6 통신을 수행하기에 적합하다는 것은 IPv6 패킷을 수신하여 올바르게 처리하고, 또 올바른 IPv6 패킷을 송신하는 것을 뜻하며, 이는 곧 타 IPv6 장비와 문제없이 통신이 가능함을 뜻한다.

IPv6 Ready는 IPv6를 구현함에 있어서 정상적인 동작을 검증하기에 좋은 방법이다. IPv6 Ready는 장치와 프로토콜의 종류에 따라 여러가지 버전이 있지만, 이 글은 Core Protocols Phase 2만 대상으로 한다. 난 Host 버전만 했는데, Router 버전은 Host 버전에 비해 테스트 항목이 월등히 많이 늘어날 뿐, 그 근본적인 개념은 거의 비슷하지 않을까 싶다. 물론, 우리나라에 직접 IPv6를 구현하려는 사람이 얼마나 있을지는 모르겠지만, 혹시나 이런 삽질을 시작하려는 분들께 도움이 되길 바라며 메모를 남겨본다.

IPv6 Ready는 기본적으로 Ethernet 장치를 가정하고 있다. 사실, IPv6는 네트워크 계층이므로, 링크 계층에 상관없어야 하지만, IPv6 Ready는 링크 계층에 의존적인 Neighbor Discovery까지 시험 범위에 두고 있다. NanoQplus는 본래 IEEE 802.15.4 WPAN 기반으로 통신하는 하드웨어를 타겟으로 하는 운영체제이기에 Ethernet을 지원하는 하드웨어에 올려서 시험해봐야 했다. 우리 연구실은 씨알지 테크놀러지(주)에 의뢰하여 Mango-EToI라는 보드를 제작했다. 그리고 그 위에 NanoQplus를 포팅하였다.


Mango-EToI는 STM32F103VCT6 ARM Cortex-M3 기반의 보드이며, (페이지에는 STM32F2xx인 것으로 나와있는데, 내가 갖고 있는 보드는 STM32F103이다.) 2개의 통신보드 커넥터와 센서나 기타 장치를 연결할 수 있는 확장 커넥터로 구성되어 있다. 통신보드에는 2.4GHz IEEE 802.15.4를 지원하는 CC2520, Sub-1GHz IEEE 802.15.4를 지원하는 CC1120과 Ethernet을 지원하는 ENC28J60 칩으로 구성된 보드들이 있다. NanoQplus에서는 이 보드들을 메인보드의 어떤 포트에 연결하든지 따라 환경설정을 통해 유연하게 구성할 수 있다. Application code는 NanoQplus 저장소에 있다.

IPv6 Ready는 conformance test, interoperability test 등 두 가지 시험이 있으며, 이 두 시험을 모두 통과하여야 한다. Conformance test는 기본적인 패킷 처리를 테스트하는 것으로 conformance test tool이 설치된 FreeBSD 머신과 크로스케이블로 연결하여 테스트한다. 대부분 테스트 항목들이 자동으로 넘어가며, 일부는 수동으로 보드를 직접 리셋해주며 넘어가는 식이다. 여기까지는 그냥그냥 할만하다. 물론, NanoQplus의 IPv6는 리눅스 커널같은 오픈소스를 이용하지 않고 scratch부터 시작해서 쌩짜로 작성한 것이기 때문에, 버그들을 때려잡고 이해안가는 RFC 문서들을 이해하고 구현하느라 오래 걸렸다.

Interoperability test는 4대의 서로 다른 제조사가 만든 IPv6 장치(호스트 2대, 라우터 2대)로 여러 형태의 네트워크 토폴로지에서 상호운용성을 시험하는 것을 말한다. NanoQplus는 OpenWrt Linux와 FreeBSD를 라우터로 사용하고, Apple MacBook Air와 MS Windows XP를 호스트로 사용했다. Interoperability test도 자동으로 하는 방법도 있지만, 모든 장치들이 BSD 계열이어야 가능한 관계로 그냥 수동으로 진행했다. 이 테스트는 conformance test에 비해 항목 수가 엄청나게 적지만, 매 항목마다 서로 다른 토폴로지를 구성하는게 오래걸린다.


Interoperability test 중 가장 애먹었던 부분은 이더넷 멀티캐스트 부분이다. IPv6는 이더넷 브로드캐스트를 사용하는 IPv4와 달리, DAD (Duplicate Address Detection) 등을 위해서 스코프가 한정된 멀티캐스트(i.e., all nodes, all routers)를 사용한다. 이러한 멀티캐스트 패킷은 목적지 주소로 IPv6 멀티캐스트 주소를 사용하며, 이 주소는 RFC 2464에 따라 이더넷 멀티캐스트 주소로 매핑된다. 통상의 스위치 허브들은 이더넷 멀티캐스트 프레임을 모든 포트로 내보내지 않는다. 즉, 어떤 포트로 이더넷 멀티캐스트 프레임이 들어가면, 스위치는 각 포트에 연결된 장치의 MAC 주소에 따라서 내보낼지 안내보낼지 여부를 결정하는 것이다. 이러한 이유로 시험 결과서 제출시 함께 제출해야 할 패킷 캡쳐를 하는 것도 불가능하고, DAD 같은 것은 시험 자체를 진행하는 것이 불가능했다. 구글링 결과, 통상의 스위치 허브보다 훨씬 다양한 기능을 제공하는 managed switch가 있으면 해결이 된다. Managed switch에는 모든 포트로부터의 입력 패킷들을 관찰할 수 있는 포트 미러링 기능이 있어 패킷 캡쳐할 때 사용할 수 있고, 멀티캐스트 프레임을 강제로 모든 포트로 내보내게 하는 등 설정을 할 수 있다. 다행히 연구실에 여분의 스위치 중 managed switch인 Cisco 300 스위치가 있어서 시험을 성공적으로 진행할 수 있었다.

모든 시험 항목이 완료되면, IPv6 Ready 사이트를 통해 시험결과서를 제출하면 된다. 제출 시 examination lab을 선택해야 하는데, 우리나라에는 TTA가 이 역할을 한다. TTA는 시험결과서를 검토하고 미비한 부분에 대해서 알려주게 된다. 그러면 다시 부족한 부분을 고쳐서 올리고, 이런 과정을 반복해서 최종적으로 TTA가 리뷰를 완료하게 되면, 타 lab들에 의한 public review까지 거쳐서 최종적으로 로고를 획득하게 된다. IPv6 Ready 사이트를 거치지 않고, TTA를 통해서 바로 시험 진행이 가능하기도 하다. 이러한 경우 비용은 조금 더 올라가지만 테스트별 삽질을 대행해주니 개발자의 정신건강에 도움이 되기도 할 것 같다. NanoQplus의 경우 앞서 언급한대로, scratch 단계에서부터 손수 구현한 것이라 시험하면서 디버깅을 해야 해서 사실상 시험대행이 불가능했던 점은 있다. 하지만, 이런 경우가 아니라면 TTA Verified 인증을 통해 대행 서비스를 이용할 것을 강추(!!)한다.

TTA의 리뷰를 거치면서 MS Windows 7에 얽힌 에피소드도 있다. MS Windows 7은 interoperability test 중 호스트로 사용했었는데, 표준대로 동작하지 않는 Windows 7 때문에 일부 항목을 Windows XP로 바꿔서 다시 진행했어야 했다. 시험 항목 중에 all nodes link-local multicast 주소로 ping을 보내면 응답이 오는지 여부를 검사하는 것이 있었는데, 이게 문제가 되었다. Windows 7에서 all nodes link-local multicast (ff02::1)로 ping을 보내면, 타겟장치가 이에 해당되기 때문에 응답을 한다. 반면, 타겟장치에서 ping을 보내면, Windows 7은 멀티캐스트 멤버이어야 함에도 응답하지 않는다. 방화벽을 풀어봐도 소용없다. 그냥 보안상의 이유로 막아놓은 것으로 보인다. 그래서 결과보고서에 코멘트를 달아서 보냈는데, TTA에서 이를 지적한 것이다. 결론은 호스트를 바꿔야 한다는 것. 결국 Windows XP 노트북을 동원해서 몇가지 실험을 다시 해서 보냈다.

인증이 완료된 것은 3월이고, ETRI 차원에서 보도자료가 나간 것은 4월. 계속 마음속으로 '블로그에다 글 하나 남겨야 하는데...' 하고 생각만하다가 드디어 포스팅을 하였다. 이 글을 쓰면서 다시 지난 날들을 돌이켜보니 힘들었던 순간들이 다시금 떠오른다.ㅎㅎ 참고로, 모든 시험을 끝내고 IPv6 Ready에 등록했던 순간이 2014년 1월 31일 설날 밤 12시를 막 넘긴 시점이었다. 곧 끝낼 수 있으리란 마음으로 설 연휴 첫날에도 출근해서 야근을 했었고, 저녁도 거른체 마무리를 지은게 밤 12시. 설날 밤 12시에 편의점에서 컵라면 한 그릇 먹고 집에 들어가 잤던 기억이 난다. 그 때 그 순간의 심정은 참...ㅎㅎㅎ

블로거에서 구글 웹 폰트 사용하기

네이버 블로그에서 벗어나 Blogger에 적응 중인 여자친구를 위해 바칩니다.ㅋ

1. 구글 웹 폰트

https://www.google.com/fontshttp://www.google.com/fonts/earlyaccess

2. 마음에 드는 글꼴 찾았으면, CSS에 추가.

'Blogger 템플릿 디자이너' - '고급' - 'CSS 추가'
link 태그를 사용하던가, import를 사용하던가 해서 CSS에 추가

3. 블로그 글 쓰기 편집기에서 'HTML'로 바꾸고, 바꾸고자 하는 영역을 <span> ~ </span> 태그로 지정

4. <span style="font-family: ~~~">로 폰트 지정

<span style="font-family: 'Nanum Brush Script', cursive;">나눔 붓 글씨</span>

나눔 붓 글씨

5. 페이지 전체의 글꼴을 바꾸고 싶은 경우, 템플릿 HTML 편집

템플릿마다 다를 수 있지만, 대충 비슷비슷할 듯?

<head>~</head> 내에 <Variable name="body.font" description="Font" type="font" default="~~~" value="~~~"/>를 찾아서, default와 value 값을 원하는 폰트로 바꿔주면 됨.

자세한 것은 레이아웃용 글꼴 및 색상을 참고하세요. :)

끝!