sys/dev/if_ndis
)
and must be combined with the
Windows®
driver binary supplied with your network adapter.
The
ndis
driver uses the
ndisapi
kernel subsystem to relocate and link the
Windows®
binary so
that it can be used in conjunction with native code.
The
ndisapi
subsystem provides an interface between the NDIS API and the
NetBSD
networking infrastructure.
The
Windows®
driver is essentially
fooled into thinking it is running on
Windows®.
Note that this
means the
ndis
driver is only useful on x86 machines.
To build a functional driver, the user must have a copy of the
driver distribution media for his or her card.
From this distribution,
the user must extract two files: the
.SYS
file containing the driver
binary code, and its companion
.INF
file, which contains the
definitions for driver-specific registry keys and other installation
data such as device identifiers.
These two files are converted
into a
ndis_driver_data.h
file using the
ndiscvt(8)
utility.
The resulting file contains a binary image of the driver plus
registry key data.
The
ndis_driver_data.h
is included in several files located in
sys/dev/if_ndis
so it is needed to compile an NDIS kernel.
When the
ndis
driver is loaded, it will create
sysctl(3)
nodes for each registry key extracted from the
.INF
file.
The ndis wrapper is designed to support mainly Ethernet and wireless network devices/drivers with PCI bus attachments. It can support many different media types and speeds.
One limitation however, is that there is no consistent way to learn if an Ethernet device is operating in full or half duplex mode. The NDIS API allows for a generic means for determining link state and speed, but not the duplex setting. There may be driver-specific registry keys to control the media setting which can be configured via the sysctl(8) command.
.INF
and
.SYS
files for your device, the
ndis_driver_data.h
file can be built as follows:
$ ndiscvt -i your_card.INF -s your_card.SYS -o ndis_driver_data.h
Next uncomment the following lines from
sys/arch/i386/conf/GENERIC
$ cd /usr/src/sys/arch/i386/conf
$ cp GENERIC NDIS
$ vi NDIS
.
.
.
options COMPAT_NDIS # NDIS network driver
.
.
.
ndis* at pci? dev ? function ? # Experimental - NDIS Network Driver
Configure your kernel, then copy the
ndis_driver_data.h
file into the kernel build directory before compiling the kernel:
$ cd src/sys/arch/i386/conf
$ config NDIS
$ cd ../compile/NDIS
$ cp /path/to/ndis_driver_data.h .
$ make depend && make
$ su
$ mv /netbsd /onetbsd
$ cp netbsd /netbsd
$ reboot
The ndis0 device should be detected at boot:
Matching vendor: 14e4, product: 4324, name: Dell TrueMobile 1400 Dual Band WLAN Mini-PCI Card
ndis0 at pci2 dev 3 function 0
The device can then be configured with ifconfig(8):
ndis0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ssid WWUwireless
powersave on (100ms sleep)
chan 6
address: 00:90:4b:69:94:f0
media: IEEE802.11 autoselect
status: no network
inet 140.160.129.226 netmask 0xfffffc00 broadcast 140.160.131.255
inet6 fe80::290:4bff:fe69:94f0%ndis0 prefixlen 64 scopeid 0x3
If the ndis driver creates any sysctl nodes, they can be viewed and altered with sysctl(8):
$ sysctl ndis0
.
.
.
ndis0.ndis_10280001 = Dell TrueMobile 1300 WLAN Mini-PCI Card
ndis0.ndis_Environment = 1
ndis0.ndis_NdisVersion = 0x00050001
ndis0.ndis_BusType = 5
.
.
.