Broadcom WLAN, Intel WLAN geht jetzt mit BSD

ouTi

BSD sucker
Hallo,

seit kurzem gibt es im -current eine NDIS-API, die Windows-Netzwerktreiber unter BSD emuliert.

Ihr habt vielleicht auch schonmal vom NDIS-Wrapper für Linux (Kernel-Modul) oder Linuxant's DriverLoader (kostet knapp 30€) gehört? Das ist nun für BSD commited worden.

Ich habe heute Nachmittag meine Welt neugebaut und das ndis.ko ausprobiert.

Ich verwende eine Dell TrueMobile 1300 in einem Latitude D600. Und? Es funktioniert! Teilweise etwas buggy, aber es funktionert!

Ich habe eine File mit voll 54Mbit gezogen (1,7mb/s). Soviel habe ich selten in WindowsXP erreicht.

WEP und am AP anmelden funktioniert auch.

hier der CVS-Zeig:
http://cvsup.leo.org/cgi-bin/cvsweb.cgi/src/sys/compat/ndis/

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

das ganze in den Kernel einzubauen ist bei mir gescheitert... Aber man kann es ja auch als Module laden:

/boot/loader.conf:

ndis_load="YES"
wlan_load="YES"
if_ndis_load="YES"


/etc/rc.conf

ifconfig_ndis0="inet 192.168.0.222 netmask 0xffffff00 ssid ouTi-WLAN nwkey 1:0xb1d7a3c8a5c1b2a3d4b1c0c2a9 up"

Und meine DMESG hänge ich noch an...

Ich hoffe ich habe damit einigen geholfen... obwohl ich von BSD noch keine Ahnung habe und ich mich damit erst 3 Wochen rumschlage ;)


P.S.: Seit dem Update von RELEG_5_2 auf -current brauche ich keinen ACPI-Fix mehr für mein Dell Latitude Bios (siehe http://sandcat.nl/~stijn/freebsd/dell.php).
 

Anhänge

  • dmesg.txt
    6,8 KB · Aufrufe: 522
ich sehe grade... in der dmesg ist noch ein ACPI-Sleep Event drin :)

hab wohl beim Booten das Diplay zuweit zugeklappt...

mit den Modulen nb_ubt.ko und ubtbcmfw.ko habe ich versucht meine Dell Truemobile 300 Bluetooth karte zum Laufen zu bringen. Allerdings erfolglos... :/

Ich weiss nicht welchen Broadcom Chipsatz dasd Bluetooth verwendet :(

Falls irgendjemand da was genaueres weiss ;)
 
# ndiscvt -i /path/to/foo.inf -s /path/to/foo.sys -o ndis_driver_data.h


wo bekomme ich die foo.inf, foo.sys her? welche dateien sind damit _genau_ gemeint.
Ich habe wo anders gelesen das es die hal.dll und die ndis.sys ist. mir wuerde demnach eine inf datei fehlen um die header datei zu erzeugen.

hier geht es um den versuch bei einem dell 8600 die eingebaute wlan karte unter current zum laufen zu bekommen...



schoene gruesse ,) xeam
 
das sind die windows treiber deiner w-lan karte.

blabla.inf und blabla.sys (broadcom z.b.: bcmwl15.inf und bcmwl15.sys).

also windows-teiber nehmen... entpacken, dann die ndis_driver_data.h nehmen.
 
yo yo yo. korrekt.
ich hab nochmal unter treibereigenschaften geschaut, und nach ner gleichnamigen inf gesucht, bin nicht so der windows geek.

es geht ;) wunderbar. muss es irgendwie nur noch irgendwo testen.

mh bluetooth wird bei mir nach dem weg des handbuchs nach erkannt. ausprobieren kann ich es leider auch nicht.
 
Zuletzt bearbeitet:
bluettoth habe ich leider auch noch nicht hinbekommen (dell trumobile 300 bluetooth).

es gibt ein kernel modul für broadcom bluetooth, dass aber bei mir nicht funktioniert hat.

ich hab auch noch keine information, welcher chipsatz verwendet wird. :(

aber ich studiere die commit-logs... wenn sich was tun, melde ich mich
 
ndis funktioniert wirklich fett!!!
kann bestätigen das die dell truemobile 1400 so auch funktioniert.

ich habe jedoch noch 2 probleme.

1. wie kann ich die wireless karte über DHCP laufen lassen?

2. wenn ich die module in /boot/loader.conf:

ndis_load="YES"
if_ndis_load="YES"

lade, bekomme ich beim herunterfahren des systems ein panic,
der irgendwie so lautet:

panic: _mtx_pool_find(): null pool
at line 93 in file /usr/src/sys/kern/kern_mtxpool.c

nur wnn ich beide module von hand mit "kldunload ndis.ko" und
"kldunload if_ndis.ko" unloade, kann ich fehlerfrei herunterfahren.

wer kann helfen?

thx
 
dhcp sollte mit dhclient gehen. im current wurde dazu noch was schönes geändert.


ich verwende nich die kernel-module, sondern habe mir die dell truemobile statisch in den kernel kompiliert.
 
wie hast du es geschafft ndis in den kernel zu kompilieren?
bei mir lässt sich der kernel so nicht mehr fehlerfrei bauen.
 
kann mir einer eine Schritt-für-Schritt-Anleitung geben wie ich dieses NDIS da zum laufen kriege? Ich habe mir vieles durchgelesen, habe aber immer noch kaum Ahnung. Ich würde gerne das I-Net zum laufen bekommen, weill ich im Moment nur bei meinem Freund ins I-Net kann und um mich bei FreeBSD weiterbilden zu können, wäre ein Anschluss ganz sinnvoll :P

P.S.: Heute ist mein 2. FreeBSD Tag :)
 
