nl80211: Add a handler to create_interface

Add an option to pass a handler to nl80211_create_iface() and
nl80211_create_interface_once() that will be called after receiving the
message from the kernel. This handler will add the option to process the
message in different ways for different interfaces.

Signed-off-by: David Spinadel <david.spinadel@intel.com>
This commit is contained in:
David Spinadel 2013-06-25 13:35:05 +03:00 committed by Jouni Malinen
parent d3aaef8034
commit d6dcfcdaac

View file

@ -6569,7 +6569,9 @@ static const char * nl80211_iftype_str(enum nl80211_iftype mode)
static int nl80211_create_iface_once(struct wpa_driver_nl80211_data *drv, static int nl80211_create_iface_once(struct wpa_driver_nl80211_data *drv,
const char *ifname, const char *ifname,
enum nl80211_iftype iftype, enum nl80211_iftype iftype,
const u8 *addr, int wds) const u8 *addr, int wds,
int (*handler)(struct nl_msg *, void *),
void *arg)
{ {
struct nl_msg *msg; struct nl_msg *msg;
int ifidx; int ifidx;
@ -6601,7 +6603,7 @@ static int nl80211_create_iface_once(struct wpa_driver_nl80211_data *drv,
NLA_PUT_U8(msg, NL80211_ATTR_4ADDR, wds); NLA_PUT_U8(msg, NL80211_ATTR_4ADDR, wds);
} }
ret = send_and_recv_msgs(drv, msg, NULL, NULL); ret = send_and_recv_msgs(drv, msg, handler, arg);
msg = NULL; msg = NULL;
if (ret) { if (ret) {
nla_put_failure: nla_put_failure:
@ -6633,11 +6635,14 @@ static int nl80211_create_iface_once(struct wpa_driver_nl80211_data *drv,
static int nl80211_create_iface(struct wpa_driver_nl80211_data *drv, static int nl80211_create_iface(struct wpa_driver_nl80211_data *drv,
const char *ifname, enum nl80211_iftype iftype, const char *ifname, enum nl80211_iftype iftype,
const u8 *addr, int wds) const u8 *addr, int wds,
int (*handler)(struct nl_msg *, void *),
void *arg)
{ {
int ret; int ret;
ret = nl80211_create_iface_once(drv, ifname, iftype, addr, wds); ret = nl80211_create_iface_once(drv, ifname, iftype, addr, wds, handler,
arg);
/* if error occurred and interface exists already */ /* if error occurred and interface exists already */
if (ret == -ENFILE && if_nametoindex(ifname)) { if (ret == -ENFILE && if_nametoindex(ifname)) {
@ -6648,7 +6653,7 @@ static int nl80211_create_iface(struct wpa_driver_nl80211_data *drv,
/* Try to create the interface again */ /* Try to create the interface again */
ret = nl80211_create_iface_once(drv, ifname, iftype, addr, ret = nl80211_create_iface_once(drv, ifname, iftype, addr,
wds); wds, handler, arg);
} }
if (ret >= 0 && is_p2p_net_interface(iftype)) if (ret >= 0 && is_p2p_net_interface(iftype))
@ -6998,7 +7003,7 @@ nl80211_create_monitor_interface(struct wpa_driver_nl80211_data *drv)
drv->monitor_ifidx = drv->monitor_ifidx =
nl80211_create_iface(drv, buf, NL80211_IFTYPE_MONITOR, NULL, nl80211_create_iface(drv, buf, NL80211_IFTYPE_MONITOR, NULL,
0); 0, NULL, NULL);
if (drv->monitor_ifidx == -EOPNOTSUPP) { if (drv->monitor_ifidx == -EOPNOTSUPP) {
/* /*
@ -8509,7 +8514,7 @@ static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val,
if (!if_nametoindex(name)) { if (!if_nametoindex(name)) {
if (nl80211_create_iface(drv, name, if (nl80211_create_iface(drv, name,
NL80211_IFTYPE_AP_VLAN, NL80211_IFTYPE_AP_VLAN,
bss->addr, 1) < 0) bss->addr, 1, NULL, NULL) < 0)
return -1; return -1;
if (bridge_ifname && if (bridge_ifname &&
linux_br_add_if(drv->global->ioctl_sock, linux_br_add_if(drv->global->ioctl_sock,
@ -8796,7 +8801,7 @@ static int wpa_driver_nl80211_if_add(void *priv, enum wpa_driver_if_type type,
os_memcpy(if_addr, addr, ETH_ALEN); os_memcpy(if_addr, addr, ETH_ALEN);
ifidx = nl80211_create_iface(drv, ifname, ifidx = nl80211_create_iface(drv, ifname,
wpa_driver_nl80211_if_type(type), addr, wpa_driver_nl80211_if_type(type), addr,
0); 0, NULL, NULL);
if (ifidx < 0) { if (ifidx < 0) {
#ifdef HOSTAPD #ifdef HOSTAPD
os_free(new_bss); os_free(new_bss);