[PATCH] hostapd: nl80211 adaptation for Red Hat 2.6.18 kernel
Christian Lestrade
christian.lestrade
Mon Jul 18 08:10:39 PDT 2011
I wrote the following code in order to let hostapd work with Red Hat's
customized 2.6.18 Linux kernel.
It is a matter of using the old nl80211 kernel API for multicast subscription
instead of the new and providing definitions which are not exported by the RHEL
kernel.
Tested OK on a Slackware 11 system with RHEL 2.6.18 kernel compiled from the
sources and with a SMC SMCWCBT-G Cardbus adapter PCI ID 168c:0013
04:00.0 Ethernet controller: Atheros Communications, Inc. AR5212 802.11abg NIC
(rev 01)
--- hostapd-0.7.3/src/drivers/driver_nl80211.c 2010-09-07 17:43:39.000000000
+0200
+++ hostapd-0.7.3-fixed/src/drivers/driver_nl80211.c 2011-07-12
13:00:29.000000000 +0200
@@ -42,6 +42,33 @@
#define nl_handle_destroy nl_socket_free
#endif /* CONFIG_LIBNL20 */
+enum {
+ CTRL_ATTR_MCAST_GRP_UNSPEC,
+ CTRL_ATTR_MCAST_GRP_NAME,
+ CTRL_ATTR_MCAST_GRP_ID,
+ __CTRL_ATTR_MCAST_GRP_MAX,
+};
+
+#define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1)
+#define CTRL_ATTR_MCAST_GROUPS 7
+
+enum nl80211_multicast_groups {
+ /* be notified of configuration changes like wiphy renames */
+ NL80211_GROUP_CONFIG,
+ /* be notified of scan results */
+ NL80211_GROUP_SCAN,
+ /* be notified of regulatory changes */
+ NL80211_GROUP_REGULATORY,
+ /* be notified of MLME events */
+ NL80211_GROUP_MLME,
+
+ /* add groups here */
+
+ /* keep last */
+ __NL80211_GROUP_AFTER_LAST
+};
+#define NL80211_GROUP_MAX (__NL80211_GROUP_AFTER_LAST - 1)
+
#ifndef IFF_LOWER_UP
#define IFF_LOWER_UP 0x10000 /* driver signals L1 up */
@@ -1251,6 +1278,10 @@
static int wpa_driver_nl80211_init_nl(struct wpa_driver_nl80211_data *drv,
void *ctx)
{
+#ifdef DEPRECATED_MEMBERSHIP
+ struct sockaddr_nl mcsa;
+ socklen_t mcsa_size;
+#endif
int ret;
/* Initialize generic netlink and nl80211 */
@@ -1322,6 +1353,29 @@
goto err4;
}
+#ifdef DEPRECATED_MEMBERSHIP
+ memset(&mcsa, 0, sizeof(mcsa));
+ mcsa_size = sizeof(mcsa);
+ /* Retrieve socket nl_pid */
+ ret = getsockname(nl_socket_get_fd(drv->nl_handle_event),
+ (struct sockaddr*)&mcsa, &mcsa_size);
+ if (ret < 0) {
+ wpa_printf(MSG_ERROR, "nl80211: Could not fetch netlink "
+ "socket PID for musticast events: %d (%s)",
+ ret, strerror(-ret));
+ goto err4;
+ }
+ mcsa.nl_family = AF_NETLINK;
+ mcsa.nl_groups |= NL80211_GROUP_SCAN | NL80211_GROUP_MLME;
+ ret = bind(nl_socket_get_fd(drv->nl_handle_event),
+ (struct sockaddr*)&mcsa, sizeof(mcsa));
+ if (ret < 0) {
+ wpa_printf(MSG_ERROR, "nl80211: Could not add multicast "
+ "membership for scan events: %d (%s)",
+ ret, strerror(-ret));
+ goto err4;
+ }
+#else
ret = nl_get_multicast_id(drv, "nl80211", "scan");
if (ret >= 0)
ret = nl_socket_add_membership(drv->nl_handle_event, ret);
@@ -1341,6 +1395,7 @@
ret, strerror(-ret));
goto err4;
}
+#endif
eloop_register_read_sock(nl_socket_get_fd(drv->nl_handle_event),
wpa_driver_nl80211_event_receive, drv, ctx);
--- hostapd-0.7.3/hostapd/defconfig 2010-09-07 17:43:39.000000000 +0200
+++ hostapd-0.7.3-fixed/hostapd/defconfig 2011-07-12 13:01:36.000000000 +0200
@@ -20,13 +20,14 @@
#CFLAGS += -I../../madwifi # change to the madwifi source directory
# Driver interface for drivers using the nl80211 kernel interface
-#CONFIG_DRIVER_NL80211=y
+CONFIG_DRIVER_NL80211=y
# driver_nl80211.c requires a rather new libnl (version 1.1) which may not be
# shipped with your distribution yet. If that is the case, you need to build
# newer libnl version and point the hostapd build to use it.
-#LIBNL=/usr/src/libnl
-#CFLAGS += -I$(LIBNL)/include
-#LIBS += -L$(LIBNL)/lib
+LIBNL=/usr/src/wireless/libnl-2.0
+CFLAGS += -DDEPRECATED_MEMBERSHIP -DCONFIG_LIBNL20 -I$(LIBNL)/include
+CFLAGS += -I/usr/src/linux-2.6.18rh-mki/include
+LIBS += -L$(LIBNL)/lib -lnl-genl -lm
# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver)
#CONFIG_DRIVER_BSD=y
Christian Lestrade
More information about the Hostap
mailing list