| @@ -48,34 +48,33 @@ | | | @@ -48,34 +48,33 @@ |
48 | #include "l2_packet/l2_packet.h" | | 48 | #include "l2_packet/l2_packet.h" |
49 | | | 49 | |
50 | struct bsd_driver_global { | | 50 | struct bsd_driver_global { |
51 | void *ctx; | | 51 | void *ctx; |
52 | int sock; /* socket for 802.11 ioctls */ | | 52 | int sock; /* socket for 802.11 ioctls */ |
53 | int route; /* routing socket for events */ | | 53 | int route; /* routing socket for events */ |
54 | struct iovec event_iov[1]; | | 54 | struct iovec event_iov[1]; |
55 | struct dl_list ifaces; /* list of interfaces */ | | 55 | struct dl_list ifaces; /* list of interfaces */ |
56 | }; | | 56 | }; |
57 | | | 57 | |
58 | struct bsd_driver_data { | | 58 | struct bsd_driver_data { |
59 | struct dl_list list; | | 59 | struct dl_list list; |
60 | struct bsd_driver_global *global; | | 60 | struct bsd_driver_global *global; |
61 | struct hostapd_data *hapd; /* back pointer */ | | 61 | void *ctx; |
62 | | | 62 | |
63 | struct l2_packet_data *sock_xmit;/* raw packet xmit socket */ | | 63 | struct l2_packet_data *sock_xmit;/* raw packet xmit socket */ |
64 | char ifname[IFNAMSIZ+1]; /* interface name */ | | 64 | char ifname[IFNAMSIZ+1]; /* interface name */ |
65 | int flags; | | 65 | int flags; |
66 | unsigned int ifindex; /* interface index */ | | 66 | unsigned int ifindex; /* interface index */ |
67 | int if_removed; /* has the interface been removed? */ | | 67 | int if_removed; /* has the interface been removed? */ |
68 | void *ctx; | | | |
69 | struct wpa_driver_capa capa; /* driver capability */ | | 68 | struct wpa_driver_capa capa; /* driver capability */ |
70 | int is_ap; /* Access point mode */ | | 69 | int is_ap; /* Access point mode */ |
71 | int prev_roaming; /* roaming state to restore on deinit */ | | 70 | int prev_roaming; /* roaming state to restore on deinit */ |
72 | int prev_privacy; /* privacy state to restore on deinit */ | | 71 | int prev_privacy; /* privacy state to restore on deinit */ |
73 | int prev_wpa; /* wpa state to restore on deinit */ | | 72 | int prev_wpa; /* wpa state to restore on deinit */ |
74 | enum ieee80211_opmode opmode; /* operation mode */ | | 73 | enum ieee80211_opmode opmode; /* operation mode */ |
75 | }; | | 74 | }; |
76 | | | 75 | |
77 | /* Generic functions for hostapd and wpa_supplicant */ | | 76 | /* Generic functions for hostapd and wpa_supplicant */ |
78 | | | 77 | |
79 | #define IOVEC_BUFSIZ 256 | | 78 | #define IOVEC_BUFSIZ 256 |
80 | ssize_t | | 79 | ssize_t |
81 | recvmsg_realloc(int fd, struct msghdr *msg, int flags) | | 80 | recvmsg_realloc(int fd, struct msghdr *msg, int flags) |
| @@ -833,81 +832,81 @@ bsd_wireless_event_receive(int sock, voi | | | @@ -833,81 +832,81 @@ bsd_wireless_event_receive(int sock, voi |
833 | case RTM_IEEE80211: | | 832 | case RTM_IEEE80211: |
834 | ifan = (struct if_announcemsghdr *) rtm; | | 833 | ifan = (struct if_announcemsghdr *) rtm; |
835 | drv = bsd_get_drvindex(global, ifan->ifan_index); | | 834 | drv = bsd_get_drvindex(global, ifan->ifan_index); |
836 | if (drv == NULL) | | 835 | if (drv == NULL) |
837 | return; | | 836 | return; |
838 | switch (ifan->ifan_what) { | | 837 | switch (ifan->ifan_what) { |
839 | case RTM_IEEE80211_ASSOC: | | 838 | case RTM_IEEE80211_ASSOC: |
840 | case RTM_IEEE80211_REASSOC: | | 839 | case RTM_IEEE80211_REASSOC: |
841 | case RTM_IEEE80211_DISASSOC: | | 840 | case RTM_IEEE80211_DISASSOC: |
842 | case RTM_IEEE80211_SCAN: | | 841 | case RTM_IEEE80211_SCAN: |
843 | break; | | 842 | break; |
844 | case RTM_IEEE80211_LEAVE: | | 843 | case RTM_IEEE80211_LEAVE: |
845 | leave = (struct ieee80211_leave_event *) &ifan[1]; | | 844 | leave = (struct ieee80211_leave_event *) &ifan[1]; |
846 | drv_event_disassoc(drv->hapd, leave->iev_addr); | | 845 | drv_event_disassoc(drv->ctx, leave->iev_addr); |
847 | break; | | 846 | break; |
848 | case RTM_IEEE80211_JOIN: | | 847 | case RTM_IEEE80211_JOIN: |
849 | #ifdef RTM_IEEE80211_REJOIN | | 848 | #ifdef RTM_IEEE80211_REJOIN |
850 | case RTM_IEEE80211_REJOIN: | | 849 | case RTM_IEEE80211_REJOIN: |
851 | #endif | | 850 | #endif |
852 | join = (struct ieee80211_join_event *) &ifan[1]; | | 851 | join = (struct ieee80211_join_event *) &ifan[1]; |
853 | bsd_new_sta(drv, drv->hapd, join->iev_addr); | | 852 | bsd_new_sta(drv, drv->ctx, join->iev_addr); |
854 | break; | | 853 | break; |
855 | case RTM_IEEE80211_REPLAY: | | 854 | case RTM_IEEE80211_REPLAY: |
856 | /* ignore */ | | 855 | /* ignore */ |
857 | break; | | 856 | break; |
858 | case RTM_IEEE80211_MICHAEL: | | 857 | case RTM_IEEE80211_MICHAEL: |
859 | mic = (struct ieee80211_michael_event *) &ifan[1]; | | 858 | mic = (struct ieee80211_michael_event *) &ifan[1]; |
860 | wpa_printf(MSG_DEBUG, | | 859 | wpa_printf(MSG_DEBUG, |
861 | "Michael MIC failure wireless event: " | | 860 | "Michael MIC failure wireless event: " |
862 | "keyix=%u src_addr=" MACSTR, mic->iev_keyix, | | 861 | "keyix=%u src_addr=" MACSTR, mic->iev_keyix, |
863 | MAC2STR(mic->iev_src)); | | 862 | MAC2STR(mic->iev_src)); |
864 | os_memset(&data, 0, sizeof(data)); | | 863 | os_memset(&data, 0, sizeof(data)); |
865 | data.michael_mic_failure.unicast = 1; | | 864 | data.michael_mic_failure.unicast = 1; |
866 | data.michael_mic_failure.src = mic->iev_src; | | 865 | data.michael_mic_failure.src = mic->iev_src; |
867 | wpa_supplicant_event(drv->hapd, | | 866 | wpa_supplicant_event(drv->ctx, |
868 | EVENT_MICHAEL_MIC_FAILURE, &data); | | 867 | EVENT_MICHAEL_MIC_FAILURE, &data); |
869 | break; | | 868 | break; |
870 | } | | 869 | } |
871 | break; | | 870 | break; |
872 | } | | 871 | } |
873 | } | | 872 | } |
874 | | | 873 | |
875 | static void | | 874 | static void |
876 | handle_read(void *ctx, const u8 *src_addr, const u8 *buf, size_t len) | | 875 | handle_read(void *ctx, const u8 *src_addr, const u8 *buf, size_t len) |
877 | { | | 876 | { |
878 | struct bsd_driver_data *drv = ctx; | | 877 | struct bsd_driver_data *drv = ctx; |
879 | drv_event_eapol_rx(drv->hapd, src_addr, buf, len); | | 878 | drv_event_eapol_rx(drv->ctx, src_addr, buf, len); |
880 | } | | 879 | } |
881 | | | 880 | |
882 | static void * | | 881 | static void * |
883 | bsd_init(struct hostapd_data *hapd, struct wpa_init_params *params) | | 882 | bsd_init(struct hostapd_data *hapd, struct wpa_init_params *params) |
884 | { | | 883 | { |
885 | struct bsd_driver_data *drv; | | 884 | struct bsd_driver_data *drv; |
886 | | | 885 | |
887 | drv = os_zalloc(sizeof(struct bsd_driver_data)); | | 886 | drv = os_zalloc(sizeof(struct bsd_driver_data)); |
888 | if (drv == NULL) { | | 887 | if (drv == NULL) { |
889 | wpa_printf(MSG_ERROR, "Could not allocate memory for bsd driver data"); | | 888 | wpa_printf(MSG_ERROR, "Could not allocate memory for bsd driver data"); |
890 | return NULL; | | 889 | return NULL; |
891 | } | | 890 | } |
892 | | | 891 | |
893 | drv->ifindex = if_nametoindex(params->ifname); | | 892 | drv->ifindex = if_nametoindex(params->ifname); |
894 | if (drv->ifindex == 0) { | | 893 | if (drv->ifindex == 0) { |
895 | wpa_printf(MSG_DEBUG, "%s: interface %s does not exist", | | 894 | wpa_printf(MSG_DEBUG, "%s: interface %s does not exist", |
896 | __func__, params->ifname); | | 895 | __func__, params->ifname); |
897 | goto bad; | | 896 | goto bad; |
898 | } | | 897 | } |
899 | | | 898 | |
900 | drv->hapd = hapd; | | 899 | drv->ctx = hapd; |
901 | drv->global = params->global_priv; | | 900 | drv->global = params->global_priv; |
902 | os_strlcpy(drv->ifname, params->ifname, sizeof(drv->ifname)); | | 901 | os_strlcpy(drv->ifname, params->ifname, sizeof(drv->ifname)); |
903 | | | 902 | |
904 | drv->sock_xmit = l2_packet_init(drv->ifname, NULL, ETH_P_EAPOL, | | 903 | drv->sock_xmit = l2_packet_init(drv->ifname, NULL, ETH_P_EAPOL, |
905 | handle_read, drv, 0); | | 904 | handle_read, drv, 0); |
906 | if (drv->sock_xmit == NULL) | | 905 | if (drv->sock_xmit == NULL) |
907 | goto bad; | | 906 | goto bad; |
908 | if (l2_packet_get_own_addr(drv->sock_xmit, params->own_addr)) | | 907 | if (l2_packet_get_own_addr(drv->sock_xmit, params->own_addr)) |
909 | goto bad; | | 908 | goto bad; |
910 | | | 909 | |
911 | /* mark down during setup */ | | 910 | /* mark down during setup */ |
912 | if (bsd_ctrl_iface(drv, 0) < 0) | | 911 | if (bsd_ctrl_iface(drv, 0) < 0) |
913 | goto bad; | | 912 | goto bad; |