1. benötigst du FreeBSD 5.2-CURRENT, da ndis in der 5.2.1-RELEASE
noch nicht vorhanden ist. wenn alles gut läuft, wird es in der 5.3-RELEASE vorhanden sein.

danch gibt es 2 möglicheiten ndis zu aktivieren. entweder du benützt die kernel module wie oben beschrieben oder du compilierst das ganze in den kernel.

ich beschreibe jetzt mal zweiteres:

in deiner kernelconf muss du folgende zeilen hinzufügen:

options NDISAPI
device ndis
device wlan (sollte eigentlich schon standartmässig aktiviert sein)

danach saugst du dir die windowsdriver für deine wlan karte
und entpackst sie in ein beliebiges verzeichnis. nun solltest du
zwei dateien blabla.sys und blabla.inf haben. je nach wlan karte.

jetzt wechselst du ins verzeichnis /usr/src/sys und führst folgendes aus:

# ndiscvt -i /path/to/blabla.inf -s /path/to/blabla.sys -o ndis_driver_data.h

danach musst du nur noch in /usr/src wechseln und deinen neuen
kernel kompilieren und installieren

wenn alles geklappt hat und dein system nun fehlerfrei bootet
solltest du nun das device ndis0 zur verfügung haben.

ndis0 in /etc/rc.conf configurieren, rebooten und deine wlan karte
sollte nun funktionieren!

viel spass!!!
 
Mmh... Kompilieren klappt nicht. System RELENG_5 gestern gebaut.

Code:
usr/src/sys/contrib/dev/ath/freebsd -I/usr/src/sys/contrib/ngatm -D_KERNEL -include opt_global.h -fno-common -finline-limit=8000 --param inline-unit-growth=100 --param large-function-growth=1000  -mno-align-long-strings -mpreferred-stack-boundary=2 -ffreestanding -Werror  /usr/src/sys/compat/ndis/subr_ndis.c
/usr/src/sys/compat/ndis/subr_ndis.c: In function `ndis_workfunc':
/usr/src/sys/compat/ndis/subr_ndis.c:2878: warning: assignment from incompatible pointer type
*** Error code 1

Stop in /usr/obj/usr/src/sys/TEST.
*** Error code 1

Stop in /usr/src.
*** Error code 1

Stop in /usr/src.

Module laden geht, bis auch if_ndis, das gibt nicht. Hat sich da was geändert inzwischen?

Gruß, I.MC
 
Zuletzt bearbeitet:
Gleiches hier, beim Versuch auf meinem Centrino-Notebook den NDIS zu aktivieren.
*FreeBSD - RELENG_5 (grade aktuelle CVS-Sourcen geholt [12.9.2004])

Seltsam ist, dass ich den Kernel am 14.7.2004 schonmal erfolgreich gebaut hatte -
der Rechner also MIT der beschriebenen NDIS-Unterstuetzung laeuft (WLAN ist schon was feines ). :confused:

Ich weiss ja nicht, wann man was am if_ndis geaendert hatte, aber BITTE BITTE macht das wieder rueckgaengig.. :)

Cu.
 
MrFixit schrieb:
Lade ndis doch einfach als Modul und fertig.

Ja, das geht ja immernoch - hatte [I.MC] auch geschrieben...
Aber viel huebscher waere es doch, wenn das wieder direkt im Kernel waere (Stichwort: Monolitischer Kernel)..
[ps: mein FBSD sagt inzwischen 6.0 zu mir... da faellt mir nur die alte Weisheit
"Installiere nie eine Nuller-Version" ein]

@I.MC.
apropos: if_ndis gibt es nicht ..
doch doch..
Man muss den Pfad nur direkt angeben...:
Code:
 kldload /sys/modules/if_ndis/if_ndis.ko

Dann hat man auch ein ganz normales "ndis0"-Device, was man mittels
ifconfig ndis0 konfigurieren kann.

Cu.
 
Man muss nicht den Pfad angeben, man muesste es einfach nur installieren :)

Zudem ist FreeBSD mit oder ohne Module ein monolithischer Kernel.
 
Was muß ich denn da nun noch installieren? Oder meinst du damit einfach in /boot/kernel kopieren? Zudem finde ich es ja lustig, dass man auf der Ml obiges Vorgehen beschreibt und letztens in diesem Pdf, was die Änderungen bezügl. Netzwerk auflistet einfach nur sagt, dass man "options ndis" in den Kernel packen soll (Was ja auch nicht geht)

Gruß. I.MC
 
Fook schrieb:
Dann hat man auch ein ganz normales "ndis0"-Device, was man mittels
ifconfig ndis0 konfigurieren kann.
Also ich habe hier zwar laut kldstat die Module if_ndis und ndis geladen und wlan ist ja per default im kernel, jedoch erhalte ich weder die sysctl-Eintraege, noch ein device ndis0

Gruss, I.MC
 
Versuch mal, ohne ACPI zu booten. Auf meinem Notebook ist ACPI standardmäßig deaktiviert, weil das BIOS auf der schwarzen Liste steht, und dann funktionieren die NDIS-Module. Mit ACPI allerdings funktioniert NDIS bei mir nicht.

Solid.Snake
 
Zurück
Oben