Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 May 2000 11:49:58 PDT
From:      Darryl Okahata <darrylo@sr.hp.com>
To:        freebsd-mobile@freebsd.org
Subject:   Howto: FreeBSD & WaveLan [ was: Re: TI1225 + ORINOCO aka WaveLAN IEEE 802.11 11Mb ]
Message-ID:  <200005241849.LAA23904@mina.sr.hp.com>
In-Reply-To: Your message of "Wed, 24 May 2000 18:45:52 PDT." <200005241545.SAA18462@orpheus.so-com.net> 

next in thread | previous in thread | raw e-mail | index | archive | help
> Some weeks ego I saw letters with subject like this.
> Question is  .. Have this hardware configuration (subj)
> properly supported by FreeBSD-4.0 or FreeBSD-current ?

     I can't help with the TI1225, but here's a document that I've been
writing on using the WaveLan cards with FreeBSD.  I've been toying with
submitting it to FreeBSD diary or 'zine, but I don't know if I'll ever
get around to finishing it.  It's taking up a lot of my time, and I
don't know if there's really a big audience for it.

     It's a bit rough and a bit wordy, but it should cover most of the
bases.

--
	Darryl Okahata
	darrylo@soco.agilent.com

DISCLAIMER: this message is the author's personal opinion and does not
constitute the support, opinion, or policy of Agilent Technologies, or
of the little green men that have been following him all day.

===============================================================================
	FreeBSD 4.X and WaveLan IEEE 802.11 Wireless Networking
			    Wed May 24, 2000
       (C) Copyright 2000, by Darryl Okahata (darrylo@sonic.net)


INTRODUCTION

     This article describes how to set up a small home wireless LAN,
using the Orinoco (previously Lucent) WaveLan IEEE 802.11 PC cards, a
desktop PC, and a laptop.  The idea here is that the desktop is always
on, and can function as a gateway/router for the laptop.  I have a
desktop FreeBSD system running at home 24 hours a day, 7 days a week,
and so this is a good solution for me.

     The hardware organization is simple: both the desktop and the
laptop use the silver (64-bit encryption) or gold (128-bit encryption)
PCMCIA WaveLan IEEE 802.11 cards to communicate.  The laptop should
already have an available PCMCIA slot for a WaveLan card, and the
desktop uses the WaveLan PCMCIA adapter.

     Note that there is more than one type of "WaveLan" card.  This
article deals with the IEEE 802.11 WaveLan cards, and not older ones.

     Some people don't have a system that's always running, and so they
may prefer using an Apple airport in place of the desktop.  While this
is another good solution, it's beyond the scope of this article.
However, I'll list a few pros and cons of the desktop vs airport
approach:

	Desktop:
		Pro: Somewhat inexpensive solution (around US$220-$250
		     for just the desktop-related hardware, not
		     counting the laptop interface).
		Pro: No (registered) IP address required.  (Assuming the
		     use of NATD with unregistered source addresses such
		     as 10.0.0.1, and assuming that the desktop is using
		     a registered IP address instead of an unregistered
		     one).
		Pro: No additional ethernet wiring (great if you have an
		     ethernet hub with no free ports).
		Con: Noisier than an airport (assuming a typically-
		     noisy power supply fan).
		Con: Not very portable.
		Con: Uses more power.  (Well, perhaps not, if you use an
		     old laptop in place of the desktop.)

	Airport:
		Con: More expensive (around US$300, not counting the
		     laptop interface).
		Con: Currently needs a Macintosh to fully configure.
		     Can be partially configured from Windows (but no
		     NATD or DHCP available under Windows).
		Con: Yet another ethernet device to wire up to some hub
		     that's short on ports.  Needs an IP address.
		Pro: Very quiet.
		Pro: Very portable.
		Pro: Uses less power.
		Pro: Can be wall-mounted.  Wall-mounting a desktop is
		     problematic.

If you're interested in using the airport, you can start here:

	Upgrading the airport to 128-bit encryption:
		http://www.msrl.com/airport-gold/

Check out the links near the bottom.

     Another solution, instead of a desktop or an airport, is to use a
