2008. 8. 1. 17:06

NDIS 란?

        NDIS 란?

             NDIS는 "Network Driver Interface Specification"의 약자이다. NDIS의 목적은 Network

             Interface Cards를 위한 표준 API를 정의 하고, 또한 상위 레벨(TCP/IP)프로토콜 드라이

             버 뿐만 아니라 MAC driver들에 의해 사용될 수 있는 함수들의 라이브러리를 제공한다.

             Wrapper function은 platform dependency들을 숨길 뿐만 아니라 MAC과 프로토콜 드라

             이버를 쉽게 개발할 수 있도록 한다.

             현재 최신 버젼은 Windows Vista용으로 나온 NDIS 6.0이고, 우리가 사용 할 버젼은 XP

             용으로 나온 NDIS 5.1 버젼을 사용할 것이다.


             NDIS는 다음과 같은 기능을 제공한다.

              - Registering Driver

              - Registering Network Interface Cards

              - Opening a Network Interface Card

              - Sending Data

              - Receiving Data

              - Indicating Status

              - Querying an Setting Network Interface Card Driver Capabilities

              - Querying Global Statistics

              - Closing a Network Interface Card

              - Resetting a Network Interface Card

              - Removing a Network Interface Card

              - Uploading and Deregistering Drivers, and so on



사용자 삽입 이미지

                                         - NDIS Drivers 아키텍쳐 -



             그림이 보여주듯, NDIS는 다음과 같은 타입들의 네트워크 드라이버들을 제공한다.

              - Miniport Drivers

              - Intermediate Drivers

              - Protocol Drivers



            (1) Miniport NIC Drivers

               ① NIC을 통해 데이터를 보내고 받는 것을 포함해, 네트워크 인터페이스 카드를

                  관리한다.

               ② intermediate driver들과 전송 계층 드라이버들과 같은 상위 레벨 드라이버들과 인터

                 페이스를 제공한다.

                 Packet sending : 전송 계층 드라이버가 전송하는 패킷을 가지고 있을 때, NDIS

                 라이브러리에 의해 export 되어지는 NdisXxx 함수를 호출한다. 후에 NDIS는

                 미니포트에 의해 export 된 적당한 MiniportXxx 함수를 호출함으로써 미니포트에게

                 패킷을 전달한다. 미니포트 드라이버는 그리고 나서 적당한 NdisXxx 함수들을

                 호출함으로써 전송을 위해 NIC에게 패킷을 포워드한다.

                 Packet receiving : NIC가 NIC에게 주소화된 패킷을 수신할 때, NDIS 혹은 NIC의

                 미니포트에 의해 처리될 수 있는 하드웨어 인터럽트를 포스트할 수 있다. NDIS는

                 적당한 MiniportXxx 함수를 호출함으로써 NIC의 미니포트에게 알린다. 미니포트는

                 NIC으로부터 데이터 전송을 설정하고 그리고 나서 적당한 NdisXxx 함수를

                 호출함으로써 바인드된 상위레벨 드라이버들에게 수신된 패킷의 존재를

                 인디케이트한다.

사용자 삽입 이미지


            (2) Intermediate Drivers

               위의 그림에서처럼 intermediate driver들은 일반적으로 미니포트 드라이버들과 전송 계

               층 프로토콜 드라이버들 사이에서 계층화 된다.

               lower edge에서, intermediate driver는 NDIS가 아래 미니포트들로부터 요구들을 통신

               하기 위해 호출하는 프로토콜 엔트리 포인트들(ProtocolXxx 함수들)을 노출한다. 아래

               미니포트 드라이버에 대해, intermediate driver는 프로토콜 드라이버가 되는 것으로 나

               타난다.

               upper edge에서, intermediate driver는 하나나 혹은 그 이상의 위의 프로토콜

               드라이버들의 요구들과 통신하기 위해 NDIS가 호출하는 미니포트 엔트리 포인트들

               (MiniportXxx 함수들)을 노출한다. 위의 프로토콜 드라이버에 대해서, intermediate

               driver는 미니포트로 나타난다.

               다음과 같은 기능에 intermediate driver를 사용할 수 있다.


               ① 다른 네트워크 미디어 사이를 변환하기 위해

               - 예를 들어, Ethernet 또는 Token Ring 전송계층들과 ATM 미니포트 사이에

                 intermediate driver의 함수는 Ethernet 과 Token Ring 패킷들을 ATM 패킷들로

                 mapping하거나 그 반대로 mapping한다.

               ② 패킷들을 필터하기

               - 패킷 스케줄러는 필터 드라이버로서 사용된 intermediate driver의 예이다. 패킷

                 스케줄러는 전송을 위해 전송 계층에 의해 아래로 전달된 각 보내기 패킷들 내에

                 우선권 정보를 읽고, 미니포트 드라이버에 의해 위로 인디케이트된 각 수신 패킷에

                 대한 우선권 정보를 읽는다. 패킷 스케줄러는 그리고 나서 우선권을 토대로 전송  

                 혹은 수신을 위해 각 패킷을 스케줄한다.

               ③ 하나 이상의 NIC과 관련해서 패킷 전송을 balance한다.

                - load balancing. 드라이버는 하나의 가상 어댑터를 위의 전송 계층 프로토콜들에게

                 노출하지만 하나 이상의 NIC들로 전송 할 패킷들을 분산한다.(distributes)


사용자 삽입 이미지




            (3) Protocol Drivers

               드라이버들의 NDIS 계층도에서 가장 위에 있는 네트워크 프로토콜은 TCP/IP 혹은

               IPX/SPX 스택과 같은 전송 프로토콜 스택을 실행하는 전송 계층 드라이버내에서 가장

               낮은 레벨 드라이버로서 사용되어진다. 전송 계층 드라이버는 패킷들을 할당하고,

               보내는 어플리케이션으로부터 데이터를 패킷에 복사하고, 이러한 패킷들을 NDIS

               함수들을 호출함으로써 낮은 레벨 드라이버에 보낸다. 프로토콜 드라이버는 또한 다음

               낮은 레벨 드라이버로부터 들어오는 패킷들을 수신하기 위해 프로토콜 인터페이스를

               제공한다. 전송 계층 드라이버는 수신된 데이터를 적당한 클라이언트 어플리케이션에게

               전송한다.

               lower edge에서, 프로토콜 드라이버는 intermediate 네트워크 드라이버들과 미니포트

               NIC 드라이버들과 인터페이스한다. 프로토콜 드라이버는 패킷들을 보내기 위해 NdisXxx

               함수들을 호출하고, lower 레벨 드라이버들에 의해 유지된 정보를 읽고 설정하고 운영

               체제 서비스들을 사용한다. 프로토콜 드라이버는 NDIS가 수신된 패킷들을 위로 인디케

               이트하기 위해 그리고 lower-level 드라이버들의 상태를 인디케이트하고 프로토콜 드라

               이버와 통신하기 위해 lower-level 드라이버들을 위해 혹은 자신의 목적을 위해 호출하

               는 엔트리 포인트들(ProtocolXxx 함수들)의 집합을 export한다.

               upper edge에서, 전송 계층 프로토콜 드라이버는 프로토콜 스택에서 상위 레벨 드라이

               버에 대한 private 인터페이스를 가진다.

사용자 삽입 이미지