mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-12-12 11:48:25 +02:00
150 lines
4.0 KiB
Diff
150 lines
4.0 KiB
Diff
|
---
|
||
|
hostapd/driver_devicescape.c | 111 +++++++++++++++++++++++++++++++------------
|
||
|
1 file changed, 82 insertions(+), 29 deletions(-)
|
||
|
|
||
|
--- hostap.orig/hostapd/driver_devicescape.c 2007-11-09 13:41:13.000000000 +0100
|
||
|
+++ hostap/hostapd/driver_devicescape.c 2007-11-09 13:41:13.000000000 +0100
|
||
|
@@ -68,6 +68,8 @@ struct i802_driver_data {
|
||
|
struct nl_handle *nl_handle;
|
||
|
struct nl_cache *nl_cache;
|
||
|
struct genl_family *nl80211;
|
||
|
+ int dtim_period;
|
||
|
+ unsigned int beacon_set:1;
|
||
|
};
|
||
|
|
||
|
|
||
|
@@ -908,37 +910,44 @@ static int i802_bss_remove(void *priv, c
|
||
|
}
|
||
|
|
||
|
|
||
|
-static int i802_set_beacon(const char *ifname, void *priv,
|
||
|
+static int i802_set_beacon(const char *iface, void *priv,
|
||
|
u8 *head, size_t head_len,
|
||
|
u8 *tail, size_t tail_len)
|
||
|
{
|
||
|
struct i802_driver_data *drv = priv;
|
||
|
- struct prism2_hostapd_param *param;
|
||
|
- int len, ret = 0;
|
||
|
+ struct nl_msg *msg;
|
||
|
+ u8 cmd = NL80211_CMD_NEW_BEACON;
|
||
|
+ int ret = -1;
|
||
|
|
||
|
- param = os_zalloc(sizeof(*param) + head_len + tail_len);
|
||
|
- if (param == NULL) {
|
||
|
- printf("Failed to alloc memory for beacon ioctl\n");
|
||
|
- return -1;
|
||
|
- }
|
||
|
- len = (¶m->u.beacon.data[0] - (u8 *) param) + head_len + tail_len;
|
||
|
- param->cmd = PRISM2_HOSTAPD_SET_BEACON;
|
||
|
- param->u.beacon.head_len = head_len;
|
||
|
- param->u.beacon.tail_len = tail_len;
|
||
|
- memcpy(¶m->u.beacon.data[0], head, head_len);
|
||
|
- memcpy(¶m->u.beacon.data[0] + head_len, tail, tail_len);
|
||
|
-
|
||
|
- if (len < (int) sizeof(*param))
|
||
|
- len = sizeof(*param);
|
||
|
- if (hostapd_ioctl_iface(ifname, drv, param, len)) {
|
||
|
- printf("Could not set beacon data to kernel driver.\n");
|
||
|
- printf("ifname='%s' head=%p head_len=%d tail=%p tail_len=%d "
|
||
|
- "cmd=%d\n",
|
||
|
- ifname, head, head_len, tail, tail_len, param->cmd);
|
||
|
- ret = -1;
|
||
|
- }
|
||
|
+ msg = nlmsg_alloc();
|
||
|
+ if (!msg)
|
||
|
+ goto out;
|
||
|
|
||
|
- free(param);
|
||
|
+ if (drv->beacon_set)
|
||
|
+ cmd = NL80211_CMD_SET_BEACON;
|
||
|
+
|
||
|
+ genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
|
||
|
+ 0, cmd, 0);
|
||
|
+ NLA_PUT(msg, NL80211_ATTR_BEACON_HEAD, head_len, head);
|
||
|
+ NLA_PUT(msg, NL80211_ATTR_BEACON_TAIL, tail_len, tail);
|
||
|
+ NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(iface));
|
||
|
+ NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, 1000);
|
||
|
+
|
||
|
+ if (!drv->dtim_period)
|
||
|
+ drv->dtim_period = 2;
|
||
|
+ NLA_PUT_U32(msg, NL80211_ATTR_DTIM_PERIOD, drv->dtim_period);
|
||
|
+
|
||
|
+ if (nl_send_auto_complete(drv->nl_handle, msg) < 0 ||
|
||
|
+ nl_wait_for_ack(drv->nl_handle) < 0)
|
||
|
+ goto out;
|
||
|
+
|
||
|
+ ret = 0;
|
||
|
+
|
||
|
+ drv->beacon_set = 1;
|
||
|
+
|
||
|
+ out:
|
||
|
+ nla_put_failure:
|
||
|
+ nlmsg_free(msg);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
@@ -985,15 +994,59 @@ static int i802_set_internal_bridge(void
|
||
|
static int i802_set_beacon_int(void *priv, int value)
|
||
|
{
|
||
|
struct i802_driver_data *drv = priv;
|
||
|
- return hostap_ioctl_prism2param(drv, PRISM2_PARAM_BEACON_INT, value);
|
||
|
+ struct nl_msg *msg;
|
||
|
+ int ret = -1;
|
||
|
+
|
||
|
+ msg = nlmsg_alloc();
|
||
|
+ if (!msg)
|
||
|
+ goto out;
|
||
|
+
|
||
|
+ genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
|
||
|
+ 0, NL80211_CMD_SET_BEACON, 0);
|
||
|
+ NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->iface));
|
||
|
+
|
||
|
+ NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, value);
|
||
|
+
|
||
|
+ if (nl_send_auto_complete(drv->nl_handle, msg) < 0 ||
|
||
|
+ nl_wait_for_ack(drv->nl_handle) < 0)
|
||
|
+ goto out;
|
||
|
+
|
||
|
+ ret = 0;
|
||
|
+
|
||
|
+ out:
|
||
|
+ nla_put_failure:
|
||
|
+ nlmsg_free(msg);
|
||
|
+ return ret;
|
||
|
}
|
||
|
|
||
|
|
||
|
-static int i802_set_dtim_period(const char *ifname, void *priv, int value)
|
||
|
+static int i802_set_dtim_period(const char *iface, void *priv, int value)
|
||
|
{
|
||
|
struct i802_driver_data *drv = priv;
|
||
|
- return hostap_ioctl_prism2param_iface(ifname, drv,
|
||
|
- PRISM2_PARAM_DTIM_PERIOD, value);
|
||
|
+ struct nl_msg *msg;
|
||
|
+ int ret = -1;
|
||
|
+
|
||
|
+ msg = nlmsg_alloc();
|
||
|
+ if (!msg)
|
||
|
+ goto out;
|
||
|
+
|
||
|
+ genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
|
||
|
+ 0, NL80211_CMD_SET_BEACON, 0);
|
||
|
+ NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(iface));
|
||
|
+
|
||
|
+ drv->dtim_period = value;
|
||
|
+ NLA_PUT_U32(msg, NL80211_ATTR_DTIM_PERIOD, drv->dtim_period);
|
||
|
+
|
||
|
+ if (nl_send_auto_complete(drv->nl_handle, msg) < 0 ||
|
||
|
+ nl_wait_for_ack(drv->nl_handle) < 0)
|
||
|
+ goto out;
|
||
|
+
|
||
|
+ ret = 0;
|
||
|
+
|
||
|
+ out:
|
||
|
+ nla_put_failure:
|
||
|
+ nlmsg_free(msg);
|
||
|
+ return ret;
|
||
|
}
|
||
|
|
||
|
|