WaveLan Access Point.  However, this is a fairly expensive solution, and
one that's best used in commercial/business environments.


REQUIREMENTS

     Here's what you need:

* A good working knowledge of FreeBSD and system administration.  In
  particular, you need to know how to configure and rebuild a kernel.
  You also need to know how to install and configure a (wired) network
  card.  For example, if you don't know what a netmask is, why it's
  needed, and how routing works, stop now.  The following instructions
  are not for novices and beginners.

* A desktop and laptop running FreeBSD 4.0.  I've used 4.0-Stable as of
  April 29 and May 2, and they work well.  I'm sure other snapshots
  work.

  You'll need to have installed and configured FreeBSD 4.0 on these
  systems.  I'm not going to cover anything related to installation or
  configuration, except for WaveLan-related issues.

  You'll also need to have installed and configured any (wired) ethernet
  LAN card(s) in the desktop.  Make sure the wired LAN is functional
  before proceeding.

* The desktop and laptop each need at least one free IRQ.  One is
  required for the WaveLan PCMCIA card, and another should be used for
  the PCMCIA adapter.  The PCMCIA adapter does not require an IRQ, but
  one should be used for best performance.  If one is not used, the
  adapter will be used in "polled" mode.

  Note that the WaveLan PCMCIA card may not work with IRQ9 (not
  surprising, as IRQ9 is shared with IRQ2).  If IRQ9 is all you have
  free, you'll have to come up with another free IRQ.  (However, the
  default pccard.conf file does not allow IRQ9 to be used by PCMCIA
  cards.)

* Two WaveLan IEEE 802.11 PCMCIA cards (gold or silver).  The gold cards
  support 128-bit encryption, while the silver cards support 64-bit
  encryption.  You'll use one in the desktop, and one in the laptop.

* One WaveLan PCMCIA adapter interface for the desktop.  I'm sure you
  can use any PCMCIA adapter card that FreeBSD supports; however, I know
  the WaveLan-specific one works, and it's not all that expensive (I
  paid US$65 for mine, and you can probably get it for less).

  I'm also only going to cover the ISA version of the adapter; I'm not
  going to talk about the PCI version.  Where I am, it's pretty
  difficult to find the PCI version, and so I settled for the ISA one.
  One advantage of this is that it's possible to use an old 386 box as a
  WaveLan gateway.  A disadvantage is that the ISA bus is going away,
  and so newer PCs may not have any ISA slots.


