From 9fff9fdcf921d216fe3d7528fe70679318192fea Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Tue, 14 Apr 2009 15:52:05 +0300 Subject: [PATCH] nl80211: Use shared code for netlink initialization --- src/drivers/driver_nl80211.c | 139 +++++++++++++++++------------------------- 1 file changed, 55 insertions(+), 84 deletions(-) diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 073494a..75e9c73 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -1007,28 +1007,12 @@ static void wpa_driver_nl80211_capa(struct wpa_driver_nl80211_data *drv) } -/** - * wpa_driver_nl80211_init - Initialize nl80211 driver interface - * @ctx: context to be used when calling wpa_supplicant functions, - * e.g., wpa_supplicant_event() - * @ifname: interface name, e.g., wlan0 - * Returns: Pointer to private data, %NULL on failure - */ -static void * wpa_driver_nl80211_init(void *ctx, const char *ifname) +static int wpa_driver_nl80211_init_nl(struct wpa_driver_nl80211_data *drv, + void *ctx) { - int s, ret; - struct sockaddr_nl local; - struct wpa_driver_nl80211_data *drv; + int ret; - drv = os_zalloc(sizeof(*drv)); - if (drv == NULL) - return NULL; - drv->ctx = ctx; - os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname)); -#ifdef CONFIG_AP - drv->monitor_ifidx = -1; - drv->monitor_sock = -1; -#endif /* CONFIG_AP */ + /* Initialize generic netlink and nl80211 */ drv->nl_cb = nl_cb_alloc(NL_CB_DEFAULT); if (drv->nl_cb == NULL) { @@ -1050,12 +1034,21 @@ static void * wpa_driver_nl80211_init(void *ctx, const char *ifname) goto err3; } +#ifdef CONFIG_LIBNL20 + if (genl_ctrl_alloc_cache(drv->nl_handle, &drv->nl_cache) < 0) { + wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic " + "netlink cache"); + goto err3; + } +#else /* CONFIG_LIBNL20 */ drv->nl_cache = genl_ctrl_alloc_cache(drv->nl_handle); if (drv->nl_cache == NULL) { wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic " "netlink cache"); goto err3; } +#endif /* CONFIG_LIBNL20 */ + drv->nl80211 = genl_ctrl_search_by_name(drv->nl_cache, "nl80211"); if (drv->nl80211 == NULL) { @@ -1083,11 +1076,51 @@ static void * wpa_driver_nl80211_init(void *ctx, const char *ifname) ret, strerror(-ret)); goto err4; } - drv->capa.flags |= WPA_DRIVER_FLAGS_SME; eloop_register_read_sock(nl_socket_get_fd(drv->nl_handle), wpa_driver_nl80211_event_receive, drv, ctx); + return 0; + +err4: + nl_cache_free(drv->nl_cache); +err3: + nl_handle_destroy(drv->nl_handle); +err2: + nl_cb_put(drv->nl_cb); +err1: + return -1; +} + + +/** + * wpa_driver_nl80211_init - Initialize nl80211 driver interface + * @ctx: context to be used when calling wpa_supplicant functions, + * e.g., wpa_supplicant_event() + * @ifname: interface name, e.g., wlan0 + * Returns: Pointer to private data, %NULL on failure + */ +static void * wpa_driver_nl80211_init(void *ctx, const char *ifname) +{ + int s; + struct sockaddr_nl local; + struct wpa_driver_nl80211_data *drv; + + drv = os_zalloc(sizeof(*drv)); + if (drv == NULL) + return NULL; + drv->ctx = ctx; + os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname)); +#ifdef CONFIG_AP + drv->monitor_ifidx = -1; + drv->monitor_sock = -1; +#endif /* CONFIG_AP */ + + if (wpa_driver_nl80211_init_nl(drv, ctx)) + goto err1; + + drv->capa.flags |= WPA_DRIVER_FLAGS_SME; + drv->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0); if (drv->ioctl_sock < 0) { perror("socket(PF_INET,SOCK_DGRAM)"); @@ -1127,11 +1160,8 @@ err6: close(drv->ioctl_sock); err5: genl_family_put(drv->nl80211); -err4: nl_cache_free(drv->nl_cache); -err3: nl_handle_destroy(drv->nl_handle); -err2: nl_cb_put(drv->nl_cb); err1: os_free(drv); @@ -4127,7 +4157,6 @@ static int i802_ht_scan(struct wpa_driver_nl80211_data *drv) static int i802_init_sockets(struct wpa_driver_nl80211_data *drv, const u8 *bssid) { struct ifreq ifr; - int ret; drv->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0); if (drv->ioctl_sock < 0) { @@ -4152,66 +4181,8 @@ static int i802_init_sockets(struct wpa_driver_nl80211_data *drv, const u8 *bssi } } - /* - * initialise generic netlink and nl80211 - */ - drv->nl_cb = nl_cb_alloc(NL_CB_DEFAULT); - if (!drv->nl_cb) { - printf("Failed to allocate netlink callbacks.\n"); - return -1; - } - - drv->nl_handle = nl_handle_alloc_cb(drv->nl_cb); - if (!drv->nl_handle) { - printf("Failed to allocate netlink handle.\n"); - return -1; - } - - if (genl_connect(drv->nl_handle)) { - printf("Failed to connect to generic netlink.\n"); - return -1; - } - -#ifdef CONFIG_LIBNL20 - if (genl_ctrl_alloc_cache(drv->nl_handle, &drv->nl_cache) < 0) { - printf("Failed to allocate generic netlink cache.\n"); - return -1; - } -#else /* CONFIG_LIBNL20 */ - drv->nl_cache = genl_ctrl_alloc_cache(drv->nl_handle); - if (!drv->nl_cache) { - printf("Failed to allocate generic netlink cache.\n"); - return -1; - } -#endif /* CONFIG_LIBNL20 */ - - drv->nl80211 = genl_ctrl_search_by_name(drv->nl_cache, "nl80211"); - if (!drv->nl80211) { - printf("nl80211 not found.\n"); + if (wpa_driver_nl80211_init_nl(drv, drv->hapd)) return -1; - } - - ret = nl_get_multicast_id(drv, "nl80211", "scan"); - if (ret >= 0) - ret = nl_socket_add_membership(drv->nl_handle, ret); - if (ret < 0) { - wpa_printf(MSG_DEBUG, "nl80211: Could not add multicast " - "membership for scan events: %d (%s)", - ret, strerror(-ret)); - } - - ret = nl_get_multicast_id(drv, "nl80211", "mlme"); - if (ret >= 0) - ret = nl_socket_add_membership(drv->nl_handle, ret); - if (ret < 0) { - wpa_printf(MSG_DEBUG, "nl80211: Could not add multicast " - "membership for mlme events: %d (%s)", - ret, strerror(-ret)); - } - - eloop_register_read_sock(nl_socket_get_fd(drv->nl_handle), - wpa_driver_nl80211_event_receive, drv, - drv->hapd); #ifdef CONFIG_IEEE80211N if (drv->ht_40mhz_scan) { -- 1.7.9.5