sizeof(wk));
}
+static int
+bsd_send_mlme_param(int s, const char *ifname, const u8 op, const u16 reason,
+ const u8 *addr)
+{
+ struct ieee80211req_mlme mlme;
+
+ os_memset(&mlme, 0, sizeof(mlme));
+ mlme.im_op = op;
+ mlme.im_reason = reason;
+ os_memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);
+ return bsd_set80211var(s, ifname, IEEE80211_IOC_MLME, &mlme,
+ sizeof(mlme));
+}
+
+static int
+bsd_ctrl_iface(int s, const char *ifname, int enable)
+{
+ struct ifreq ifr;
+
+ os_memset(&ifr, 0, sizeof(ifr));
+ os_strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+
+ if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) {
+ perror("ioctl[SIOCGIFFLAGS]");
+ return -1;
+ }
+
+ if (enable)
+ ifr.ifr_flags |= IFF_UP;
+ else
+ ifr.ifr_flags &= ~IFF_UP;
+
+ if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0) {
+ perror("ioctl[SIOCSIFFLAGS]");
+ return -1;
+ }
+
+ return 0;
+}
+
#ifdef HOSTAPD
return 0;
}
-
static int
-bsd_set_iface_flags(void *priv, int dev_up)
+hostapd_bsd_ctrl_iface(struct bsd_driver_data *drv, int enable)
{
- struct bsd_driver_data *drv = priv;
- struct ifreq ifr;
-
- wpa_printf(MSG_DEBUG, "%s: dev_up=%d", __func__, dev_up);
-
- if (drv->ioctl_sock < 0)
- return -1;
-
- memset(&ifr, 0, sizeof(ifr));
- os_strlcpy(ifr.ifr_name, drv->iface, sizeof(ifr.ifr_name));
-
- if (ioctl(drv->ioctl_sock, SIOCGIFFLAGS, &ifr) != 0) {
- perror("ioctl[SIOCGIFFLAGS]");
- return -1;
- }
-
- if (dev_up)
- ifr.ifr_flags |= IFF_UP;
- else
- ifr.ifr_flags &= ~IFF_UP;
-
- if (ioctl(drv->ioctl_sock, SIOCSIFFLAGS, &ifr) != 0) {
- perror("ioctl[SIOCSIFFLAGS]");
- return -1;
- }
-
- return 0;
+ return bsd_ctrl_iface(drv->ioctl_sock, drv->iface, enable);
}
static int
HOSTAPD_LEVEL_WARNING, "Error enabling WPA/802.1X!");
return -1;
}
- return bsd_set_iface_flags(priv, 1);
+ return hostapd_bsd_ctrl_iface(drv, 1);
}
static int
bsd_set_sta_authorized(void *priv, const u8 *addr, int authorized)
{
struct bsd_driver_data *drv = priv;
- struct ieee80211req_mlme mlme;
-
- wpa_printf(MSG_DEBUG, "%s: addr=%s authorized=%d",
- __func__, ether_sprintf(addr), authorized);
- if (authorized)
- mlme.im_op = IEEE80211_MLME_AUTHORIZE;
- else
- mlme.im_op = IEEE80211_MLME_UNAUTHORIZE;
- mlme.im_reason = 0;
- memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);
- return set80211var(drv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme));
+ return bsd_send_mlme_param(drv->ioctl_sock, drv->iface, authorized ?
+ IEEE80211_MLME_AUTHORIZE :
+ IEEE80211_MLME_UNAUTHORIZE, 0, addr);
}
static int
bsd_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr, int reason_code)
{
struct bsd_driver_data *drv = priv;
- struct ieee80211req_mlme mlme;
- wpa_printf(MSG_DEBUG, "%s: addr=%s reason_code=%d",
- __func__, ether_sprintf(addr), reason_code);
-
- mlme.im_op = IEEE80211_MLME_DEAUTH;
- mlme.im_reason = reason_code;
- memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);
- return set80211var(drv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme));
+ return bsd_send_mlme_param(drv->ioctl_sock, drv->iface,
+ IEEE80211_MLME_DEAUTH, reason_code, addr);
}
static int
int reason_code)
{
struct bsd_driver_data *drv = priv;
- struct ieee80211req_mlme mlme;
-
- wpa_printf(MSG_DEBUG, "%s: addr=%s reason_code=%d",
- __func__, ether_sprintf(addr), reason_code);
- mlme.im_op = IEEE80211_MLME_DISASSOC;
- mlme.im_reason = reason_code;
- memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);
- return set80211var(drv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme));
+ return bsd_send_mlme_param(drv->ioctl_sock, drv->iface,
+ IEEE80211_MLME_DISASSOC, reason_code, addr);
}
static void
if (l2_packet_get_own_addr(drv->sock_xmit, params->own_addr))
goto bad;
- bsd_set_iface_flags(drv, 0); /* mark down during setup */
+ /* mark down during setup */
+ if (hostapd_bsd_ctrl_iface(drv, 0) < 0)
+ goto bad;
if (bsd_wireless_event_init(drv))
goto bad;
struct bsd_driver_data *drv = priv;
bsd_wireless_event_deinit(drv);
- (void) bsd_set_iface_flags(drv, 0);
+ hostapd_bsd_ctrl_iface(drv, 0);
if (drv->ioctl_sock >= 0)
close(drv->ioctl_sock);
if (drv->sock_xmit != NULL)
return ireq.i_val;
}
-static int
-getifflags(struct wpa_driver_bsd_data *drv, int *flags)
-{
- struct ifreq ifr;
-
- os_memset(&ifr, 0, sizeof(ifr));
- os_strlcpy(ifr.ifr_name, drv->ifname, sizeof(ifr.ifr_name));
- if (ioctl(drv->sock, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
- perror("SIOCGIFFLAGS");
- return errno;
- }
- *flags = ifr.ifr_flags & 0xffff;
- return 0;
-}
-
-static int
-setifflags(struct wpa_driver_bsd_data *drv, int flags)
-{
- struct ifreq ifr;
-
- os_memset(&ifr, 0, sizeof(ifr));
- os_strlcpy(ifr.ifr_name, drv->ifname, sizeof(ifr.ifr_name));
- ifr.ifr_flags = flags & 0xffff;
- if (ioctl(drv->sock, SIOCSIFFLAGS, (caddr_t)&ifr) < 0) {
- perror("SIOCSIFFLAGS");
- return errno;
- }
- return 0;
-}
-
static int
wpa_driver_bsd_get_bssid(void *priv, u8 *bssid)
{
wpa_driver_bsd_deauthenticate(void *priv, const u8 *addr, int reason_code)
{
struct wpa_driver_bsd_data *drv = priv;
- struct ieee80211req_mlme mlme;
- wpa_printf(MSG_DEBUG, "%s", __func__);
- os_memset(&mlme, 0, sizeof(mlme));
- mlme.im_op = IEEE80211_MLME_DEAUTH;
- mlme.im_reason = reason_code;
- os_memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);
- return set80211var(drv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme));
+ return bsd_send_mlme_param(drv->sock, drv->ifname,
+ IEEE80211_MLME_DEAUTH, reason_code, addr);
}
static int
wpa_driver_bsd_disassociate(void *priv, const u8 *addr, int reason_code)
{
struct wpa_driver_bsd_data *drv = priv;
- struct ieee80211req_mlme mlme;
- wpa_printf(MSG_DEBUG, "%s", __func__);
- os_memset(&mlme, 0, sizeof(mlme));
- mlme.im_op = IEEE80211_MLME_DISASSOC;
- mlme.im_reason = reason_code;
- os_memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);
- return set80211var(drv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme));
+ return bsd_send_mlme_param(drv->sock, drv->ifname,
+ IEEE80211_MLME_DISASSOC, reason_code, addr);
}
static int
return ret;
}
+static int
+wpa_driver_bsd_ctrl_iface(struct wpa_driver_bsd_data *drv, int enable)
+{
+ return bsd_ctrl_iface(drv->sock, drv->ifname, enable);
+}
+
static int
wpa_driver_bsd_scan(void *priv, struct wpa_driver_scan_params *params)
{
struct wpa_driver_bsd_data *drv = priv;
- int flags;
const u8 *ssid = params->ssids[0].ssid;
size_t ssid_len = params->ssids[0].ssid_len;
/* NB: interface must be marked UP to do a scan */
- if (getifflags(drv, &flags) != 0 || setifflags(drv, flags | IFF_UP) != 0)
+ if (wpa_driver_bsd_ctrl_iface(drv, 1) < 0)
return -1;
/* set desired ssid before scan */
wpa_driver_bsd_deinit(void *priv)
{
struct wpa_driver_bsd_data *drv = priv;
- int flags;
wpa_driver_bsd_set_wpa(drv, 0);
eloop_unregister_read_sock(drv->route);
/* NB: mark interface down */
- if (getifflags(drv, &flags) == 0)
- (void) setifflags(drv, flags &~ IFF_UP);
+ wpa_driver_bsd_ctrl_iface(drv, 0);
wpa_driver_bsd_set_wpa_internal(drv, drv->prev_wpa, drv->prev_privacy);
if (set80211param(drv, IEEE80211_IOC_ROAMING, drv->prev_roaming) < 0)