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)
This commit is contained in:
parent
2ef522c17f
commit
9c1fd0b05f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=189096
@ -32,6 +32,7 @@ static const char rcsid[] =
|
|||||||
"$FreeBSD$";
|
"$FreeBSD$";
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <sys/queue.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
@ -88,14 +89,24 @@ list_cloners(void)
|
|||||||
free(buf);
|
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
|
void
|
||||||
clone_setcallback(clone_callback_func *p)
|
clone_setdefcallback(const char *ifprefix, clone_callback_func *p)
|
||||||
{
|
{
|
||||||
if (clone_cb != NULL && clone_cb != p)
|
struct clone_defcb *dcp;
|
||||||
errx(1, "conflicting device create parameters");
|
|
||||||
clone_cb = p;
|
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)
|
ifclonecreate(int s, void *arg)
|
||||||
{
|
{
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
|
struct clone_defcb *dcp;
|
||||||
|
clone_callback_func *clone_cb = NULL;
|
||||||
|
|
||||||
memset(&ifr, 0, sizeof(ifr));
|
memset(&ifr, 0, sizeof(ifr));
|
||||||
(void) strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
|
(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) {
|
if (clone_cb == NULL) {
|
||||||
/* NB: no parameters */
|
/* NB: no parameters */
|
||||||
if (ioctl(s, SIOCIFCREATE2, &ifr) < 0)
|
if (ioctl(s, SIOCIFCREATE2, &ifr) < 0)
|
||||||
|
@ -141,7 +141,7 @@ void printb(const char *s, unsigned value, const char *bits);
|
|||||||
void ifmaybeload(const char *name);
|
void ifmaybeload(const char *name);
|
||||||
|
|
||||||
typedef void clone_callback_func(int, struct ifreq *);
|
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
|
* XXX expose this so modules that neeed to know of any pending
|
||||||
|
@ -4667,7 +4667,8 @@ wlan_create(int s, struct ifreq *ifr)
|
|||||||
static const uint8_t zerobssid[IEEE80211_ADDR_LEN];
|
static const uint8_t zerobssid[IEEE80211_ADDR_LEN];
|
||||||
|
|
||||||
if (params.icp_parent[0] == '\0')
|
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 &&
|
if (params.icp_opmode == IEEE80211_M_WDS &&
|
||||||
memcmp(params.icp_bssid, zerobssid, sizeof(zerobssid)) == 0)
|
memcmp(params.icp_bssid, zerobssid, sizeof(zerobssid)) == 0)
|
||||||
errx(1, "no bssid specified for WDS (use wlanbssid)");
|
errx(1, "no bssid specified for WDS (use wlanbssid)");
|
||||||
@ -4680,7 +4681,6 @@ static
|
|||||||
DECL_CMD_FUNC(set80211clone_wlandev, arg, d)
|
DECL_CMD_FUNC(set80211clone_wlandev, arg, d)
|
||||||
{
|
{
|
||||||
strlcpy(params.icp_parent, arg, IFNAMSIZ);
|
strlcpy(params.icp_parent, arg, IFNAMSIZ);
|
||||||
clone_setcallback(wlan_create);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
@ -4692,7 +4692,6 @@ DECL_CMD_FUNC(set80211clone_wlanbssid, arg, d)
|
|||||||
if (ea == NULL)
|
if (ea == NULL)
|
||||||
errx(1, "%s: cannot parse bssid", arg);
|
errx(1, "%s: cannot parse bssid", arg);
|
||||||
memcpy(params.icp_bssid, ea->octet, IEEE80211_ADDR_LEN);
|
memcpy(params.icp_bssid, ea->octet, IEEE80211_ADDR_LEN);
|
||||||
clone_setcallback(wlan_create);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
@ -4705,7 +4704,6 @@ DECL_CMD_FUNC(set80211clone_wlanaddr, arg, d)
|
|||||||
errx(1, "%s: cannot parse addres", arg);
|
errx(1, "%s: cannot parse addres", arg);
|
||||||
memcpy(params.icp_macaddr, ea->octet, IEEE80211_ADDR_LEN);
|
memcpy(params.icp_macaddr, ea->octet, IEEE80211_ADDR_LEN);
|
||||||
params.icp_flags |= IEEE80211_CLONE_MACADDR;
|
params.icp_flags |= IEEE80211_CLONE_MACADDR;
|
||||||
clone_setcallback(wlan_create);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
@ -4729,7 +4727,6 @@ DECL_CMD_FUNC(set80211clone_wlanmode, arg, d)
|
|||||||
params.icp_flags |= IEEE80211_CLONE_TDMA;
|
params.icp_flags |= IEEE80211_CLONE_TDMA;
|
||||||
} else
|
} else
|
||||||
errx(1, "Don't know to create %s for %s", arg, name);
|
errx(1, "Don't know to create %s for %s", arg, name);
|
||||||
clone_setcallback(wlan_create);
|
|
||||||
#undef iseq
|
#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;
|
params.icp_flags &= ~IEEE80211_CLONE_NOBEACONS;
|
||||||
else
|
else
|
||||||
params.icp_flags |= IEEE80211_CLONE_NOBEACONS;
|
params.icp_flags |= IEEE80211_CLONE_NOBEACONS;
|
||||||
clone_setcallback(wlan_create);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
params.icp_flags |= IEEE80211_CLONE_BSSID;
|
||||||
else
|
else
|
||||||
params.icp_flags &= ~IEEE80211_CLONE_BSSID;
|
params.icp_flags &= ~IEEE80211_CLONE_BSSID;
|
||||||
clone_setcallback(wlan_create);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
params.icp_flags |= IEEE80211_CLONE_WDSLEGACY;
|
||||||
else
|
else
|
||||||
params.icp_flags &= ~IEEE80211_CLONE_WDSLEGACY;
|
params.icp_flags &= ~IEEE80211_CLONE_WDSLEGACY;
|
||||||
clone_setcallback(wlan_create);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct cmd ieee80211_cmds[] = {
|
static struct cmd ieee80211_cmds[] = {
|
||||||
@ -4935,5 +4929,6 @@ ieee80211_ctor(void)
|
|||||||
for (i = 0; i < N(ieee80211_cmds); i++)
|
for (i = 0; i < N(ieee80211_cmds); i++)
|
||||||
cmd_register(&ieee80211_cmds[i]);
|
cmd_register(&ieee80211_cmds[i]);
|
||||||
af_register(&af_ieee80211);
|
af_register(&af_ieee80211);
|
||||||
|
clone_setdefcallback("wlan", wlan_create);
|
||||||
#undef N
|
#undef N
|
||||||
}
|
}
|
||||||
|
@ -136,8 +136,6 @@ DECL_CMD_FUNC(setvlantag, val, d)
|
|||||||
|
|
||||||
if (getvlan(s, &ifr, &vreq) != -1)
|
if (getvlan(s, &ifr, &vreq) != -1)
|
||||||
vlan_set(s, &ifr);
|
vlan_set(s, &ifr);
|
||||||
else
|
|
||||||
clone_setcallback(vlan_create);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
@ -149,8 +147,6 @@ DECL_CMD_FUNC(setvlandev, val, d)
|
|||||||
|
|
||||||
if (getvlan(s, &ifr, &vreq) != -1)
|
if (getvlan(s, &ifr, &vreq) != -1)
|
||||||
vlan_set(s, &ifr);
|
vlan_set(s, &ifr);
|
||||||
else
|
|
||||||
clone_setcallback(vlan_create);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
@ -202,5 +198,6 @@ vlan_ctor(void)
|
|||||||
cmd_register(&vlan_cmds[i]);
|
cmd_register(&vlan_cmds[i]);
|
||||||
af_register(&af_vlan);
|
af_register(&af_vlan);
|
||||||
callback_register(vlan_cb, NULL);
|
callback_register(vlan_cb, NULL);
|
||||||
|
clone_setdefcallback("vlan", vlan_create);
|
||||||
#undef N
|
#undef N
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user