summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorrpaulo <rpaulo@FreeBSD.org>2009-02-27 00:31:34 +0000
committerrpaulo <rpaulo@FreeBSD.org>2009-02-27 00:31:34 +0000
commit2af9e81296d11b332adae2fe9855f658a4660ae8 (patch)
tree7275c4eafc8684e62de1c0c3a9947ef80862818d /sbin
parent9e19feba057306f5e98a28151c121d0eefe749f2 (diff)
downloadFreeBSD-src-2af9e81296d11b332adae2fe9855f658a4660ae8.zip
FreeBSD-src-2af9e81296d11b332adae2fe9855f658a4660ae8.tar.gz
Replace clone_setcallback() with a new function clone_setdefcallback()
that selects a callback from an interface prefix name. This allows us to report a meaningful error when the user types 'ifconfig wlan0 create', for example, and also kills some redundant code. Reviewed by: sam (earlier version)
Diffstat (limited to 'sbin')
-rw-r--r--sbin/ifconfig/ifclone.c34
-rw-r--r--sbin/ifconfig/ifconfig.h2
-rw-r--r--sbin/ifconfig/ifieee80211.c11
-rw-r--r--sbin/ifconfig/ifvlan.c5
4 files changed, 34 insertions, 18 deletions
diff --git a/sbin/ifconfig/ifclone.c b/sbin/ifconfig/ifclone.c
index bf68d56..8fba9ff 100644
--- a/sbin/ifconfig/ifclone.c
+++ b/sbin/ifconfig/ifclone.c
@@ -32,6 +32,7 @@ static const char rcsid[] =
"$FreeBSD$";
#endif /* not lint */
+#include <sys/queue.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
@@ -88,14 +89,24 @@ list_cloners(void)
free(buf);
}
-static clone_callback_func *clone_cb = NULL;
+struct clone_defcb {
+ char ifprefix[IFNAMSIZ];
+ clone_callback_func *clone_cb;
+ SLIST_ENTRY(clone_defcb) next;
+};
+
+static SLIST_HEAD(, clone_defcb) clone_defcbh =
+ SLIST_HEAD_INITIALIZER(clone_defcbh);
void
-clone_setcallback(clone_callback_func *p)
+clone_setdefcallback(const char *ifprefix, clone_callback_func *p)
{
- if (clone_cb != NULL && clone_cb != p)
- errx(1, "conflicting device create parameters");
- clone_cb = p;
+ struct clone_defcb *dcp;
+
+ dcp = malloc(sizeof(*dcp));
+ strlcpy(dcp->ifprefix, ifprefix, IFNAMSIZ-1);
+ dcp->clone_cb = p;
+ SLIST_INSERT_HEAD(&clone_defcbh, dcp, next);
}
/*
@@ -108,9 +119,22 @@ static void
ifclonecreate(int s, void *arg)
{
struct ifreq ifr;
+ struct clone_defcb *dcp;
+ clone_callback_func *clone_cb = NULL;
memset(&ifr, 0, sizeof(ifr));
(void) strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+
+ if (clone_cb == NULL) {
+ /* Try to find a default callback */
+ SLIST_FOREACH(dcp, &clone_defcbh, next) {
+ if (strncmp(dcp->ifprefix, ifr.ifr_name,
+ strlen(dcp->ifprefix)) == 0) {
+ clone_cb = dcp->clone_cb;
+ break;
+ }
+ }
+ }
if (clone_cb == NULL) {
/* NB: no parameters */
if (ioctl(s, SIOCIFCREATE2, &ifr) < 0)
diff --git a/sbin/ifconfig/ifconfig.h b/sbin/ifconfig/ifconfig.h
index 70c1cad..cb1a46d 100644
--- a/sbin/ifconfig/ifconfig.h
+++ b/sbin/ifconfig/ifconfig.h
@@ -141,7 +141,7 @@ void printb(const char *s, unsigned value, const char *bits);
void ifmaybeload(const char *name);
typedef void clone_callback_func(int, struct ifreq *);
-void clone_setcallback(clone_callback_func *);
+void clone_setdefcallback(const char *, clone_callback_func *);
/*
* XXX expose this so modules that neeed to know of any pending
diff --git a/sbin/ifconfig/ifieee80211.c b/sbin/ifconfig/ifieee80211.c
index e5b9d8b..16615a3 100644
--- a/sbin/ifconfig/ifieee80211.c
+++ b/sbin/ifconfig/ifieee80211.c
@@ -4667,7 +4667,8 @@ wlan_create(int s, struct ifreq *ifr)
static const uint8_t zerobssid[IEEE80211_ADDR_LEN];
if (params.icp_parent[0] == '\0')
- errx(1, "must specify a parent when creating a wlan device");
+ errx(1, "must specify a parent device (wlandev) when creating "
+ "a wlan device");
if (params.icp_opmode == IEEE80211_M_WDS &&
memcmp(params.icp_bssid, zerobssid, sizeof(zerobssid)) == 0)
errx(1, "no bssid specified for WDS (use wlanbssid)");
@@ -4680,7 +4681,6 @@ static
DECL_CMD_FUNC(set80211clone_wlandev, arg, d)
{
strlcpy(params.icp_parent, arg, IFNAMSIZ);
- clone_setcallback(wlan_create);
}
static
@@ -4692,7 +4692,6 @@ DECL_CMD_FUNC(set80211clone_wlanbssid, arg, d)
if (ea == NULL)
errx(1, "%s: cannot parse bssid", arg);
memcpy(params.icp_bssid, ea->octet, IEEE80211_ADDR_LEN);
- clone_setcallback(wlan_create);
}
static
@@ -4705,7 +4704,6 @@ DECL_CMD_FUNC(set80211clone_wlanaddr, arg, d)
errx(1, "%s: cannot parse addres", arg);
memcpy(params.icp_macaddr, ea->octet, IEEE80211_ADDR_LEN);
params.icp_flags |= IEEE80211_CLONE_MACADDR;
- clone_setcallback(wlan_create);
}
static
@@ -4729,7 +4727,6 @@ DECL_CMD_FUNC(set80211clone_wlanmode, arg, d)
params.icp_flags |= IEEE80211_CLONE_TDMA;
} else
errx(1, "Don't know to create %s for %s", arg, name);
- clone_setcallback(wlan_create);
#undef iseq
}
@@ -4741,7 +4738,6 @@ set80211clone_beacons(const char *val, int d, int s, const struct afswtch *rafp)
params.icp_flags &= ~IEEE80211_CLONE_NOBEACONS;
else
params.icp_flags |= IEEE80211_CLONE_NOBEACONS;
- clone_setcallback(wlan_create);
}
static void
@@ -4751,7 +4747,6 @@ set80211clone_bssid(const char *val, int d, int s, const struct afswtch *rafp)
params.icp_flags |= IEEE80211_CLONE_BSSID;
else
params.icp_flags &= ~IEEE80211_CLONE_BSSID;
- clone_setcallback(wlan_create);
}
static void
@@ -4761,7 +4756,6 @@ set80211clone_wdslegacy(const char *val, int d, int s, const struct afswtch *raf
params.icp_flags |= IEEE80211_CLONE_WDSLEGACY;
else
params.icp_flags &= ~IEEE80211_CLONE_WDSLEGACY;
- clone_setcallback(wlan_create);
}
static struct cmd ieee80211_cmds[] = {
@@ -4935,5 +4929,6 @@ ieee80211_ctor(void)
for (i = 0; i < N(ieee80211_cmds); i++)
cmd_register(&ieee80211_cmds[i]);
af_register(&af_ieee80211);
+ clone_setdefcallback("wlan", wlan_create);
#undef N
}
diff --git a/sbin/ifconfig/ifvlan.c b/sbin/ifconfig/ifvlan.c
index 6742789..0f65846 100644
--- a/sbin/ifconfig/ifvlan.c
+++ b/sbin/ifconfig/ifvlan.c
@@ -136,8 +136,6 @@ DECL_CMD_FUNC(setvlantag, val, d)
if (getvlan(s, &ifr, &vreq) != -1)
vlan_set(s, &ifr);
- else
- clone_setcallback(vlan_create);
}
static
@@ -149,8 +147,6 @@ DECL_CMD_FUNC(setvlandev, val, d)
if (getvlan(s, &ifr, &vreq) != -1)
vlan_set(s, &ifr);
- else
- clone_setcallback(vlan_create);
}
static
@@ -202,5 +198,6 @@ vlan_ctor(void)
cmd_register(&vlan_cmds[i]);
af_register(&af_vlan);
callback_register(vlan_cb, NULL);
+ clone_setdefcallback("vlan", vlan_create);
#undef N
}
OpenPOWER on IntegriCloud