From owner-svn-src-head@FreeBSD.ORG Wed Apr 15 22:10:33 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9E5851065674; Wed, 15 Apr 2009 22:10:33 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 81A888FC0A; Wed, 15 Apr 2009 22:10:33 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n3FMAXUI056294; Wed, 15 Apr 2009 22:10:33 GMT (envelope-from sam@svn.freebsd.org) Received: (from sam@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n3FMAXXr056293; Wed, 15 Apr 2009 22:10:33 GMT (envelope-from sam@svn.freebsd.org) Message-Id: <200904152210.n3FMAXXr056293@svn.freebsd.org> From: Sam Leffler Date: Wed, 15 Apr 2009 22:10:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r191127 - head/tools/tools/net80211/wlanwds X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 15 Apr 2009 22:10:34 -0000 Author: sam Date: Wed Apr 15 22:10:33 2009 New Revision: 191127 URL: http://svn.freebsd.org/changeset/base/191127 Log: o remove the -p option; use the %parent pointer sysctl to find the parent ifnet o remove the -b option; users can just embed the bridge ifnet in the script o add -j option to create wds vaps on join/rejoin ops Modified: head/tools/tools/net80211/wlanwds/wlanwds.c Modified: head/tools/tools/net80211/wlanwds/wlanwds.c ============================================================================== --- head/tools/tools/net80211/wlanwds/wlanwds.c Wed Apr 15 22:09:42 2009 (r191126) +++ head/tools/tools/net80211/wlanwds/wlanwds.c Wed Apr 15 22:10:33 2009 (r191127) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2006-2007 Sam Leffler, Errno Consulting + * Copyright (c) 2006-2009 Sam Leffler, Errno Consulting * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -39,8 +39,7 @@ * * Note we query only internal state which means if we don't see * a vap created we won't handle leave/delete properly. Also there - * are several fixed pathnames/strings. Some require fixing - * kernel support (e.g. sysctl to find parent device of a vap). + * are several fixed pathnames/strings. * * Code liberaly swiped from wlanwatch; probably should nuke printfs. */ @@ -84,10 +83,9 @@ struct wds { }; static struct wds *wds; -static const char *bridge = "bridge0"; -static const char *parent = "mv0"; /* XXX no sysctl to find this */ static const char *script = "/usr/local/bin/wdsup"; static int verbose = 0; +static int discover_on_join = 0; static void handle_rtmsg(struct rt_msghdr *rtm, int msglen); static void wds_discovery(const char *ifname, @@ -103,13 +101,10 @@ main(int argc, char *argv[]) int n, s, c; char msg[2048]; - while ((c = getopt(argc, argv, "b:p:s:vn")) != -1) + while ((c = getopt(argc, argv, "js:vn")) != -1) switch (c) { - case 'b': - bridge = optarg; - break; - case 'p': - parent = optarg; + case 'j': + discover_on_join = 1; break; case 's': script = optarg; @@ -118,8 +113,9 @@ main(int argc, char *argv[]) verbose = 1; break; case '?': - errx(1, "usage: %s [-b ] [-p ] [-s ]\n" - " [-v (for verbose)]\n", argv[0]); + errx(1, "usage: %s [-s ]\n" + " [-v (for verbose)]\n" + " [-j (act on join/rejoin events)]\n", argv[0]); /*NOTREACHED*/ } @@ -188,20 +184,23 @@ handle_rtmsg(struct rt_msghdr *rtm, int if (verbose) printf("\n"); break; + case RTM_IEEE80211_JOIN: + case RTM_IEEE80211_REJOIN: + if (!discover_on_join) + break; + /* fall thru... */ case RTM_IEEE80211_WDS: if (verbose) printf("%.19s %s wds discovery", cnow, ether_sprintf(V(ieee80211_wds_event)->iev_addr)); - /* XXX wlan0 */ - wds_discovery("wlan0", V(ieee80211_wds_event)->iev_addr); + wds_discovery(ifan->ifan_name, + V(ieee80211_wds_event)->iev_addr); if (verbose) printf("\n"); break; case RTM_IEEE80211_ASSOC: case RTM_IEEE80211_REASSOC: case RTM_IEEE80211_DISASSOC: - case RTM_IEEE80211_JOIN: - case RTM_IEEE80211_REJOIN: case RTM_IEEE80211_SCAN: case RTM_IEEE80211_REPLAY: case RTM_IEEE80211_MICHAEL: @@ -221,6 +220,8 @@ static void wds_discovery(const char *ifname, const uint8_t bssid[IEEE80211_ADDR_LEN]) { struct wds *p; + char oid[256], parent[256]; + int parentlen; for (p = wds; p != NULL; p = p->next) if (IEEE80211_ADDR_EQ(p->bssid, bssid)) { @@ -228,13 +229,22 @@ wds_discovery(const char *ifname, const printf(" (already created)"); return; } + + /* fetch parent interface name */ + snprintf(oid, sizeof(oid), "net.wlan.%s.%%parent", ifname+4); + parentlen = sizeof(parent); + if (sysctlbyname(oid, parent, &parentlen, NULL, 0) < 0) { + warn("%s: no pointer to parent interface", __func__); + return; + } + parent[parentlen] = '\0'; + p = malloc(sizeof(struct wds)); if (p == NULL) { warn("%s: malloc", __func__); return; } IEEE80211_ADDR_COPY(p->bssid, bssid); - /* XXX mv0: no sysctl to find parent device */ if (wds_vap_create(parent, p) >= 0) { char cmd[1024]; int status; @@ -249,8 +259,7 @@ wds_discovery(const char *ifname, const /* * XXX launch script to setup bridge, etc. */ - snprintf(cmd, sizeof(cmd), "%s %s %s", - script, p->ifname, bridge); + snprintf(cmd, sizeof(cmd), "%s %s", script, p->ifname); status = system(cmd); if (status) warnx("vap setup script %s exited with status %d\n",