Use common driver code for Linux hwaddr get/set
[libeap.git] / src / drivers / driver_hostap.c
index 86306ee..64b345f 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "priv_netlink.h"
 #include "netlink.h"
+#include "linux_ioctl.h"
 #include "common/ieee802_11_defs.h"
 
 
@@ -83,7 +84,7 @@ static void handle_data(struct hostap_driver_data *drv, u8 *buf, size_t len,
 
        sa = hdr->addr2;
        os_memset(&event, 0, sizeof(event));
-       event.rx_from_unknown.hdr = hdr;
+       event.rx_from_unknown.frame = buf;
        event.rx_from_unknown.len = len;
        wpa_supplicant_event(drv->hapd, EVENT_RX_FROM_UNKNOWN, &event);
 
@@ -112,7 +113,7 @@ static void handle_data(struct hostap_driver_data *drv, u8 *buf, size_t len,
        left -= 2;
        switch (ethertype) {
        case ETH_P_PAE:
-               hostapd_eapol_receive(drv->hapd, sa, pos, left);
+               drv_event_eapol_rx(drv->hapd, sa, pos, left);
                break;
 
        default:
@@ -268,21 +269,7 @@ static int hostap_init_sockets(struct hostap_driver_data *drv, u8 *own_addr)
                return -1;
        }
 
-        memset(&ifr, 0, sizeof(ifr));
-        os_strlcpy(ifr.ifr_name, drv->iface, sizeof(ifr.ifr_name));
-        if (ioctl(drv->sock, SIOCGIFHWADDR, &ifr) != 0) {
-               perror("ioctl(SIOCGIFHWADDR)");
-               return -1;
-        }
-
-       if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {
-               printf("Invalid HW-addr family 0x%04x\n",
-                      ifr.ifr_hwaddr.sa_family);
-               return -1;
-       }
-       os_memcpy(own_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
-
-       return 0;
+       return linux_get_ifhwaddr(drv->sock, drv->iface, own_addr);
 }
 
 
@@ -371,31 +358,15 @@ static int hostap_set_iface_flags(void *priv, int dev_up)
 {
        struct hostap_driver_data *drv = priv;
        struct ifreq ifr;
+       char ifname[IFNAMSIZ];
 
-       if (drv->ioctl_sock < 0)
-               return -1;
-
-       memset(&ifr, 0, sizeof(ifr));
-       snprintf(ifr.ifr_name, IFNAMSIZ, "%sap", drv->iface);
-
-       if (ioctl(drv->ioctl_sock, SIOCGIFFLAGS, &ifr) != 0) {
-               perror("ioctl[SIOCGIFFLAGS]");
+       os_snprintf(ifname, IFNAMSIZ, "%sap", drv->iface);
+       if (linux_set_iface_flags(drv->ioctl_sock, ifname, dev_up) < 0)
                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;
-       }
 
        if (dev_up) {
                memset(&ifr, 0, sizeof(ifr));
-               snprintf(ifr.ifr_name, IFNAMSIZ, "%sap", drv->iface);
+               os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
                ifr.ifr_mtu = HOSTAPD_MTU;
                if (ioctl(drv->ioctl_sock, SIOCSIFMTU, &ifr) != 0) {
                        perror("ioctl[SIOCSIFMTU]");
@@ -429,8 +400,9 @@ static int hostapd_ioctl(void *priv, struct prism2_hostapd_param *param,
 
 
 static int wpa_driver_hostap_set_key(const char *ifname, void *priv,
-                                    wpa_alg alg, const u8 *addr, int key_idx,
-                                    int set_tx, const u8 *seq, size_t seq_len,
+                                    enum wpa_alg alg, const u8 *addr,
+                                    int key_idx, int set_tx,
+                                    const u8 *seq, size_t seq_len,
                                     const u8 *key, size_t key_len)
 {
        struct hostap_driver_data *drv = priv;
@@ -792,30 +764,28 @@ static int hostap_set_generic_elem(const char *ifname, void *priv,
 }
 
 
-static int hostap_set_wps_beacon_ie(const char *ifname, void *priv,
-                                   const u8 *ie, size_t len)
-{
-       /* Host AP driver supports only one set of extra IEs, so we need to
-        * use the ProbeResp IEs also for Beacon frames since they include more
-        * information. */
-       return 0;
-}
-
-
-static int hostap_set_wps_probe_resp_ie(const char *ifname, void *priv,
-                                       const u8 *ie, size_t len)
+static int hostap_set_ap_wps_ie(const char *ifname, void *priv,
+                               const struct wpabuf *beacon,
+                               const struct wpabuf *proberesp)
 {
        struct hostap_driver_data *drv = priv;
 
+       /*
+        * Host AP driver supports only one set of extra IEs, so we need to
+        * use the Probe Response IEs also for Beacon frames since they include
+        * more information.
+        */
+
        os_free(drv->wps_ie);
        drv->wps_ie = NULL;
        drv->wps_ie_len = 0;
-       if (ie) {
-               drv->wps_ie = os_malloc(len);
+       if (proberesp) {
+               drv->wps_ie = os_malloc(wpabuf_len(proberesp));
                if (drv->wps_ie == NULL)
                        return -1;
-               os_memcpy(drv->wps_ie, ie, len);
-               drv->wps_ie_len = len;
+               os_memcpy(drv->wps_ie, wpabuf_head(proberesp),
+                         wpabuf_len(proberesp));
+               drv->wps_ie_len = wpabuf_len(proberesp);
        }
 
        return hostapd_ioctl_set_generic_elem(drv);
@@ -1277,8 +1247,9 @@ static void show_set_key_error(struct prism2_hostapd_param *param)
 
 
 static int wpa_driver_hostap_set_key(const char *ifname, void *priv,
-                                    wpa_alg alg, const u8 *addr, int key_idx,
-                                    int set_tx, const u8 *seq, size_t seq_len,
+                                    enum wpa_alg alg, const u8 *addr,
+                                    int key_idx, int set_tx,
+                                    const u8 *seq, size_t seq_len,
                                     const u8 *key, size_t key_len)
 {
        struct wpa_driver_hostap_data *drv = priv;
@@ -1533,11 +1504,11 @@ static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg)
        struct wpa_driver_hostap_data *drv = priv;
        int algs = 0;
 
-       if (auth_alg & AUTH_ALG_OPEN_SYSTEM)
+       if (auth_alg & WPA_AUTH_ALG_OPEN)
                algs |= 1;
-       if (auth_alg & AUTH_ALG_SHARED_KEY)
+       if (auth_alg & WPA_AUTH_ALG_SHARED)
                algs |= 2;
-       if (auth_alg & AUTH_ALG_LEAP)
+       if (auth_alg & WPA_AUTH_ALG_LEAP)
                algs |= 4;
        if (algs == 0)
                algs = 1; /* at least one algorithm should be set */
@@ -1650,8 +1621,7 @@ const struct wpa_driver_ops wpa_driver_hostap_ops = {
        .get_inact_sec = hostap_get_inact_sec,
        .sta_clear_stats = hostap_sta_clear_stats,
        .get_hw_feature_data = hostap_get_hw_feature_data,
-       .set_wps_beacon_ie = hostap_set_wps_beacon_ie,
-       .set_wps_probe_resp_ie = hostap_set_wps_probe_resp_ie,
+       .set_ap_wps_ie = hostap_set_ap_wps_ie,
 #else /* HOSTAPD */
        .get_bssid = wpa_driver_hostap_get_bssid,
        .get_ssid = wpa_driver_hostap_get_ssid,