Merge driver ops set_wps_beacon_ie and set_wps_probe_resp_ie
[libeap.git] / src / drivers / driver_atheros.c
index 8759b01..c3e09c4 100644 (file)
@@ -63,6 +63,7 @@
 #include "priv_netlink.h"
 #include "l2_packet/l2_packet.h"
 #include "common/ieee802_11_defs.h"
+#include "netlink.h"
 
 
 struct madwifi_driver_data {
@@ -73,7 +74,7 @@ struct madwifi_driver_data {
        struct l2_packet_data *sock_xmit;       /* raw packet xmit socket */
        struct l2_packet_data *sock_recv;       /* raw packet recv socket */
        int     ioctl_sock;                     /* socket for ioctl() use */
-       int     wext_sock;                      /* socket for wireless events */
+       struct netlink_data *netlink;
        int     we_version;
        u8      acct_mac[ETH_ALEN];
        struct hostap_sta_driver_data acct_data;
@@ -714,22 +715,21 @@ madwifi_set_wps_ie(void *priv, const u8 *ie, size_t len, u32 frametype)
 }
 
 static int
-madwifi_set_wps_beacon_ie(const char *ifname, void *priv, const u8 *ie,
-                         size_t len)
+madwifi_set_ap_wps_ie(const char *ifname, void *priv,
+                     const struct wpabuf *beacon,
+                     const struct wpabuf *proberesp)
 {
-       return madwifi_set_wps_ie(priv, ie, len, IEEE80211_APPIE_FRAME_BEACON);
-}
-
-static int
-madwifi_set_wps_probe_resp_ie(const char *ifname, void *priv, const u8 *ie,
-                             size_t len)
-{
-       return madwifi_set_wps_ie(priv, ie, len,
+       if (madwifi_set_wps_ie(priv, beacon ? wpabuf_head(beacon) : NULL,
+                              beacon ? wpabuf_len(beacon) : 0,
+                              IEEE80211_APPIE_FRAME_BEACON))
+               return -1;
+       return madwifi_set_wps_ie(priv,
+                                 proberesp ? wpabuf_head(proberesp) : NULL,
+                                 proberesp ? wpabuf_len(proberesp): 0,
                                  IEEE80211_APPIE_FRAME_PROBE_RESP);
 }
 #else /* CONFIG_WPS */
-#define madwifi_set_wps_beacon_ie NULL
-#define madwifi_set_wps_probe_resp_ie NULL
+#define madwifi_set_ap_wps_ie NULL
 #endif /* CONFIG_WPS */
 
 static int
@@ -847,7 +847,7 @@ madwifi_wireless_event_wireless_custom(struct madwifi_driver_data *drv,
                /* PROBLEM! this event is received for ALL BSSs ...
                 * so all are enabled for WPS... ugh.
                 */
-               hostapd_button_pushed(drv->hapd);
+               wpa_supplicant_event(drv->hapd, EVENT_WPS_BUTTON_PUSHED, NULL);
        } else if (strncmp(custom, "Manage.prob_req ", 16) == 0) {
                /*
                 * Atheros driver uses a hack to pass Probe Request frames as a
@@ -935,28 +935,18 @@ madwifi_wireless_event_wireless(struct madwifi_driver_data *drv,
 
 
 static void
-madwifi_wireless_event_rtm_newlink(struct madwifi_driver_data *drv,
-                                              struct nlmsghdr *h, int len)
+madwifi_wireless_event_rtm_newlink(void *ctx,
+                                  struct ifinfomsg *ifi, u8 *buf, size_t len)
 {
-       struct ifinfomsg *ifi;
-       int attrlen, nlmsg_len, rta_len;
-       struct rtattr * attr;
-
-       if (len < (int) sizeof(*ifi))
-               return;
-
-       ifi = NLMSG_DATA(h);
+       struct madwifi_driver_data *drv = ctx;
+       int attrlen, rta_len;
+       struct rtattr *attr;
 
        if (ifi->ifi_index != drv->ifindex)
                return;
 
-       nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg));
-
-       attrlen = h->nlmsg_len - nlmsg_len;
-       if (attrlen < 0)
-               return;
-
-       attr = (struct rtattr *) (((char *) ifi) + nlmsg_len);
+       attrlen = len;
+       attr = (struct rtattr *) buf;
 
        rta_len = RTA_ALIGN(sizeof(struct rtattr));
        while (RTA_OK(attr, attrlen)) {
@@ -970,55 +960,6 @@ madwifi_wireless_event_rtm_newlink(struct madwifi_driver_data *drv,
 }
 
 
-static void
-madwifi_wireless_event_receive(int sock, void *eloop_ctx, void *sock_ctx)
-{
-       char buf[256];
-       int left;
-       struct sockaddr_nl from;
-       socklen_t fromlen;
-       struct nlmsghdr *h;
-       struct madwifi_driver_data *drv = eloop_ctx;
-
-       fromlen = sizeof(from);
-       left = recvfrom(sock, buf, sizeof(buf), MSG_DONTWAIT,
-                       (struct sockaddr *) &from, &fromlen);
-       if (left < 0) {
-               if (errno != EINTR && errno != EAGAIN)
-                       perror("recvfrom(netlink)");
-               return;
-       }
-
-       h = (struct nlmsghdr *) buf;
-       while (left >= (int) sizeof(*h)) {
-               int len, plen;
-
-               len = h->nlmsg_len;
-               plen = len - sizeof(*h);
-               if (len > left || plen < 0) {
-                       printf("Malformed netlink message: "
-                              "len=%d left=%d plen=%d\n",
-                              len, left, plen);
-                       break;
-               }
-
-               switch (h->nlmsg_type) {
-               case RTM_NEWLINK:
-                       madwifi_wireless_event_rtm_newlink(drv, h, plen);
-                       break;
-               }
-
-               len = NLMSG_ALIGN(len);
-               left -= len;
-               h = (struct nlmsghdr *) ((char *) h + len);
-       }
-
-       if (left > 0) {
-               printf("%d extra bytes in the end of netlink message\n", left);
-       }
-}
-
-
 static int
 madwifi_get_we_version(struct madwifi_driver_data *drv)
 {
@@ -1068,45 +1009,25 @@ madwifi_get_we_version(struct madwifi_driver_data *drv)
 static int
 madwifi_wireless_event_init(struct madwifi_driver_data *drv)
 {
-       int s;
-       struct sockaddr_nl local;
+       struct netlink_config *cfg;
 
        madwifi_get_we_version(drv);
 
-       drv->wext_sock = -1;
-
-       s = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
-       if (s < 0) {
-               perror("socket(PF_NETLINK,SOCK_RAW,NETLINK_ROUTE)");
+       cfg = os_zalloc(sizeof(*cfg));
+       if (cfg == NULL)
                return -1;
-       }
-
-       memset(&local, 0, sizeof(local));
-       local.nl_family = AF_NETLINK;
-       local.nl_groups = RTMGRP_LINK;
-       if (bind(s, (struct sockaddr *) &local, sizeof(local)) < 0) {
-               perror("bind(netlink)");
-               close(s);
+       cfg->ctx = drv;
+       cfg->newlink_cb = madwifi_wireless_event_rtm_newlink;
+       drv->netlink = netlink_init(cfg);
+       if (drv->netlink == NULL) {
+               os_free(cfg);
                return -1;
        }
 
-       eloop_register_read_sock(s, madwifi_wireless_event_receive, drv, NULL);
-       drv->wext_sock = s;
-
        return 0;
 }
 
 
-static void
-madwifi_wireless_event_deinit(struct madwifi_driver_data *drv)
-{
-       if (drv->wext_sock < 0)
-               return;
-       eloop_unregister_read_sock(drv->wext_sock);
-       close(drv->wext_sock);
-}
-
-
 static int
 madwifi_send_eapol(void *priv, const u8 *addr, const u8 *data, size_t data_len,
                   int encrypt, const u8 *own_addr)
@@ -1239,7 +1160,7 @@ madwifi_deinit(void *priv)
 {
        struct madwifi_driver_data *drv = priv;
 
-       madwifi_wireless_event_deinit(drv);
+       netlink_deinit(drv->netlink);
        (void) madwifi_set_iface_flags(drv, 0);
        if (drv->ioctl_sock >= 0)
                close(drv->ioctl_sock);
@@ -1327,6 +1248,5 @@ const struct wpa_driver_ops wpa_driver_atheros_ops = {
        .set_countermeasures    = madwifi_set_countermeasures,
        .sta_clear_stats        = madwifi_sta_clear_stats,
        .commit                 = madwifi_commit,
-       .set_wps_beacon_ie      = madwifi_set_wps_beacon_ie,
-       .set_wps_probe_resp_ie  = madwifi_set_wps_probe_resp_ie,
+       .set_ap_wps_ie          = madwifi_set_ap_wps_ie,
 };