NATM(4)

명칭
natm - native mode ATM 프로토콜층

해설
BSD ATM 소프트웨어는 native mode ATM 프로토콜층을 포함해, AAL0 와 AAL5 의 가상 회선 (버추얼 서킷) 에의 소켓 레벨의 액세스를 제공합니다. 본프로토콜층을 유효하게 하려면 , 커널 설정 파일에
    options NATM
(을)를 더해 커널의 재구축을 실시해 주세요 (그 때 “make clean” (을)를 잊지 않고 가 주세요).

NATM API
NATM 층에서는 가상 회선을 지정하기 위해서 struct sockaddr_natm (을)를 사용합니다:

    struct sockaddr_natm {
      u_int8_t      snatm_len;              /* 길이 */
      u_int8_t      snatm_family;           /* AF_NATM */
      char          snatm_if[IFNAMSIZ];     /* 인터페이스명 */
      u_int16_t     snatm_vci;              /* vci */
      u_int8_t      snatm_vpi;              /* vpi */
    };

VPI 0, VCI 201 의 가상 회선에 AAL5 connection를 작성하려면 다음과 같이 합니다:

      struct sockaddr_natm snatm;
      int s, r;
      s = socket(AF_NATM, SOCK_STREAM, PROTO_NATMAAL5);
                           /* 주: PROTO_NATMAAL0 는 AAL0 입니다 */
      if (s < 0) { perror("socket"); exit(1); }
      bzero(&snatm, sizeof(snatm));
      snatm.snatm_len = sizeof(snatm);
      snatm.snatm_family = AF_NATM;
      sprintf(snatm.snatm_if, "en0");
      snatm.snatm_vci = 201;
      snatm.snatm_vpi = 0;
      r = connect(s, (struct sockaddr *) &snatm, sizeof(snatm));
      if (r < 0) { perror("connect"); exit(1); }
      /* 이상으로 s 가 ATM 에 접속되었습니다!  */

socket() 콜은 단순하게 미접속의 NATM 소켓을 작성합니다. connect() 콜은 미접속의 NATM 소켓을 가상 회선에 연결시켜 데이터의 수신을 위해서(때문에) 그 가상 회선을 유효하게 하도록(듯이) 드라이버에 통지합니다. connect() 콜의 실행 후, 그 소켓에 대해 read() 또는 write() (을)를 사용해 ATM 입출력을 실시합니다.

내부의 NATM 조작
내부적으로, NATM 프로토콜층은 그 시스템상의 모든 액티브한 가상 회선의 리스트를 natm_pcbs (으)로 유지하고 있습니다. 이것은, NATM 와 IP 가 가상 회선상에서 충돌하는 것을 막기 위해서(때문에), 그 때 IP 로 사용중의 회선을 포함합니다.

가상 회선의 데이터 수신이 유효화 되면(자), NATM 프로토콜층은 프로토콜 제어 블록의 주소를 수신 “핸들” (으)로서 드라이버에 건네줍니다. 입력 데이터가 도착하면(자), 드라이버는 적절한 수신 핸들과 함께 데이터를 돌려줍니다. NATM 층은, 프로토콜 제어 블록의 검색의 오버헤드를 피하기 위해서(때문에), 이 정보를 사용합니다. 이것에 의해, ATM 가 이미 데이터를 데마르치프레크스 되어 있는 결과를 이용할 수가 있습니다.

그 외의 NATM 의 문제
우리는 현재 비디오 서버 프로젝트에 임하고 있어 그 구성의 일부로서 이 드라이버를 사용하고 있습니다. 우리의 수중에는 우리의 작성한 MMX 로 불리는 디바이스가 있습니다. 비디오 카메라를 MMX 에 접속해, 비디오 출력을 AAL0 의 셀 스트림로서 송신시킬 수가 있습니다. 물론 이 스트림은 꽤 빠르고 (실제로 대용량입니다! ), 본드라이버의 통상의 AAL0 에의 처리에서는 대처할 수 없습니다 (여러분은, 작은 mbuf 마다의 셀을 어플리케이션에 작성시키려고 시도하겠지요. 그러나, 소켓층이 그 종의 데이터 스트림의 처리를 따라갈 수 없는 것을 알 수 있습니다). 이 문제를 해결하기 위해(때문에), 우리는 “raw” 모드를 실장했습니다. 이것은, 카드로부터 얻은 미처리의 AAL0 의 정보를, 큰 데이터의 덩어리로 처리합니다. 소켓층이 이상한 행동을 하는 것 없고, 이 데이터를 리얼타임에 디스크에 보존할 수가 있습니다. 공교롭게도, 그 데이터내에는 RBD (receive buffer descriptors: 수신 버퍼 기술자) 및 셀 헤더가 포함되어 있습니다만, 이것은 수중에 넣어 후에 제거하지 않으면 안됩니다. “raw” 모드를 유효화하려면 다음과 같이 ioctl 를 사용합니다:

      int size = 4000; /* bytes */
      ret = ioctl(s, SIOCRAWATM, (caddr_t) &size);

이 예에서는, 통상의 48 바이트의 덩어리가 아니고, 4000 바이트의 덩어리로 AAL0 의 데이터를 처리하도록(듯이) 드라이버에게 전합니다. 분명하게 이것은 조금 조잡한 방법입니다만, 우리의 현재의 어플리케이션에는 필요한 것입니다. 장래, 적합한 큰 AAL5 의 프레임으로 비디오 정보원으로부터의 데이터 송신을 하는 것을 기대하고 있습니다.

경고
NATM 프로토콜의 서포트는 ATM 프로토콜의 개발에 의해 변경되기 쉽습니다. 유저는 현재의 실장의 상세하게 의존해야 하는 것이 아니고, 오히려 export 된 서비스에 의존해야 합니다.

관련 항목
en(4)

저자
1996 년, NetBSD 에 대해, Washington University 의 Chuck Cranor 가 NATM 프로토콜층을 EN ATM 드라이버와 함께 실장했습니다.