Date: Mon, 30 Jun 2003 16:17:51 +0100 From: Bruce M Simpson <bms@spc.org> To: Robert Dezorzo <rdezorzo@detronics.sk> Cc: freebsd-mobile@freebsd.org Subject: Re: Setting ssid - quick answer please Message-ID: <20030630151751.GK9463@spc.org> In-Reply-To: <OAEGJHLACADONHGPODGIOEAECAAA.rdezorzo@detronics.sk> References: <3EFFF629.3090500@linuxpowered.com> <OAEGJHLACADONHGPODGIOEAECAAA.rdezorzo@detronics.sk>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
On Mon, Jun 30, 2003 at 12:28:51PM +0200, Robert Dezorzo wrote:
>
> Or alternatively make start_if.wi0 file and wrote in this file all
> information about AP
You might also find this hack of mine useful under 4.x.
It forces a 'wait' in a shell script (such as start_if.wi0) until the
card's firmware has bound to an AP, before dhclient runs.
Attached.
BMS
[-- Attachment #2 --]
#
# waitforap makefile
#
PROG= waitforap
SRCS= waitforap.c
NOMAN= defined
.include <bsd.prog.mk>
[-- Attachment #3 --]
/*
* bms 2003/05/19
*/
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <err.h>
#include <net/ethernet.h>
#include <net/if.h>
#include <net/if_dl.h>
#include <net/if_types.h>
#include <net/if_media.h>
#include <net/if_ieee80211.h>
void
usage(void)
{
fprintf(stderr, "waitforap: usage: waitforap <interface>\n");
}
int
waitforap(int s, char *name)
{
struct ieee80211req ireq;
struct ifmediareq ifmr;
u_int8_t data[32];
int associated = 0;
int *media_list, i;
(void) memset(&ireq, 0, sizeof(ireq));
(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
ireq.i_data = &data;
ireq.i_type = IEEE80211_IOC_SSID;
ireq.i_val = -1;
if (ioctl(s, SIOCG80211, &ireq) < 0) {
/* If we can't get the SSID, the this isn't an 802.11 device. */
return -1;
}
(void) memset(&ifmr, 0, sizeof(ifmr));
(void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
/*
* Interface doesn't support SIOC{G,S}IFMEDIA.
*/
return -1;
}
if (ifmr.ifm_count == 0) {
warnx("%s: no media types?", name);
return -1;
}
media_list = (int *)malloc(ifmr.ifm_count * sizeof(int));
if (media_list == NULL)
err(1, "malloc");
ifmr.ifm_ulist = media_list;
do {
sleep(1);
if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
err(1, "SIOCGIFMEDIA");
if (ifmr.ifm_status & IFM_AVALID) {
switch (IFM_TYPE(ifmr.ifm_active)) {
case IFM_IEEE80211:
/* XXX: Not valid for adhoc */
if (ifmr.ifm_status & IFM_ACTIVE)
associated = 1;
break;
default:
warnx("%s: not 802.11 media?", name);
free(media_list);
return -1;
}
}
} while (!associated);
free(media_list);
return 0;
}
int
main(int argc, char *argv[])
{
int s = -1, r = -1;
if (argc != 2) {
usage();
exit(EXIT_FAILURE);
}
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == -1) {
err(1, "socket");
}
r = waitforap(s, argv[1]);
cleanup:
if (s != -1)
close(s);
exit(r == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
}
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030630151751.GK9463>
