Lines Matching +full:drv +full:- +full:1
2 * WPA Supplicant - driver interaction with BSD net80211 layer
65 char ifname[IFNAMSIZ+1]; /* interface name */
83 struct bsd_driver_data *drv; in bsd_get_drvindex() local
85 dl_list_for_each(drv, &global->ifaces, struct bsd_driver_data, list) { in bsd_get_drvindex()
86 if (drv->ifindex == ifindex) in bsd_get_drvindex()
87 return drv; in bsd_get_drvindex()
96 struct bsd_driver_data *drv; in bsd_get_drvname() local
98 dl_list_for_each(drv, &global->ifaces, struct bsd_driver_data, list) { in bsd_get_drvname()
99 if (os_strcmp(drv->ifname, ifname) == 0) in bsd_get_drvname()
100 return drv; in bsd_get_drvname()
108 struct bsd_driver_data *drv = priv; in bsd_set80211() local
111 if (drv->ifindex == 0 || drv->if_removed) in bsd_set80211()
112 return -1; in bsd_set80211()
115 os_strlcpy(ireq.i_name, drv->ifname, sizeof(ireq.i_name)); in bsd_set80211()
121 if (ioctl(drv->global->sock, SIOCS80211, &ireq) < 0) { in bsd_set80211()
125 return -1; in bsd_set80211()
134 struct bsd_driver_data *drv = priv; in bsd_get80211() local
137 os_strlcpy(ireq->i_name, drv->ifname, sizeof(ireq->i_name)); in bsd_get80211()
138 ireq->i_type = op; in bsd_get80211()
139 ireq->i_len = arg_len; in bsd_get80211()
140 ireq->i_data = arg; in bsd_get80211()
142 if (ioctl(drv->global->sock, SIOCG80211, ireq) < 0) { in bsd_get80211()
143 int level = drv->if_removed ? MSG_DEBUG : MSG_ERROR; in bsd_get80211()
147 return -1; in bsd_get80211()
153 get80211var(struct bsd_driver_data *drv, int op, void *arg, int arg_len) in get80211var() argument
157 if (bsd_get80211(drv, &ireq, op, arg, arg_len) < 0) in get80211var()
158 return -1; in get80211var()
163 set80211var(struct bsd_driver_data *drv, int op, const void *arg, int arg_len) in set80211var() argument
165 return bsd_set80211(drv, op, 0, arg, arg_len); in set80211var()
169 set80211param(struct bsd_driver_data *drv, int op, int arg) in set80211param() argument
171 return bsd_set80211(drv, op, arg, NULL, 0); in set80211param()
177 struct bsd_driver_data *drv = priv; in bsd_get_ssid() local
183 os_strlcpy(ifr.ifr_name, drv->ifname, sizeof(ifr.ifr_name)); in bsd_get_ssid()
185 if (ioctl(drv->global->sock, SIOCG80211NWID, &ifr) < 0 || in bsd_get_ssid()
187 return -1; in bsd_get_ssid()
191 return get80211var(drv, IEEE80211_IOC_SSID, ssid, IEEE80211_NWID_LEN); in bsd_get_ssid()
198 struct bsd_driver_data *drv = priv; in bsd_set_ssid() local
206 os_strlcpy(ifr.ifr_name, drv->ifname, sizeof(ifr.ifr_name)); in bsd_set_ssid()
208 return ioctl(drv->global->sock, SIOCS80211NWID, &ifr); in bsd_set_ssid()
210 return set80211var(drv, IEEE80211_IOC_SSID, ssid, ssid_len); in bsd_set_ssid()
217 struct bsd_driver_data *drv = priv; in bsd_get_if_media() local
221 os_strlcpy(ifmr.ifm_name, drv->ifname, sizeof(ifmr.ifm_name)); in bsd_get_if_media()
223 if (ioctl(drv->global->sock, SIOCGIFMEDIA, &ifmr) < 0) { in bsd_get_if_media()
226 return -1; in bsd_get_if_media()
235 struct bsd_driver_data *drv = priv; in bsd_set_if_media() local
239 os_strlcpy(ifr.ifr_name, drv->ifname, sizeof(ifr.ifr_name)); in bsd_set_if_media()
242 if (ioctl(drv->global->sock, SIOCSIFMEDIA, &ifr) < 0) { in bsd_set_if_media()
245 return -1; in bsd_set_if_media()
257 return -1; in bsd_set_mediaopt()
261 return -1; in bsd_set_mediaopt()
299 struct bsd_driver_data *drv = priv; in bsd_ctrl_iface() local
303 os_strlcpy(ifr.ifr_name, drv->ifname, sizeof(ifr.ifr_name)); in bsd_ctrl_iface()
305 if (ioctl(drv->global->sock, SIOCGIFFLAGS, &ifr) < 0) { in bsd_ctrl_iface()
308 return -1; in bsd_ctrl_iface()
310 drv->flags = ifr.ifr_flags; in bsd_ctrl_iface()
323 if (ioctl(drv->global->sock, SIOCSIFFLAGS, &ifr) < 0) { in bsd_ctrl_iface()
326 return -1; in bsd_ctrl_iface()
330 __func__, drv->ifname, enable, ((ifr.ifr_flags & IFF_UP) != 0)); in bsd_ctrl_iface()
332 drv->flags = ifr.ifr_flags; in bsd_ctrl_iface()
337 __func__, drv->ifname, enable, ((ifr.ifr_flags & IFF_UP) != 0)); in bsd_ctrl_iface()
346 struct bsd_driver_data *drv = priv; in bsd_set_key() local
348 enum wpa_alg alg = params->alg; in bsd_set_key()
349 const u8 *addr = params->addr; in bsd_set_key()
350 int key_idx = params->key_idx; in bsd_set_key()
351 int set_tx = params->set_tx; in bsd_set_key()
352 const u8 *seq = params->seq; in bsd_set_key()
353 size_t seq_len = params->seq_len; in bsd_set_key()
354 const u8 *key = params->key; in bsd_set_key()
355 size_t key_len = params->key_len; in bsd_set_key()
395 return -1; in bsd_set_key()
427 if (drv->opmode == IEEE80211_M_IBSS || in bsd_set_key()
428 drv->opmode == IEEE80211_M_AHDEMO) in bsd_set_key()
442 keyrsc[WPA_KEY_RSC_LEN - i - 1] = seq[i]; in bsd_set_key()
457 { "WEP", "TKIP", "AES-OCB", "AES-CCM", "CKIP", "NONE", in bsd_configure_wpa()
458 "AES-CCM-256", "BIP-CMAC-128", "BIP-CMAC-256", "BIP-GMAC-128", in bsd_configure_wpa()
459 "BIP-GMAC-256", "AES-GCM-128", "AES-GCM-256" }; in bsd_configure_wpa()
462 switch (params->wpa_group) { in bsd_configure_wpa()
492 params->wpa_group); in bsd_configure_wpa()
493 return -1; in bsd_configure_wpa()
501 return -1; in bsd_configure_wpa()
505 v = (params->wpa_group == WPA_CIPHER_WEP104 ? 13 : 5); in bsd_configure_wpa()
509 return -1; in bsd_configure_wpa()
514 if (params->wpa_pairwise & WPA_CIPHER_BIP_CMAC_128) in bsd_configure_wpa()
515 v |= 1<<IEEE80211_CIPHER_BIP_CMAC_128; in bsd_configure_wpa()
516 if (params->wpa_pairwise & WPA_CIPHER_GCMP) in bsd_configure_wpa()
517 v |= 1<<IEEE80211_CIPHER_AES_GCM_128; in bsd_configure_wpa()
518 if (params->wpa_pairwise & WPA_CIPHER_GCMP_256) in bsd_configure_wpa()
519 v |= 1<<IEEE80211_CIPHER_AES_GCM_256; in bsd_configure_wpa()
520 if (params->wpa_pairwise & WPA_CIPHER_CCMP) in bsd_configure_wpa()
521 v |= 1<<IEEE80211_CIPHER_AES_CCM; in bsd_configure_wpa()
522 if (params->wpa_pairwise & WPA_CIPHER_CCMP_256) in bsd_configure_wpa()
523 v |= 1<<IEEE80211_CIPHER_AES_CCM_256; in bsd_configure_wpa()
524 if (params->wpa_pairwise & WPA_CIPHER_TKIP) in bsd_configure_wpa()
525 v |= 1<<IEEE80211_CIPHER_TKIP; in bsd_configure_wpa()
526 if (params->wpa_pairwise & WPA_CIPHER_NONE) in bsd_configure_wpa()
527 v |= 1<<IEEE80211_CIPHER_NONE; in bsd_configure_wpa()
532 return -1; in bsd_configure_wpa()
536 __func__, params->wpa_key_mgmt); in bsd_configure_wpa()
538 params->wpa_key_mgmt)) { in bsd_configure_wpa()
541 params->wpa_key_mgmt); in bsd_configure_wpa()
542 return -1; in bsd_configure_wpa()
546 if (params->rsn_preauth) in bsd_configure_wpa()
549 __func__, params->rsn_preauth); in bsd_configure_wpa()
553 return -1; in bsd_configure_wpa()
557 wpa_printf(MSG_DEBUG, "%s: enable WPA= 0x%x", __func__, params->wpa); in bsd_configure_wpa()
558 if (set80211param(priv, IEEE80211_IOC_WPA, params->wpa)) { in bsd_configure_wpa()
559 wpa_printf(MSG_INFO, "Unable to set WPA to %u", params->wpa); in bsd_configure_wpa()
560 return -1; in bsd_configure_wpa()
568 wpa_printf(MSG_DEBUG, "%s: enabled=%d", __func__, params->enabled); in bsd_set_ieee8021x()
570 if (!params->enabled) { in bsd_set_ieee8021x()
575 if (!params->wpa && !params->ieee802_1x) { in bsd_set_ieee8021x()
578 return -1; in bsd_set_ieee8021x()
580 if (params->wpa && bsd_configure_wpa(priv, params) != 0) { in bsd_set_ieee8021x()
583 return -1; in bsd_set_ieee8021x()
586 (params->wpa ? IEEE80211_AUTH_WPA : IEEE80211_AUTH_8021X))) { in bsd_set_ieee8021x()
589 return -1; in bsd_set_ieee8021x()
591 return bsd_ctrl_iface(priv, 1); in bsd_set_ieee8021x()
612 ielen = ie.wpa_ie[1]; in bsd_new_sta()
619 drv_event_assoc(ctx, addr, iebuf, ielen, NULL, 0, NULL, -1, 0); in bsd_new_sta()
626 struct bsd_driver_data *drv = priv; in bsd_send_eapol() local
630 return l2_packet_send(drv->sock_xmit, addr, ETH_P_EAPOL, data, in bsd_send_eapol()
637 struct bsd_driver_data *drv = priv; in bsd_set_freq() local
642 int channel = freq->channel; in bsd_set_freq()
646 freq->ht_enabled ? IFM_IEEE80211_11NG : in bsd_set_freq()
652 freq->vht_enabled ? IFM_IEEE80211_VHT5G : in bsd_set_freq()
653 freq->ht_enabled ? IFM_IEEE80211_11NA : in bsd_set_freq()
656 if (bsd_set_mediaopt(drv, IFM_MMASK, mode) < 0) { in bsd_set_freq()
659 return -1; in bsd_set_freq()
664 os_strlcpy(creq.i_name, drv->ifname, sizeof(creq.i_name)); in bsd_set_freq()
666 return ioctl(drv->global->sock, SIOCS80211CHANNEL, &creq); in bsd_set_freq()
691 struct bsd_driver_data *drv; in bsd_route_overflow() local
699 } while (n != -1 || errno == ENOBUFS); in bsd_route_overflow()
701 if (getifaddrs(&ifaddrs) == -1) { in bsd_route_overflow()
708 for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) { in bsd_route_overflow()
709 if (ifa->ifa_addr == NULL || in bsd_route_overflow()
710 ifa->ifa_addr->sa_family != AF_LINK) in bsd_route_overflow()
712 sdl = (struct sockaddr_dl *) (void *) ifa->ifa_addr; in bsd_route_overflow()
713 drv = bsd_get_drvname(global, ifa->ifa_name); in bsd_route_overflow()
714 if (drv != NULL && in bsd_route_overflow()
715 (drv->ifindex != sdl->sdl_index || drv->if_removed)) { in bsd_route_overflow()
718 drv->ifname); in bsd_route_overflow()
719 drv->ifindex = sdl->sdl_index; in bsd_route_overflow()
720 drv->if_removed = 0; in bsd_route_overflow()
722 os_strlcpy(event.interface_status.ifname, ifa->ifa_name, in bsd_route_overflow()
724 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, in bsd_route_overflow()
727 if (!drv && in bsd_route_overflow()
728 (drv = bsd_get_drvindex(global, sdl->sdl_index)) != NULL) { in bsd_route_overflow()
732 drv->ifname); in bsd_route_overflow()
733 drv->if_removed = 1; in bsd_route_overflow()
735 os_strlcpy(event.interface_status.ifname, drv->ifname, in bsd_route_overflow()
737 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, in bsd_route_overflow()
743 dl_list_for_each(drv, &global->ifaces, struct bsd_driver_data, list) { in bsd_route_overflow()
744 for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) { in bsd_route_overflow()
745 if (ifa->ifa_addr == NULL || in bsd_route_overflow()
746 ifa->ifa_addr->sa_family != AF_LINK) in bsd_route_overflow()
748 sdl = (struct sockaddr_dl *) (void *) ifa->ifa_addr; in bsd_route_overflow()
749 if (os_strcmp(drv->ifname, ifa->ifa_name) == 0) in bsd_route_overflow()
752 if (ifa == NULL && !drv->if_removed) { in bsd_route_overflow()
755 drv->ifname); in bsd_route_overflow()
756 drv->if_removed = 1; in bsd_route_overflow()
758 os_strlcpy(event.interface_status.ifname, drv->ifname, in bsd_route_overflow()
760 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, in bsd_route_overflow()
766 if ((ifa->ifa_flags & IFF_UP) == 0 && in bsd_route_overflow()
767 (drv->flags & IFF_UP) != 0) { in bsd_route_overflow()
769 drv->ifname); in bsd_route_overflow()
770 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_DISABLED, in bsd_route_overflow()
772 } else if ((ifa->ifa_flags & IFF_UP) != 0 && in bsd_route_overflow()
773 (drv->flags & IFF_UP) == 0) { in bsd_route_overflow()
775 drv->ifname); in bsd_route_overflow()
776 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_ENABLED, in bsd_route_overflow()
779 drv->flags = ifa->ifa_flags; in bsd_route_overflow()
791 struct bsd_driver_data *drv; in bsd_wireless_event_receive() local
814 if (rtm->rtm_version != RTM_VERSION) { in bsd_wireless_event_receive()
816 rtm->rtm_version); in bsd_wireless_event_receive()
820 switch (rtm->rtm_type) { in bsd_wireless_event_receive()
823 drv = bsd_get_drvindex(global, ifan->ifan_index); in bsd_wireless_event_receive()
824 if (drv == NULL) in bsd_wireless_event_receive()
826 switch (ifan->ifan_what) { in bsd_wireless_event_receive()
829 if (drv->is_ap) in bsd_wireless_event_receive()
831 wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL); in bsd_wireless_event_receive()
834 if (drv->is_ap) in bsd_wireless_event_receive()
836 wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL); in bsd_wireless_event_receive()
839 if (drv->is_ap) in bsd_wireless_event_receive()
841 wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, in bsd_wireless_event_receive()
845 leave = (struct ieee80211_leave_event *) &ifan[1]; in bsd_wireless_event_receive()
846 drv_event_disassoc(drv->ctx, leave->iev_addr); in bsd_wireless_event_receive()
852 join = (struct ieee80211_join_event *) &ifan[1]; in bsd_wireless_event_receive()
853 bsd_new_sta(drv, drv->ctx, join->iev_addr); in bsd_wireless_event_receive()
859 mic = (struct ieee80211_michael_event *) &ifan[1]; in bsd_wireless_event_receive()
862 "keyix=%u src_addr=" MACSTR, mic->iev_keyix, in bsd_wireless_event_receive()
863 MAC2STR(mic->iev_src)); in bsd_wireless_event_receive()
866 !IEEE80211_IS_MULTICAST(mic->iev_dst); in bsd_wireless_event_receive()
867 event.michael_mic_failure.src = mic->iev_src; in bsd_wireless_event_receive()
868 wpa_supplicant_event(drv->ctx, in bsd_wireless_event_receive()
875 switch (ifan->ifan_what) { in bsd_wireless_event_receive()
877 drv = bsd_get_drvindex(global, ifan->ifan_index); in bsd_wireless_event_receive()
878 if (drv) in bsd_wireless_event_receive()
879 drv->if_removed = 1; in bsd_wireless_event_receive()
883 drv = bsd_get_drvname(global, ifan->ifan_name); in bsd_wireless_event_receive()
884 if (drv) { in bsd_wireless_event_receive()
885 drv->ifindex = ifan->ifan_index; in bsd_wireless_event_receive()
886 drv->if_removed = 0; in bsd_wireless_event_receive()
895 ifan->ifan_name, in bsd_wireless_event_receive()
896 ifan->ifan_what == IFAN_DEPARTURE ? in bsd_wireless_event_receive()
898 os_strlcpy(event.interface_status.ifname, ifan->ifan_name, in bsd_wireless_event_receive()
900 if (drv) { in bsd_wireless_event_receive()
901 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, in bsd_wireless_event_receive()
907 if (ifan->ifan_what == IFAN_DEPARTURE) in bsd_wireless_event_receive()
908 drv->ifindex = 0; in bsd_wireless_event_receive()
910 wpa_supplicant_event_global(global->ctx, in bsd_wireless_event_receive()
917 drv = bsd_get_drvindex(global, ifm->ifm_index); in bsd_wireless_event_receive()
918 if (drv == NULL) in bsd_wireless_event_receive()
920 if (((ifm->ifm_flags & IFF_UP) == 0 || in bsd_wireless_event_receive()
921 (ifm->ifm_flags & IFF_RUNNING) == 0) && in bsd_wireless_event_receive()
922 (drv->flags & IFF_UP) != 0 && in bsd_wireless_event_receive()
923 (drv->flags & IFF_RUNNING) != 0) { in bsd_wireless_event_receive()
925 drv->ifname); in bsd_wireless_event_receive()
926 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_DISABLED, in bsd_wireless_event_receive()
928 } else if ((ifm->ifm_flags & IFF_UP) != 0 && in bsd_wireless_event_receive()
929 (ifm->ifm_flags & IFF_RUNNING) != 0 && in bsd_wireless_event_receive()
930 ((drv->flags & IFF_UP) == 0 || in bsd_wireless_event_receive()
931 (drv->flags & IFF_RUNNING) == 0)) { in bsd_wireless_event_receive()
933 drv->ifname); in bsd_wireless_event_receive()
934 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_ENABLED, in bsd_wireless_event_receive()
937 drv->flags = ifm->ifm_flags; in bsd_wireless_event_receive()
993 return -1; in bsd_get_seqnum()
1006 seq[i] = tmp[WPA_KEY_RSC_LEN - i - 1]; in bsd_get_seqnum()
1023 -1); in bsd_flush()
1036 /* XXX? do packets counts include non-data frames? */ in bsd_read_sta_driver_data()
1037 data->rx_packets = stats.is_stats.ns_rx_data; in bsd_read_sta_driver_data()
1038 data->rx_bytes = stats.is_stats.ns_rx_bytes; in bsd_read_sta_driver_data()
1039 data->tx_packets = stats.is_stats.ns_tx_data; in bsd_read_sta_driver_data()
1040 data->tx_bytes = stats.is_stats.ns_tx_bytes; in bsd_read_sta_driver_data()
1064 struct bsd_driver_data *drv = ctx; in handle_read() local
1065 drv_event_eapol_rx(drv->ctx, src_addr, buf, len); in handle_read()
1071 struct bsd_driver_data *drv; in bsd_init() local
1073 drv = os_zalloc(sizeof(struct bsd_driver_data)); in bsd_init()
1074 if (drv == NULL) { in bsd_init()
1079 drv->ifindex = if_nametoindex(params->ifname); in bsd_init()
1080 if (drv->ifindex == 0) { in bsd_init()
1082 __func__, params->ifname); in bsd_init()
1086 drv->ctx = hapd; in bsd_init()
1087 drv->is_ap = 1; in bsd_init()
1088 drv->global = params->global_priv; in bsd_init()
1089 os_strlcpy(drv->ifname, params->ifname, sizeof(drv->ifname)); in bsd_init()
1091 drv->sock_xmit = l2_packet_init(drv->ifname, NULL, ETH_P_EAPOL, in bsd_init()
1092 handle_read, drv, 0); in bsd_init()
1093 if (drv->sock_xmit == NULL) in bsd_init()
1095 if (l2_packet_get_own_addr(drv->sock_xmit, params->own_addr)) in bsd_init()
1099 if (bsd_ctrl_iface(drv, 0) < 0) in bsd_init()
1102 if (bsd_set_mediaopt(drv, IFM_OMASK, IFM_IEEE80211_HOSTAP) < 0) { in bsd_init()
1108 dl_list_add(&drv->global->ifaces, &drv->list); in bsd_init()
1110 return drv; in bsd_init()
1112 if (drv->sock_xmit != NULL) in bsd_init()
1113 l2_packet_deinit(drv->sock_xmit); in bsd_init()
1114 os_free(drv); in bsd_init()
1122 struct bsd_driver_data *drv = priv; in bsd_deinit() local
1124 if (drv->ifindex != 0) in bsd_deinit()
1125 bsd_ctrl_iface(drv, 0); in bsd_deinit()
1126 if (drv->sock_xmit != NULL) in bsd_deinit()
1127 l2_packet_deinit(drv->sock_xmit); in bsd_deinit()
1128 os_free(drv); in bsd_deinit()
1136 int authorized = -1; in bsd_set_sta_authorized()
1140 authorized = 1; in bsd_set_sta_authorized()
1154 get80211param(struct bsd_driver_data *drv, int op) in get80211param() argument
1158 if (bsd_get80211(drv, &ireq, op, NULL, 0) < 0) in get80211param()
1159 return -1; in get80211param()
1166 struct bsd_driver_data *drv = priv; in wpa_driver_bsd_get_bssid() local
1170 os_strlcpy(bs.i_name, drv->ifname, sizeof(bs.i_name)); in wpa_driver_bsd_get_bssid()
1171 if (ioctl(drv->global->sock, SIOCG80211BSSID, &bs) < 0) in wpa_driver_bsd_get_bssid()
1172 return -1; in wpa_driver_bsd_get_bssid()
1176 return get80211var(drv, IEEE80211_IOC_BSSID, in wpa_driver_bsd_get_bssid()
1177 bssid, IEEE80211_ADDR_LEN) < 0 ? -1 : 0; in wpa_driver_bsd_get_bssid()
1184 struct bsd_driver_data *drv = priv; in wpa_driver_bsd_get_ssid() local
1185 return bsd_get_ssid(drv, ssid, 0); in wpa_driver_bsd_get_ssid()
1189 wpa_driver_bsd_set_wpa_ie(struct bsd_driver_data *drv, const u8 *wpa_ie, in wpa_driver_bsd_set_wpa_ie() argument
1193 return bsd_set_opt_ie(drv, wpa_ie, wpa_ie_len); in wpa_driver_bsd_set_wpa_ie()
1195 return set80211var(drv, IEEE80211_IOC_OPTIE, wpa_ie, wpa_ie_len); in wpa_driver_bsd_set_wpa_ie()
1208 ret = -1; in wpa_driver_bsd_set_wpa_internal()
1210 ret = -1; in wpa_driver_bsd_set_wpa_internal()
1212 ret = -1; in wpa_driver_bsd_set_wpa_internal()
1266 struct bsd_driver_data *drv = ctx; in handle_read() local
1268 drv_event_eapol_rx(drv->ctx, src_addr, buf, len); in handle_read()
1272 wpa_driver_bsd_set_rsn_wpa_ie(struct bsd_driver_data * drv, in wpa_driver_bsd_set_rsn_wpa_ie() argument
1276 size_t ie_len = ie[1] ? ie[1] + 2 : 0; in wpa_driver_bsd_set_rsn_wpa_ie()
1279 if (wpa_driver_bsd_set_wpa_ie(drv, ie, ie_len) < 0) in wpa_driver_bsd_set_rsn_wpa_ie()
1280 return -1; in wpa_driver_bsd_set_rsn_wpa_ie()
1282 privacy = !(params->pairwise_suite == WPA_CIPHER_NONE && in wpa_driver_bsd_set_rsn_wpa_ie()
1283 params->group_suite == WPA_CIPHER_NONE && in wpa_driver_bsd_set_rsn_wpa_ie()
1284 params->key_mgmt_suite == WPA_KEY_MGMT_NONE); in wpa_driver_bsd_set_rsn_wpa_ie()
1288 if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0) in wpa_driver_bsd_set_rsn_wpa_ie()
1289 return -1; in wpa_driver_bsd_set_rsn_wpa_ie()
1292 set80211param(drv, IEEE80211_IOC_WPA, in wpa_driver_bsd_set_rsn_wpa_ie()
1293 ie[0] == WLAN_EID_RSN ? 2 : 1) < 0) in wpa_driver_bsd_set_rsn_wpa_ie()
1294 return -1; in wpa_driver_bsd_set_rsn_wpa_ie()
1302 struct bsd_driver_data *drv = priv; in wpa_driver_bsd_associate() local
1311 , (unsigned int) params->ssid_len, params->ssid in wpa_driver_bsd_associate()
1312 , (unsigned int) params->wpa_ie_len in wpa_driver_bsd_associate()
1313 , params->pairwise_suite in wpa_driver_bsd_associate()
1314 , params->group_suite in wpa_driver_bsd_associate()
1315 , params->key_mgmt_suite in wpa_driver_bsd_associate()
1318 switch (params->mode) { in wpa_driver_bsd_associate()
1333 return -1; in wpa_driver_bsd_associate()
1335 if (bsd_set_mediaopt(drv, IFM_OMASK, mode) < 0) { in wpa_driver_bsd_associate()
1338 return -1; in wpa_driver_bsd_associate()
1341 if (params->mode == IEEE80211_MODE_AP) { in wpa_driver_bsd_associate()
1342 drv->sock_xmit = l2_packet_init(drv->ifname, NULL, ETH_P_EAPOL, in wpa_driver_bsd_associate()
1343 handle_read, drv, 0); in wpa_driver_bsd_associate()
1344 if (drv->sock_xmit == NULL) in wpa_driver_bsd_associate()
1345 return -1; in wpa_driver_bsd_associate()
1346 drv->is_ap = 1; in wpa_driver_bsd_associate()
1350 if (wpa_driver_bsd_set_drop_unencrypted(drv, params->drop_unencrypted) in wpa_driver_bsd_associate()
1352 ret = -1; in wpa_driver_bsd_associate()
1353 if (wpa_driver_bsd_set_auth_alg(drv, params->auth_alg) < 0) in wpa_driver_bsd_associate()
1354 ret = -1; in wpa_driver_bsd_associate()
1356 if (params->wpa_ie_len) { in wpa_driver_bsd_associate()
1357 rsn_ie = get_ie(params->wpa_ie, params->wpa_ie_len, in wpa_driver_bsd_associate()
1360 if (wpa_driver_bsd_set_rsn_wpa_ie(drv, params, in wpa_driver_bsd_associate()
1362 return -1; in wpa_driver_bsd_associate()
1365 wpa_ie = get_vendor_ie(params->wpa_ie, in wpa_driver_bsd_associate()
1366 params->wpa_ie_len, WPA_IE_VENDOR_TYPE); in wpa_driver_bsd_associate()
1368 if (wpa_driver_bsd_set_rsn_wpa_ie(drv, params, in wpa_driver_bsd_associate()
1370 return -1; in wpa_driver_bsd_associate()
1379 if (bsd_ctrl_iface(drv, 1) < 0) in wpa_driver_bsd_associate()
1380 return -1; in wpa_driver_bsd_associate()
1384 if (params->ssid != NULL) in wpa_driver_bsd_associate()
1385 os_memcpy(mlme.im_ssid, params->ssid, params->ssid_len); in wpa_driver_bsd_associate()
1386 mlme.im_ssid_len = params->ssid_len; in wpa_driver_bsd_associate()
1387 if (params->bssid != NULL) in wpa_driver_bsd_associate()
1388 os_memcpy(mlme.im_macaddr, params->bssid, IEEE80211_ADDR_LEN); in wpa_driver_bsd_associate()
1389 if (set80211var(drv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme)) < 0) in wpa_driver_bsd_associate()
1390 return -1; in wpa_driver_bsd_associate()
1397 struct bsd_driver_data *drv = priv; in wpa_driver_bsd_scan() local
1403 if (bsd_set_mediaopt(drv, IFM_OMASK, 0 /* STA */) < 0) { in wpa_driver_bsd_scan()
1406 return -1; in wpa_driver_bsd_scan()
1409 if (set80211param(drv, IEEE80211_IOC_ROAMING, in wpa_driver_bsd_scan()
1412 "wpa_supplicant-based roaming: %s", __func__, in wpa_driver_bsd_scan()
1414 return -1; in wpa_driver_bsd_scan()
1417 if (wpa_driver_bsd_set_wpa(drv, 1) < 0) { in wpa_driver_bsd_scan()
1420 return -1; in wpa_driver_bsd_scan()
1424 if (bsd_ctrl_iface(drv, 1) < 0) in wpa_driver_bsd_scan()
1425 return -1; in wpa_driver_bsd_scan()
1432 if (params->num_ssids > 0) { in wpa_driver_bsd_scan()
1433 sr.sr_nssid = params->num_ssids; in wpa_driver_bsd_scan()
1444 sr.sr_ssid[i].len = params->ssids[i].ssid_len; in wpa_driver_bsd_scan()
1445 os_memcpy(sr.sr_ssid[i].ssid, params->ssids[i].ssid, in wpa_driver_bsd_scan()
1450 return set80211var(drv, IEEE80211_IOC_SCAN_REQ, &sr, sizeof(sr)); in wpa_driver_bsd_scan()
1453 if (bsd_set_ssid(drv, params->ssids[0].ssid, in wpa_driver_bsd_scan()
1454 params->ssids[0].ssid_len) < 0) in wpa_driver_bsd_scan()
1455 return -1; in wpa_driver_bsd_scan()
1458 return set80211param(drv, IEEE80211_IOC_SCAN_REQ, 0); in wpa_driver_bsd_scan()
1470 extra_len = 2 + sr->isr_ssid_len; in wpa_driver_bsd_add_scan_entry()
1471 extra_len += 2 + sr->isr_nrates; in wpa_driver_bsd_add_scan_entry()
1473 extra_len += sr->isr_ie_len; in wpa_driver_bsd_add_scan_entry()
1478 os_memcpy(result->bssid, sr->isr_bssid, ETH_ALEN); in wpa_driver_bsd_add_scan_entry()
1479 result->freq = sr->isr_freq; in wpa_driver_bsd_add_scan_entry()
1480 result->beacon_int = sr->isr_intval; in wpa_driver_bsd_add_scan_entry()
1481 result->caps = sr->isr_capinfo; in wpa_driver_bsd_add_scan_entry()
1482 result->qual = sr->isr_rssi; in wpa_driver_bsd_add_scan_entry()
1483 result->noise = sr->isr_noise; in wpa_driver_bsd_add_scan_entry()
1490 result->level = sr->isr_rssi / 2 + sr->isr_noise; in wpa_driver_bsd_add_scan_entry()
1492 result->level = sr->isr_rssi; in wpa_driver_bsd_add_scan_entry()
1495 pos = (u8 *)(result + 1); in wpa_driver_bsd_add_scan_entry()
1498 *pos++ = sr->isr_ssid_len; in wpa_driver_bsd_add_scan_entry()
1499 os_memcpy(pos, sr + 1, sr->isr_ssid_len); in wpa_driver_bsd_add_scan_entry()
1500 pos += sr->isr_ssid_len; in wpa_driver_bsd_add_scan_entry()
1507 *pos++ = sr->isr_nrates; in wpa_driver_bsd_add_scan_entry()
1508 os_memcpy(pos, sr->isr_rates, sr->isr_nrates); in wpa_driver_bsd_add_scan_entry()
1509 pos += sr->isr_nrates; in wpa_driver_bsd_add_scan_entry()
1512 *pos++ = 1; in wpa_driver_bsd_add_scan_entry()
1513 *pos++ = sr->isr_erp; in wpa_driver_bsd_add_scan_entry()
1516 os_memcpy(pos, (u8 *)(sr + 1) + sr->isr_ssid_len + sr->isr_meshid_len, in wpa_driver_bsd_add_scan_entry()
1517 sr->isr_ie_len); in wpa_driver_bsd_add_scan_entry()
1519 os_memcpy(pos, (u8 *)(sr + 1) + sr->isr_ssid_len, sr->isr_ie_len); in wpa_driver_bsd_add_scan_entry()
1521 pos += sr->isr_ie_len; in wpa_driver_bsd_add_scan_entry()
1523 result->ie_len = pos - (u8 *)(result + 1); in wpa_driver_bsd_add_scan_entry()
1525 tmp = os_realloc_array(res->res, res->num + 1, in wpa_driver_bsd_add_scan_entry()
1531 tmp[res->num++] = result; in wpa_driver_bsd_add_scan_entry()
1532 res->res = tmp; in wpa_driver_bsd_add_scan_entry()
1556 pos += sr->isr_len; in wpa_driver_bsd_get_scan_results2()
1557 rest -= sr->isr_len; in wpa_driver_bsd_get_scan_results2()
1561 len, (unsigned long)res->num); in wpa_driver_bsd_get_scan_results2()
1566 static int wpa_driver_bsd_capa(struct bsd_driver_data *drv) in wpa_driver_bsd_capa() argument
1571 #define IEEE80211_CIPHER_TKIP 1 in wpa_driver_bsd_capa()
1573 #define IEEE80211_CRYPTO_WEP (1<<IEEE80211_CIPHER_WEP) in wpa_driver_bsd_capa()
1574 #define IEEE80211_CRYPTO_TKIP (1<<IEEE80211_CIPHER_TKIP) in wpa_driver_bsd_capa()
1575 #define IEEE80211_CRYPTO_AES_CCM (1<<IEEE80211_CIPHER_AES_CCM) in wpa_driver_bsd_capa()
1581 if (get80211var(drv, IEEE80211_IOC_DEVCAPS, &devcaps, in wpa_driver_bsd_capa()
1585 return -1; in wpa_driver_bsd_capa()
1592 drv->capa.key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA | in wpa_driver_bsd_capa()
1595 drv->capa.key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA2 | in wpa_driver_bsd_capa()
1599 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_WEP40 | in wpa_driver_bsd_capa()
1602 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_TKIP; in wpa_driver_bsd_capa()
1604 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_CCMP; in wpa_driver_bsd_capa()
1606 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_CCMP_256; in wpa_driver_bsd_capa()
1608 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_GCMP; in wpa_driver_bsd_capa()
1610 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_GCMP_256; in wpa_driver_bsd_capa()
1612 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_BIP; in wpa_driver_bsd_capa()
1615 drv->capa.flags |= WPA_DRIVER_FLAGS_AP; in wpa_driver_bsd_capa()
1627 drv->capa.key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA | in wpa_driver_bsd_capa()
1631 drv->capa.enc = WPA_DRIVER_CAPA_ENC_WEP40 | in wpa_driver_bsd_capa()
1635 drv->capa.flags |= WPA_DRIVER_FLAGS_AP; in wpa_driver_bsd_capa()
1638 drv->capa.max_scan_ssids = IEEE80211_IOC_SCAN_MAX_SSID; in wpa_driver_bsd_capa()
1640 drv->capa.max_scan_ssids = 1; in wpa_driver_bsd_capa()
1642 drv->capa.auth = WPA_DRIVER_AUTH_OPEN | in wpa_driver_bsd_capa()
1649 get80211opmode(struct bsd_driver_data *drv) in get80211opmode() argument
1654 (void) os_strlcpy(ifmr.ifm_name, drv->ifname, sizeof(ifmr.ifm_name)); in get80211opmode()
1656 if (ioctl(drv->global->sock, SIOCGIFMEDIA, (caddr_t)&ifmr) >= 0) { in get80211opmode()
1680 #define GETPARAM(drv, param, v) \ in wpa_driver_bsd_init() argument
1681 (((v) = get80211param(drv, param)) != -1) in wpa_driver_bsd_init()
1682 struct bsd_driver_data *drv; in wpa_driver_bsd_init() local
1685 drv = os_zalloc(sizeof(*drv)); in wpa_driver_bsd_init()
1686 if (drv == NULL) in wpa_driver_bsd_init()
1689 drv->ifindex = if_nametoindex(ifname); in wpa_driver_bsd_init()
1690 if (drv->ifindex == 0) { in wpa_driver_bsd_init()
1696 drv->ctx = ctx; in wpa_driver_bsd_init()
1697 drv->global = priv; in wpa_driver_bsd_init()
1698 os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname)); in wpa_driver_bsd_init()
1701 drv->if_removed = 1; in wpa_driver_bsd_init()
1703 if (!GETPARAM(drv, IEEE80211_IOC_ROAMING, drv->prev_roaming)) { in wpa_driver_bsd_init()
1708 if (!GETPARAM(drv, IEEE80211_IOC_PRIVACY, drv->prev_privacy)) { in wpa_driver_bsd_init()
1713 if (!GETPARAM(drv, IEEE80211_IOC_WPA, drv->prev_wpa)) { in wpa_driver_bsd_init()
1719 if (wpa_driver_bsd_capa(drv)) in wpa_driver_bsd_init()
1724 drv->capa.key_mgmt_iftype[i] = drv->capa.key_mgmt; in wpa_driver_bsd_init()
1727 if (bsd_ctrl_iface(drv, 0) < 0) in wpa_driver_bsd_init()
1731 drv->if_removed = 0; in wpa_driver_bsd_init()
1733 drv->opmode = get80211opmode(drv); in wpa_driver_bsd_init()
1734 dl_list_add(&drv->global->ifaces, &drv->list); in wpa_driver_bsd_init()
1736 return drv; in wpa_driver_bsd_init()
1738 os_free(drv); in wpa_driver_bsd_init()
1746 struct bsd_driver_data *drv = priv; in wpa_driver_bsd_deinit() local
1748 if (drv->ifindex != 0 && !drv->if_removed) { in wpa_driver_bsd_deinit()
1749 wpa_driver_bsd_set_wpa(drv, 0); in wpa_driver_bsd_deinit()
1752 bsd_ctrl_iface(drv, 0); in wpa_driver_bsd_deinit()
1754 wpa_driver_bsd_set_wpa_internal(drv, drv->prev_wpa, in wpa_driver_bsd_deinit()
1755 drv->prev_privacy); in wpa_driver_bsd_deinit()
1757 if (set80211param(drv, IEEE80211_IOC_ROAMING, drv->prev_roaming) in wpa_driver_bsd_deinit()
1764 if (drv->sock_xmit != NULL) in wpa_driver_bsd_deinit()
1765 l2_packet_deinit(drv->sock_xmit); in wpa_driver_bsd_deinit()
1766 dl_list_del(&drv->list); in wpa_driver_bsd_deinit()
1767 os_free(drv); in wpa_driver_bsd_deinit()
1773 struct bsd_driver_data *drv = priv; in wpa_driver_bsd_get_capa() local
1775 os_memcpy(capa, &drv->capa, sizeof(*capa)); in wpa_driver_bsd_get_capa()
1798 global->ctx = ctx; in bsd_global_init()
1799 dl_list_init(&global->ifaces); in bsd_global_init()
1801 global->sock = socket(PF_LOCAL, SOCK_DGRAM | SOCK_CLOEXEC, 0); in bsd_global_init()
1802 if (global->sock < 0) { in bsd_global_init()
1808 global->route = socket(PF_ROUTE, in bsd_global_init()
1810 if (global->route < 0) { in bsd_global_init()
1817 if (setsockopt(global->route, PF_ROUTE, RO_MSGFILTER, in bsd_global_init()
1825 if (setsockopt(global->route, PF_ROUTE, ROUTE_MSGFILTER, in bsd_global_init()
1831 eloop_register_read_sock(global->route, bsd_wireless_event_receive, in bsd_global_init()
1837 close(global->sock); in bsd_global_init()
1848 eloop_unregister_read_sock(global->route); in bsd_global_deinit()
1849 (void) close(global->route); in bsd_global_deinit()
1850 (void) close(global->sock); in bsd_global_deinit()