]> git.ipfire.org Git - thirdparty/hostap.git/blobdiff - src/drivers/driver_bsd.c
driver_bsd.c: Reduce code duplication (ifflag)
[thirdparty/hostap.git] / src / drivers / driver_bsd.c
index 5479bfd2bda929bfe41d61a0b50db09f054d5332..2cb5876af018d7afa774f0cf5495d7c7ca5d7dcd 100644 (file)
@@ -212,6 +212,46 @@ bsd_del_key(int s, const char *ifname, const u8 *addr, int key_idx)
                               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
 
@@ -354,37 +394,10 @@ bsd_configure_wpa(struct bsd_driver_data *drv, struct wpa_bss_params *params)
        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
@@ -415,7 +428,7 @@ bsd_set_ieee8021x(void *priv, struct wpa_bss_params *params)
                        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
@@ -432,18 +445,10 @@ 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
@@ -592,15 +597,9 @@ 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
@@ -608,15 +607,9 @@ bsd_sta_disassoc(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_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
@@ -860,7 +853,9 @@ bsd_init(struct hostapd_data *hapd, struct wpa_init_params *params)
        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;
 
@@ -889,7 +884,7 @@ bsd_deinit(void *priv)
        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)
@@ -965,36 +960,6 @@ get80211param(struct wpa_driver_bsd_data *drv, int op)
        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)
 {
@@ -1182,28 +1147,18 @@ static int
 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
@@ -1276,16 +1231,21 @@ wpa_driver_bsd_associate(void *priv, struct wpa_driver_associate_params *params)
        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 */
@@ -1563,14 +1523,12 @@ static void
 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)