Use common driver code for Linux hwaddr get/set
[libeap.git] / src / drivers / driver_hostap.c
index e976c57..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)
+       os_snprintf(ifname, IFNAMSIZ, "%sap", drv->iface);
+       if (linux_set_iface_flags(drv->ioctl_sock, ifname, dev_up) < 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]");
-               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]");
@@ -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 */