CONFIGURING THE DESKTOP

     Here are the steps for configuring the desktop:

 1. For the WaveLan PCMCIA adapter card, follow the card's instructions
    for installing it into the desktop.  Just follow the hardware
    installation instructions; you don't have to follow the instructions
    for installing software drivers.  On the other hand, if you are
    dual-booting Windows and FreeBSD, installing the Windows drivers
    will allow you to use the WaveLan under Windows, as well as allowing
    you to run the hardware and wireless LAN diagnostics.

    However, before you install the card, follow the instructions to set
    the card's base port address to 0x3E0.  The default is 0x3E2.  You
    don't really have to change the address to 0x3E0, but the default
    for FreeBSD is 0x3E0; if you don't change it here, you'll have to
    change the value used by the kernel (see below).

    Whatever you decide, make a note of the base port address.

 2. Decide if you're going to use an IRQ for the PCMCIA adapter card.
    You need to use an IRQ for the WaveLan PCMCIA card, but the use of
    an IRQ for the PCMCIA adapter is optional.  For best performance, an
    IRQ should be assigned to the PCMCIA adapter, but the adapter should
    still function in polled mode (without an IRQ).  I haven't tested
    the polled mode, though.

    If you're not going to use an IRQ, skip to the next step.

    If you are going to use an IRQ, go into the desktop's BIOS setup
    routines, and tell the BIOS to not auto-assign IRQ 10.  Hopefully,
    you have this free; if not, you should be able to use other IRQ
    values, as long as they are not shared or already used by other
    devices (I haven't tried this, though).  In the following, I'm going
    to assume that IRQ 10 is used (if not, change "10" to whatever
    you're using).

    What's happening is that the WaveLan ISA PCMCIA adapter is not a
    plug-and-play card, and so you want to insure that the BIOS does not
    assign its IRQ to some other device/card.  Note that the adapter IRQ
    is set via software (by FreeBSD) and not by some jumper setting.
    When you configure the FreeBSD kernel (see below), you'll be
    specifying the IRQ to use (as part of the pcic device), and you want
    to insure that this IRQ is free, and has not been assigned by the
    BIOS to some other device/card.  To do this, you need to tell the
    BIOS that this IRQ is not available for use by PNP or PCI cards.

    For the AWARD BIOS, this setting is usually under the "PNP/PCI
    CONFIGURATION" or "PNP, PCI, & ONBOARD I/O" page.  You'll want to
    set the BIOS settings to:

	Resources Controlled By:	Manual
	IRQ 10:				N (or "Legacy ISA")

    If the BIOS does assign IRQ 10 to another device/card (you do not
    want this to happen), the pccard functions will not work, and a good
    indication of this is an IRQ mismatch in dmesg, like:

	pcic0: <VLSI 82C146> at port 0x3e0 iomem 0xd0000 irq 10 on isa0
	pcic0: management irq 11

    Note the IRQ mismatch (10 vs 11).  If this part is configured
    properly, the IRQ values should match, like:

	pcic0: <VLSI 82C146> at port 0x3e0 iomem 0xd0000 irq 10 on isa0
	pcic0: management irq 10

    If you have no free IRQs, you could try to use the WaveLan PCMCIA
    adapter in "polled" mode, which does not require an IRQ, but is more
    inefficient.  I haven't tried this, though.

    If you're short on IRQs, you may want to disable any device that you
    don't need.  For example, I don't need the second serial port, and
    so I disabled it, freeing the corresponding IRQ (IRQ3) for use by
    the WaveLan card.

 3. Boot FreeBSD.

 4. Edit /etc/rc.conf, and add lines like the following to it:

	pccard_enable="YES"
	pccard_mem="0xd0000"
	pccard_ifconfig="inet 10.0.0.1 netmask 255.255.255.0"
	pccard_conf="/etc/pccard.conf"
	gateway_enable="YES"
	firewall_enable="YES"
	firewall_type="simple"
	natd_enable="YES"
	natd_interface="fxp0"

    Here, you will have to edit the values for "pccard_mem",
    "pccard_ifconfig", and "natd_interface".  You may also want to
    change "firewall_type".

    If the desktop is connected to the public Internet, you'll
    definitely want to change the firewall type.  Read the ipfw(8) man
    page, as well as the comments in "/etc/rc.firewall".

    If you leave "firewall_type" set to "simple", you will have to edit
    /etc/rc.firewall; in that file, see the section for "simple" (search
    for "simple firewall") and follow the instructions there.

    The value of "pccard_mem" must match the setting used in the kernel
    configuration (i.e., the value of "iomem" in "device pcic0" -- see
    step X, below).

    You'll probably want to change "pccard_ifconfig" to reflect your
    local LAN settings.  Here, the values you'll be placing here are the
    values that will be used by the WaveLan card.  Since we will be
    using natd, we can use an unregistered IP address here.

    Change "natd_interface" to the interface of your wired, public LAN
    interface.  The idea is that LAN packets will be arriving on the
    WaveLan interface, translated by natd, and then sent back out on the
    wired LAN specified by "natd_interface", and vice-versa.

    Save "/etc/rc.conf".

 5. At the bottom of this message, there is an appended file,
    "/etc/setup_wi0".  Install the file as "/etc/setup_wi0".  Make sure
    the first line is "#! /bin/sh".  Make sure it's executable.

    (If you don't know what I'm talking about, you really should not be
    doing this.)

 6. Edit "/etc/setup_wi0".  Read the comments at the beginning of the
    file and set the variables appropriately.

    This script will be executed when the WaveLan card is inserted, or
    at bootup if the card is present at bootup.  This script sets up
    various WaveLan parameters, such as the frequency channel and
    optional encryption key.

 7. Copy "/etc/defaults/pccard.conf.sample" to "/etc/pccard.conf".

 8. Edit "/etc/pccard.conf", and look for the entry:

	# Lucent WaveLAN/IEEE
	card "Lucent Technologies" "WaveLAN/IEEE"
		config	0x1 "wi0" ?
		insert	logger -t pccard:$device -s WaveLAN/IEEE inserted
		insert	/etc/pccard_ether $device
		remove	logger -t pccard:$device -s WaveLAN/IEEE removed
		remove	/sbin/ifconfig $device delete

    In this entry, add the line:

		insert  /etc/setup_$device

    So that the entry looks like:

	# Lucent WaveLAN/IEEE
	card "Lucent Technologies" "WaveLAN/IEEE"
		config	0x1 "wi0" ?
		insert	logger -t pccard:$device -s WaveLAN/IEEE inserted
		insert	/etc/pccard_ether $device
		insert  /etc/setup_$device
		remove	logger -t pccard:$device -s WaveLAN/IEEE removed
		remove	/sbin/ifconfig $device delete

    Save "/etc/pccard.conf".

 9. Next, you'll have to reconfigure and build a new kernel.

    IMPORTANT NOTE: READ EVERYTHING IN THIS STEP.  YOU MAY RUN INTO
    PROBLEMS LATER, IF YOU DON'T.

    First, add the following parameters to your kernel config file, if
    they're not already there:

	options IPFIREWALL
	options IPDIVERT
	device wi

    [ Technically, you don't need to compile "device wi" into the
      kernel, as you can, theoretically, load the "if_wi" module at
      bootup (e.g., "kldload if_wi").  However, I haven't tested this,
      and, while it should work, I know that compiling the device into
      the kernel works.  If anyone has any success with "kldload if_wi",
      please tell me, so that I can update this.  ]

    Also, in your kernel config file, locate the section on PCCARD
    support, like:

	# PCCARD (PCMCIA) support
	device		card
	device		pcic0	at isa? irq 10 port 0x3e0 iomem 0xd0000

    If you previously deleted or commented out the above, put it back
    (you can copy the above lines from GENERIC or LINT).

    You don't need the following line, but, if you are using 0x3e2 for
    the WaveLan PCMCIA ISA adapter base address, you'll have to delete
    or comment it out:

	device		pcic1	at isa? irq 11 port 0x3e2 iomem 0xd4000 disable

    However, you may have to edit this line:

	device		pcic0	at isa? irq 10 port 0x3e0 iomem 0xd0000

    Here, you may have to change the IRQ and port settings, depending on
    what you did in steps 1 & 2, above.  If you are not using an IRQ for
    the PCMCIA adapter (you're using it in polled mode), eliminate the
    IRQ setting, like:

	device		pcic0	at isa? port 0x3e0 iomem 0xd0000

    IMPORTANT NOTE: You may also have to change the value of iomem.  If,
    after rebuilding the kernel and rebooting, the pccard interface
    doesn't work (assuming that you followed the instructions BELOW to
    enable it), try setting iomem to one of 0xd4000, 0xd8000, or
    0xdc000.  You may run into memory conflicts with 0xd0000.  A good
    indication of a memory conflict is when "pccardc dumpcis" produces
    garbage (e.g, "code XXX ignored", where "XXX" is a number like
    "192").  It seems that people with SCSI controllers can run into
    this problem.

    If you change iomem, note that you must also change the
    corresponding entry in /etc/rc.conf.

    Build the new kernel, install it, and reboot.

10. If all goes well, after rebooting, you should see a message like
    (by default, this goes to the console only, is not visible via
    dmesg, and is not written to a log file):

	pccardd[44]: Card "Lucent Technologies"("WaveLAN/IEEE") matched
		"Lucent Technologies" ("WaveLAN/IEEE")

    This will be all on one line.

    After another moment or two, you should see a message like this:

	wi0: <WaveLAN/IEEE 802.11> at port 0x240-0x27f irq 3 slot 0 on pccard0

    Fortunately, this message is visible via dmesg, and so does get put
    into /var/log/messages.


CONFIGURING THE LAPTOP

     Configuring the laptop is very similar to configuring the desktop,
except that it's simpler, due to the fact that the PCMCIA interface is
built into the laptop.


TROUBLESHOOTING

 1. Nothing appears to happen after rebooting.

    Run dmesg.  Look for lines that start with "pcic0:".  If you find
    some, the PCMCIA adapter was found, and you should skip to the next
    item.

    If you can't find any, this probably means that there is a problem
    with the PCMCIA adapter/controller:

    * Did you just reboot from Windows 95/98/NT?  FreeBSD 4.X has a
      minor problem where the PCMCIA controller is not recognized if you
      just rebooted from Windows.  If you reboot again, the PCMCIA
      controller should be found.  (Basically, if you were running
      Windows, you need to reboot twice -- or turn off the power -- to
      get FreeBSD to recognize the adapter.)

    * Is the PCMCIA adapter port address correct?  Note that the default
      address of the WaveLan PCMCIA adapter is 0x3E2, but the default
      for the FreeBSD driver is 0x3E0.  They've got to match.

 2. The ISA PCMCIA adapter does not recognize the WaveLan card; nothing
    happens when the card is inserted.

    If you assigned an IRQ to the ISA PCMCIA adapter (recommended), did
    you tell the BIOS that this IRQ is not available for use by PNP/PCI
    cards (see step #2 in the configuration section, above)?  One
    indication that you didn't do this is an IRQ mismatch, like:

	pcic0: <VLSI 82C146> at port 0x3e0 iomem 0xd0000 irq 10 on isa0
	pcic0: management irq 11

    Note the IRQ mismatch (10 vs 11).  If this is configured properly,
    the IRQ values should match, like:

	pcic0: <VLSI 82C146> at port 0x3e0 iomem 0xd0000 irq 10 on isa0
	pcic0: management irq 10

 3. The PCMCIA adapter does not recognize the WaveLan card; you get
    error messages like:

	pccardd: No card in database for ""("")

    This particular error is usually caused by a memory address
    conflict; if so, the solution is to set "iomem" to a different
    address (see step #9 in the configuration section, above).  To
    verify a memory conflict, try running "pccard dumpcis"; if you get
    messages like "code XXX ignored", where "XXX" is a number, then you
    probably have a memory conflict.

    If you changed iomem, did you also edit /etc/rc.conf to reflect that
    fact?  The values for iomem and pccard_mem in /etc/rc.conf must
    match.  If you edit rc.conf, you'll have to reboot.

    If the memory addresses are correct (iomem and pccard_mem), "pccard
    dumpcis" should output a section like (in addition to a lot of other
    text):

	Tuple #4, code = 0x15 (Version 1 info), length = 80
	    000:  05 00 4c 75 63 65 6e 74 20 54 65 63 68 6e 6f 6c
	    010:  6f 67 69 65 73 00 57 61 76 65 4c 41 4e 2f 49 45
	    020:  45 45 00 56 65 72 73 69 6f 6e 20 30 31 2e 30 31
	    030:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	    040:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff
		Version = 5.0, Manuf = [Lucent Technologies],card vers = [WaveLAN/IEEE]
		Addit. info = [Version 01.01],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]

    Note that the above is approximate; it may change with different
    card firmware revisions.

 4. Did you edit /etc/pccard.conf to allow the use of IRQ9 for the
    WaveLan card (wi0)?  IRQ9 may not work with the WaveLan card.  You
    may have to come up with another IRQ.

 5. The WaveLan driver complains about:

	wi0: No irq?!

    This means that the driver could not allocate a free IRQ for the
    WaveLan card.  Unfortunately, there's no easy solution for this --
    you've got to somehow free up an IRQ for the card.  Note that the
    list of possible IRQs to use is listed in /etc/pccard.conf; if you
    free up an IRQ, make sure it's listed there.

 6. The driver complains about:

	wi0: No I/O space?!

    This means that the driver could not allocate a range of I/O ports
    to use to access the card.

    I've only seen this when I tried to insert the WaveLan card into a
    laptop that already has another PCMCIA card in another slot, and the
    wi0 driver failed because it could not allocate an IRQ ("wi0: No irq?!").
    If I ejected the other card and re-inserted the WaveLan card, I
    would then get the "No I/O space?!" error.  The solution is to
    reboot.

    (I think this is caused by a minor bug in the pccard or wi driver
    code.)

If the card is found and properly initialized, the problem is probably
caused by some network-related error (the same types that afflict wired
LAN cards), and so is beyond the scope of this article.


===============================================================================
= Here is the "/etc/setup_wi0" script.
====== cut here ===== cut here ===== cut here =================================
#! /bin/sh
set -e

###############################################################################
#
# Configuration variables:

# IFC is the wavelan interface to use (e.g., "wi0"); this must be
# specified:

IFC=wi0

# STATION_NAME is, well, the "station name", which is really only used
# by the WaveLan diagostic tools.  When using the tools (in a remote
# PC -- not this one), the tools will display this name when
# identifying the WaveLan card in this system.  Because it's only used
# by remote diagnostic tools, it's not essential to set SYSTEM_NAME.
# However, it is recommended that, if it is set, it be set to be the
# same as the hostname (otherwise, you'll have to remember which
# station name goes with which hostname).
#
# Note, however, that the following uses `hostname` as the default.
# This may not work if this script is called at bootup (especially
# when called from pccard.conf), because the hostname may not yet have
# been set.  In this case, you should hardcode a value here.

STATION_NAME=`hostname | sed -e 's/\..*$//'`

# NETWORK_NAME is the name of the network that you wish to join (be a
# part of).  NETWORK_NAME must be set if you wish this system to talk
# to a WaveLan access point.  The NETWORK_NAME can be "ANY"
# (upper-case is required), in which case the card will talk to any
# access point; otherwise, NETWORK_NAME must be set to the same name
# used by the access point.  If you are using "ad-hoc mode" (not using
# an access point), which generally is the case with an home LAN, you
# do not need to set NETWORK_NAME (because ad-hoc mode ignores the
# NETWORK_NAME).

NETWORK_NAME='ANY'

# MODE determines how the WaveLan card talks to other cards.  If you
# are using a WaveLan access point, you must set this to "1" (BSS
# mode), and you must also set a valid NETWORK_NAME (above), as the
# NETWORK_NAME must correspond to the name used by the access point.
# For LANs without an access point (the usual case for home LANs),
# MODE should be "3" (ad-hoc mode).

MODE=3			# 1 --> BSS, 3 --> ad-hoc mode

# CHANNEL is the frequency channel to use.  The default for cards sold
# in the USA and Europe (except France) is channel 3, 11 in France,
# and 14 in Japan.  Valid channels are:
#
#	USA:				1-11
#	Europe (except France):		1-13
#	France:				10-13
#	Japan:				14 (only -- unchangeable)
#
# See wicontrol(8) for more information.

CHANNEL=3		# Card default is channel 3

# KEY is the encryption key to use.  If KEY is blank/empty or not set,
# the encryption key is not set, and encryption will not be enabled.
# If a key is specified here, encryption will be enabled (this script
# does not support enabling/disabling encryption independently of key
# values).  Note that, although the wavelan supports up to four
# different keys (but only one can be used at any one time), only one
# key (key 1) is used here.
#
# Remember that all systems that talk to each other must use the same
# key.
#
# See wicontrol(8) for valid key values.

KEY=

#
# End of configuration variables.  Nothing should have to be changed
# past this point.
#
###############################################################################

PATH="/usr/sbin:/usr/bin:/sbin:/bin:$PATH"

if [ "X$STATION_NAME" != "X" ]
then
    wicontrol -i $IFC -s "$STATION_NAME"
fi

wicontrol -i $IFC -p $MODE

if [ "X$NETWORK_NAME" != "X" ]
then
    wicontrol -i $IFC -n "$NETWORK_NAME"
fi

if [ "X$CHANNEL" != "X" ]
then
    wicontrol -i $IFC -f $CHANNEL
fi

if [ \( "X$KEY" != "X" \) -a \
     \( "X$KEY" != "XNO" \) -a \
     \( "X$KEY" != "Xno" \) -a \
     \( "X$KEY" != "XNo" \) \
   ]
then
    wicontrol -i $IFC -k $KEY
    wicontrol -i $IFC -e 1
fi

exit 0


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-mobile" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200005241849.LAA23904>