Commit the first cut of Project Evil, also known as the NDISulator.
Yes, it's what you think it is. Yes, you should run away now.
This is a special compatibility module for allowing Windows NDIS
miniport network drivers to be used with FreeBSD/x86. This provides
_binary_ NDIS compatibility (not source): you can run NDIS driver
code, but you can't build it. There are three main parts:
sys/compat/ndis: the NDIS compat API, which provides binary
compatibility functions for many routines in NDIS.SYS, HAL.dll
and ntoskrnl.exe in Windows (these are the three modules that
most NDIS miniport drivers use). The compat module also contains
a small PE relocator/dynalinker which relocates the Windows .SYS
image and then patches in our native routines.
sys/dev/if_ndis: the if_ndis driver wrapper. This module makes
use of the ndis compat API and can be compiled with a specially
prepared binary image file (ndis_driver_data.h) containing the
Windows .SYS image and registry key information parsed out of the
accompanying .INF file. Once if_ndis.ko is built, it can be loaded
and unloaded just like a native FreeBSD kenrel module.
usr.sbin/ndiscvt: a special utility that converts foo.sys and foo.inf
into an ndis_driver_data.h file that can be compiled into if_ndis.o.
Contains an .inf file parser graciously provided by Matt Dodd (and
mercilessly hacked upon by me) that strips out device ID info and
registry key info from a .INF file and packages it up with a binary
image array. The ndiscvt(8) utility also does some manipulation of
the segments within the .sys file to make life easier for the kernel
loader. (Doing the manipulation here saves the kernel code from having
to move things around later, which would waste memory.)
ndiscvt is only built for the i386 arch. Only files.i386 has been
updated, and none of this is turned on in GENERIC. It should probably
work on pc98. I have no idea about amd64 or ia64 at this point.
This is still a work in progress. I estimate it's about %85 done, but
I want it under CVS control so I can track subsequent changes. It has
been tested with exactly three drivers: the LinkSys LNE100TX v4 driver
(Lne100v4.sys), the sample Intel 82559 driver from the Windows DDK
(e100bex.sys) and the Broadcom BCM43xx wireless driver (bcmwl5.sys). It
still needs to have a net80211 stuff added to it. To use it, you would
do something like this:
# cd /sys/modules/ndis
# make; make load
# cd /sys/modules/if_ndis
# ndiscvt -i /path/to/foo.inf -s /path/to/foo.sys -o ndis_driver_data.h
# make; make load
# sysctl -a | grep ndis
All registry keys are mapped to sysctl nodes. Sometimes drivers refer
to registry keys that aren't mentioned in foo.inf. If this happens,
the NDIS API module creates sysctl nodes for these keys on the fly so
you can tweak them.
An example usage of the Broadcom wireless driver would be:
# sysctl hw.ndis0.EnableAutoConnect=1
# sysctl hw.ndis0.SSID="MY_SSID"
# sysctl hw.ndis0.NetworkType=0 (0 for bss, 1 for adhoc)
# ifconfig ndis0 <my ipaddr> netmask 0xffffff00 up
Things to be done:
- get rid of debug messages
- add in ndis80211 support
- defer transmissions until after a status update with
NDIS_STATUS_CONNECTED occurs
- Create smarter lookaside list support
- Split off if_ndis_pci.c and if_ndis_pccard.c attachments
- Make sure PCMCIA support works
- Fix ndiscvt to properly parse PCMCIA device IDs from INF files
- write ndisapi.9 man page
2003-12-11 22:34:37 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* $FreeBSD$
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef int cm_resource_type;
|
|
|
|
|
|
|
|
struct physaddr {
|
|
|
|
uint64_t np_quad;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct physaddr physaddr;
|
|
|
|
|
|
|
|
enum interface_type {
|
|
|
|
InterfaceTypeUndefined = -1,
|
|
|
|
Internal,
|
|
|
|
Isa,
|
|
|
|
Eisa,
|
|
|
|
MicroChannel,
|
|
|
|
TurboChannel,
|
|
|
|
PCIBus,
|
|
|
|
VMEBus,
|
|
|
|
NuBus,
|
|
|
|
PCMCIABus,
|
|
|
|
CBus,
|
|
|
|
MPIBus,
|
|
|
|
MPSABus,
|
|
|
|
ProcessorInternal,
|
|
|
|
InternalPowerBus,
|
|
|
|
PNPISABus,
|
|
|
|
PNPBus,
|
|
|
|
MaximumInterfaceType
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef enum interface_type interface_type;
|
|
|
|
|
|
|
|
#define CmResourceTypeNull 0 /* ResType_All or ResType_None (0x0000) */
|
|
|
|
#define CmResourceTypePort 1 /* ResType_IO (0x0002) */
|
|
|
|
#define CmResourceTypeInterrupt 2 /* ResType_IRQ (0x0004) */
|
|
|
|
#define CmResourceTypeMemory 3 /* ResType_Mem (0x0001) */
|
|
|
|
#define CmResourceTypeDma 4 /* ResType_DMA (0x0003) */
|
|
|
|
#define CmResourceTypeDeviceSpecific 5 /* ResType_ClassSpecific (0xFFFF) */
|
|
|
|
#define CmResourceTypeBusNumber 6 /* ResType_BusNumber (0x0006) */
|
|
|
|
#define CmResourceTypeMaximum 7
|
|
|
|
#define CmResourceTypeNonArbitrated 128 /* Not arbitrated if 0x80 bit set */
|
|
|
|
#define CmResourceTypeConfigData 128 /* ResType_Reserved (0x8000) */
|
|
|
|
#define CmResourceTypeDevicePrivate 129 /* ResType_DevicePrivate (0x8001) */
|
|
|
|
#define CmResourceTypePcCardConfig 130 /* ResType_PcCardConfig (0x8002) */
|
|
|
|
|
|
|
|
enum cm_share_disposition {
|
|
|
|
CmResourceShareUndetermined = 0, /* Reserved */
|
|
|
|
CmResourceShareDeviceExclusive,
|
|
|
|
CmResourceShareDriverExclusive,
|
|
|
|
CmResourceShareShared
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef enum cm_share_disposition cm_share_disposition;
|
|
|
|
|
|
|
|
/* Define the bit masks for Flags when type is CmResourceTypeInterrupt */
|
|
|
|
|
|
|
|
#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0
|
|
|
|
#define CM_RESOURCE_INTERRUPT_LATCHED 1
|
|
|
|
|
|
|
|
/* Define the bit masks for Flags when type is CmResourceTypeMemory */
|
|
|
|
|
|
|
|
#define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
|
|
|
|
#define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
|
|
|
|
#define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
|
|
|
|
#define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
|
|
|
|
|
|
|
|
#define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
|
|
|
|
#define CM_RESOURCE_MEMORY_24 0x0010
|
|
|
|
#define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
|
|
|
|
|
|
|
|
/* Define the bit masks for Flags when type is CmResourceTypePort */
|
|
|
|
|
|
|
|
#define CM_RESOURCE_PORT_MEMORY 0x0000
|
|
|
|
#define CM_RESOURCE_PORT_IO 0x0001
|
|
|
|
#define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
|
|
|
|
#define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
|
|
|
|
#define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
|
|
|
|
#define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
|
|
|
|
#define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
|
|
|
|
#define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
|
|
|
|
|
|
|
|
/* Define the bit masks for Flags when type is CmResourceTypeDma */
|
|
|
|
|
|
|
|
#define CM_RESOURCE_DMA_8 0x0000
|
|
|
|
#define CM_RESOURCE_DMA_16 0x0001
|
|
|
|
#define CM_RESOURCE_DMA_32 0x0002
|
|
|
|
#define CM_RESOURCE_DMA_8_AND_16 0x0004
|
|
|
|
#define CM_RESOURCE_DMA_BUS_MASTER 0x0008
|
|
|
|
#define CM_RESOURCE_DMA_TYPE_A 0x0010
|
|
|
|
#define CM_RESOURCE_DMA_TYPE_B 0x0020
|
|
|
|
#define CM_RESOURCE_DMA_TYPE_F 0x0040
|
|
|
|
|
|
|
|
struct cm_partial_resource_desc {
|
|
|
|
uint8_t cprd_type;
|
|
|
|
uint8_t cprd_sharedisp;
|
2004-03-29 02:15:29 +00:00
|
|
|
uint16_t cprd_flags;
|
Commit the first cut of Project Evil, also known as the NDISulator.
Yes, it's what you think it is. Yes, you should run away now.
This is a special compatibility module for allowing Windows NDIS
miniport network drivers to be used with FreeBSD/x86. This provides
_binary_ NDIS compatibility (not source): you can run NDIS driver
code, but you can't build it. There are three main parts:
sys/compat/ndis: the NDIS compat API, which provides binary
compatibility functions for many routines in NDIS.SYS, HAL.dll
and ntoskrnl.exe in Windows (these are the three modules that
most NDIS miniport drivers use). The compat module also contains
a small PE relocator/dynalinker which relocates the Windows .SYS
image and then patches in our native routines.
sys/dev/if_ndis: the if_ndis driver wrapper. This module makes
use of the ndis compat API and can be compiled with a specially
prepared binary image file (ndis_driver_data.h) containing the
Windows .SYS image and registry key information parsed out of the
accompanying .INF file. Once if_ndis.ko is built, it can be loaded
and unloaded just like a native FreeBSD kenrel module.
usr.sbin/ndiscvt: a special utility that converts foo.sys and foo.inf
into an ndis_driver_data.h file that can be compiled into if_ndis.o.
Contains an .inf file parser graciously provided by Matt Dodd (and
mercilessly hacked upon by me) that strips out device ID info and
registry key info from a .INF file and packages it up with a binary
image array. The ndiscvt(8) utility also does some manipulation of
the segments within the .sys file to make life easier for the kernel
loader. (Doing the manipulation here saves the kernel code from having
to move things around later, which would waste memory.)
ndiscvt is only built for the i386 arch. Only files.i386 has been
updated, and none of this is turned on in GENERIC. It should probably
work on pc98. I have no idea about amd64 or ia64 at this point.
This is still a work in progress. I estimate it's about %85 done, but
I want it under CVS control so I can track subsequent changes. It has
been tested with exactly three drivers: the LinkSys LNE100TX v4 driver
(Lne100v4.sys), the sample Intel 82559 driver from the Windows DDK
(e100bex.sys) and the Broadcom BCM43xx wireless driver (bcmwl5.sys). It
still needs to have a net80211 stuff added to it. To use it, you would
do something like this:
# cd /sys/modules/ndis
# make; make load
# cd /sys/modules/if_ndis
# ndiscvt -i /path/to/foo.inf -s /path/to/foo.sys -o ndis_driver_data.h
# make; make load
# sysctl -a | grep ndis
All registry keys are mapped to sysctl nodes. Sometimes drivers refer
to registry keys that aren't mentioned in foo.inf. If this happens,
the NDIS API module creates sysctl nodes for these keys on the fly so
you can tweak them.
An example usage of the Broadcom wireless driver would be:
# sysctl hw.ndis0.EnableAutoConnect=1
# sysctl hw.ndis0.SSID="MY_SSID"
# sysctl hw.ndis0.NetworkType=0 (0 for bss, 1 for adhoc)
# ifconfig ndis0 <my ipaddr> netmask 0xffffff00 up
Things to be done:
- get rid of debug messages
- add in ndis80211 support
- defer transmissions until after a status update with
NDIS_STATUS_CONNECTED occurs
- Create smarter lookaside list support
- Split off if_ndis_pci.c and if_ndis_pccard.c attachments
- Make sure PCMCIA support works
- Fix ndiscvt to properly parse PCMCIA device IDs from INF files
- write ndisapi.9 man page
2003-12-11 22:34:37 +00:00
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
physaddr cprd_start;
|
|
|
|
uint32_t cprd_len;
|
|
|
|
} cprd_generic;
|
|
|
|
struct {
|
|
|
|
physaddr cprd_start;
|
|
|
|
uint32_t cprd_len;
|
|
|
|
} cprd_port;
|
|
|
|
struct {
|
|
|
|
uint32_t cprd_level;
|
|
|
|
uint32_t cprd_vector;
|
|
|
|
uint32_t cprd_affinity;
|
|
|
|
} cprd_intr;
|
|
|
|
struct {
|
|
|
|
physaddr cprd_start;
|
|
|
|
uint32_t cprd_len;
|
|
|
|
} cprd_mem;
|
|
|
|
struct {
|
|
|
|
uint32_t cprd_chan;
|
|
|
|
uint32_t cprd_port;
|
|
|
|
uint32_t cprd_rsvd;
|
|
|
|
} cprd_dmachan;
|
|
|
|
struct {
|
|
|
|
uint32_t cprd_data[3];
|
|
|
|
} cprd_devpriv;
|
|
|
|
struct {
|
|
|
|
uint32_t cprd_datasize;
|
|
|
|
uint32_t cprd_rsvd1;
|
|
|
|
uint32_t cprd_rsvd2;
|
|
|
|
} cprd_devspec;
|
|
|
|
} u;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct cm_partial_resource_desc cm_partial_resource_desc;
|
|
|
|
|
|
|
|
struct cm_partial_resource_list {
|
|
|
|
uint16_t cprl_version;
|
|
|
|
uint16_t cprl_revision;
|
|
|
|
uint32_t cprl_count;
|
|
|
|
cm_partial_resource_desc cprl_partial_descs[1];
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct cm_partial_resource_list cm_partial_resource_list;
|
|
|
|
|
|
|
|
struct cm_full_resource_list {
|
|
|
|
interface_type cfrl_type;
|
|
|
|
uint32_t cfrl_busnum;
|
|
|
|
cm_partial_resource_desc cfrl_partiallist;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct cm_full_resource_list cm_full_resource_list;
|
|
|
|
|
|
|
|
struct cm_resource_list {
|
|
|
|
uint32_t crl_count;
|
|
|
|
cm_full_resource_list crl_rlist;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct cm_resource_list cm_resource_list;
|
|
|
|
|
|
|
|
typedef cm_partial_resource_list ndis_resource_list;
|