Re: Setting ssid - quick answer please

Bruce M Simpson <[email protected]>
Newsgroups gmane.os.freebsd.devel.mobile
Message-ID <[email protected]>
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

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-mobile
To unsubscribe, send any mail to "[email protected]"
Makefile (text/plain, 100 B)
#
# waitforap makefile
#

PROG=	waitforap
SRCS=	waitforap.c

NOMAN=	defined

.include <bsd.prog.mk>
waitforap.c (text/plain, 2.4 KB)
/*
 * 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);
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.