The
ndis
driver is a wrapper designed to allow binary
Windows[rg]
NDIS miniport
network drivers to be used with
FreeBSD .
The
ndis
driver is provided in source code form and must be combined with
the
Windows[rg]
driver supplied with your network adapter.
The
ndis
driver uses the
ndisapi
kernel subsystem to relocate and link the
Windows[rg]
binary so
that it can be used in conjunction with native code.
The
ndisapi
subsystem provides an interface between the NDIS API and the
FreeBSD
networking infrastructure.
The
Windows[rg]
driver is essentially
fooled into thinking it is running on
Windows[rg].
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 can be converted
into a kernel module file using the
ndisgen(8)
utility.
This file contains a binary image of the driver plus
registry key data.
When the
ndis
driver loads, it will create
sysctl(3)
nodes for each registry key extracted from the
.INF
file.
The
ndis
driver is designed to support mainly Ethernet and wireless
network devices with PCI and USB bus attachments.
(Cardbus devices are also supported as PCI.)
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.