| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 1 | /** | 
|  | 2 | *  Functions implementing wlan infrastructure and adhoc join routines, | 
|  | 3 | *  IOCTL handlers as well as command preperation and response routines | 
|  | 4 | *  for sending adhoc start, adhoc join, and association commands | 
|  | 5 | *  to the firmware. | 
|  | 6 | */ | 
|  | 7 | #include <linux/netdevice.h> | 
|  | 8 | #include <linux/if_arp.h> | 
|  | 9 | #include <linux/wireless.h> | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 10 | #include <linux/etherdevice.h> | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 11 |  | 
|  | 12 | #include <net/iw_handler.h> | 
|  | 13 |  | 
|  | 14 | #include "host.h" | 
|  | 15 | #include "decl.h" | 
|  | 16 | #include "join.h" | 
|  | 17 | #include "dev.h" | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 18 | #include "assoc.h" | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 19 |  | 
| Luis Carlos Cobo | b37e584 | 2007-08-02 13:15:40 -0400 | [diff] [blame] | 20 | /* The firmware needs certain bits masked out of the beacon-derviced capability | 
|  | 21 | * field when associating/joining to BSSs. | 
|  | 22 | */ | 
|  | 23 | #define CAPINFO_MASK	(~(0xda00)) | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 24 |  | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 25 | /** | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 26 | *  @brief This function finds common rates between rate1 and card rates. | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 27 | * | 
|  | 28 | * It will fill common rates in rate1 as output if found. | 
|  | 29 | * | 
|  | 30 | * NOTE: Setting the MSB of the basic rates need to be taken | 
|  | 31 | *   care, either before or after calling this function | 
|  | 32 | * | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 33 | *  @param priv     A pointer to struct lbs_private structure | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 34 | *  @param rate1       the buffer which keeps input and output | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 35 | *  @param rate1_size  the size of rate1 buffer; new size of buffer on return | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 36 | * | 
|  | 37 | *  @return            0 or -1 | 
|  | 38 | */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 39 | static int get_common_rates(struct lbs_private *priv, | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 40 | u8 *rates, | 
|  | 41 | u16 *rates_size) | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 42 | { | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 43 | u8 *card_rates = lbs_bg_rates; | 
|  | 44 | size_t num_card_rates = sizeof(lbs_bg_rates); | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 45 | int ret = 0, i, j; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 46 | u8 tmp[30]; | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 47 | size_t tmp_size = 0; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 48 |  | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 49 | /* For each rate in card_rates that exists in rate1, copy to tmp */ | 
|  | 50 | for (i = 0; card_rates[i] && (i < num_card_rates); i++) { | 
|  | 51 | for (j = 0; rates[j] && (j < *rates_size); j++) { | 
|  | 52 | if (rates[j] == card_rates[i]) | 
|  | 53 | tmp[tmp_size++] = card_rates[i]; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 54 | } | 
|  | 55 | } | 
|  | 56 |  | 
| Holger Schurig | ece5619 | 2007-08-02 11:53:06 -0400 | [diff] [blame] | 57 | lbs_deb_hex(LBS_DEB_JOIN, "AP rates    ", rates, *rates_size); | 
|  | 58 | lbs_deb_hex(LBS_DEB_JOIN, "card rates  ", card_rates, num_card_rates); | 
|  | 59 | lbs_deb_hex(LBS_DEB_JOIN, "common rates", tmp, tmp_size); | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 60 | lbs_deb_join("TX data rate 0x%02x\n", priv->cur_rate); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 61 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 62 | if (!priv->auto_rate) { | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 63 | for (i = 0; i < tmp_size; i++) { | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 64 | if (tmp[i] == priv->cur_rate) | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 65 | goto done; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 66 | } | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 67 | lbs_pr_alert("Previously set fixed data rate %#x isn't " | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 68 | "compatible with the network.\n", priv->cur_rate); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 69 | ret = -1; | 
|  | 70 | goto done; | 
|  | 71 | } | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 72 | ret = 0; | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 73 |  | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 74 | done: | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 75 | memset(rates, 0, *rates_size); | 
|  | 76 | *rates_size = min_t(int, tmp_size, *rates_size); | 
|  | 77 | memcpy(rates, tmp, *rates_size); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 78 | return ret; | 
|  | 79 | } | 
|  | 80 |  | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 81 |  | 
|  | 82 | /** | 
|  | 83 | *  @brief Sets the MSB on basic rates as the firmware requires | 
|  | 84 | * | 
|  | 85 | * Scan through an array and set the MSB for basic data rates. | 
|  | 86 | * | 
|  | 87 | *  @param rates     buffer of data rates | 
|  | 88 | *  @param len       size of buffer | 
|  | 89 | */ | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 90 | static void lbs_set_basic_rate_flags(u8 *rates, size_t len) | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 91 | { | 
|  | 92 | int i; | 
|  | 93 |  | 
|  | 94 | for (i = 0; i < len; i++) { | 
|  | 95 | if (rates[i] == 0x02 || rates[i] == 0x04 || | 
|  | 96 | rates[i] == 0x0b || rates[i] == 0x16) | 
|  | 97 | rates[i] |= 0x80; | 
|  | 98 | } | 
|  | 99 | } | 
|  | 100 |  | 
|  | 101 | /** | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 102 | *  @brief Associate to a specific BSS discovered in a scan | 
|  | 103 | * | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 104 | *  @param priv      A pointer to struct lbs_private structure | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 105 | *  @param pbssdesc  Pointer to the BSS descriptor to associate with. | 
|  | 106 | * | 
|  | 107 | *  @return          0-success, otherwise fail | 
|  | 108 | */ | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 109 | int lbs_associate(struct lbs_private *priv, struct assoc_request *assoc_req) | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 110 | { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 111 | int ret; | 
|  | 112 |  | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 113 | lbs_deb_enter(LBS_DEB_ASSOC); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 114 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 115 | ret = lbs_prepare_and_send_command(priv, CMD_802_11_AUTHENTICATE, | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 116 | 0, CMD_OPTION_WAITFORRSP, | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 117 | 0, assoc_req->bss.bssid); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 118 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 119 | if (ret) | 
|  | 120 | goto done; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 121 |  | 
|  | 122 | /* set preamble to firmware */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 123 | if (   (priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 124 | && (assoc_req->bss.capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 125 | priv->preamble = CMD_TYPE_SHORT_PREAMBLE; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 126 | else | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 127 | priv->preamble = CMD_TYPE_LONG_PREAMBLE; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 128 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 129 | lbs_set_radio_control(priv); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 130 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 131 | ret = lbs_prepare_and_send_command(priv, CMD_802_11_ASSOCIATE, | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 132 | 0, CMD_OPTION_WAITFORRSP, 0, assoc_req); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 133 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 134 | done: | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 135 | lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 136 | return ret; | 
|  | 137 | } | 
|  | 138 |  | 
|  | 139 | /** | 
|  | 140 | *  @brief Start an Adhoc Network | 
|  | 141 | * | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 142 | *  @param priv         A pointer to struct lbs_private structure | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 143 | *  @param adhocssid    The ssid of the Adhoc Network | 
|  | 144 | *  @return             0--success, -1--fail | 
|  | 145 | */ | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 146 | int lbs_start_adhoc_network(struct lbs_private *priv, | 
|  | 147 | struct assoc_request *assoc_req) | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 148 | { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 149 | int ret = 0; | 
|  | 150 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 151 | priv->adhoccreate = 1; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 152 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 153 | if (priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) { | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 154 | lbs_deb_join("AdhocStart: Short preamble\n"); | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 155 | priv->preamble = CMD_TYPE_SHORT_PREAMBLE; | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 156 | } else { | 
|  | 157 | lbs_deb_join("AdhocStart: Long preamble\n"); | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 158 | priv->preamble = CMD_TYPE_LONG_PREAMBLE; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 159 | } | 
|  | 160 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 161 | lbs_set_radio_control(priv); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 162 |  | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 163 | lbs_deb_join("AdhocStart: channel = %d\n", assoc_req->channel); | 
|  | 164 | lbs_deb_join("AdhocStart: band = %d\n", assoc_req->band); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 165 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 166 | ret = lbs_prepare_and_send_command(priv, CMD_802_11_AD_HOC_START, | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 167 | 0, CMD_OPTION_WAITFORRSP, 0, assoc_req); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 168 |  | 
|  | 169 | return ret; | 
|  | 170 | } | 
|  | 171 |  | 
|  | 172 | /** | 
|  | 173 | *  @brief Join an adhoc network found in a previous scan | 
|  | 174 | * | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 175 | *  @param priv         A pointer to struct lbs_private structure | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 176 | *  @param pbssdesc     Pointer to a BSS descriptor found in a previous scan | 
|  | 177 | *                      to attempt to join | 
|  | 178 | * | 
|  | 179 | *  @return             0--success, -1--fail | 
|  | 180 | */ | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 181 | int lbs_join_adhoc_network(struct lbs_private *priv, | 
|  | 182 | struct assoc_request *assoc_req) | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 183 | { | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 184 | struct bss_descriptor * bss = &assoc_req->bss; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 185 | int ret = 0; | 
|  | 186 |  | 
| Dan Williams | d8efea2 | 2007-05-28 23:54:55 -0400 | [diff] [blame] | 187 | lbs_deb_join("%s: Current SSID '%s', ssid length %u\n", | 
|  | 188 | __func__, | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 189 | escape_essid(priv->curbssparams.ssid, | 
|  | 190 | priv->curbssparams.ssid_len), | 
|  | 191 | priv->curbssparams.ssid_len); | 
| Dan Williams | d8efea2 | 2007-05-28 23:54:55 -0400 | [diff] [blame] | 192 | lbs_deb_join("%s: requested ssid '%s', ssid length %u\n", | 
|  | 193 | __func__, escape_essid(bss->ssid, bss->ssid_len), | 
|  | 194 | bss->ssid_len); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 195 |  | 
|  | 196 | /* check if the requested SSID is already joined */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 197 | if (   priv->curbssparams.ssid_len | 
|  | 198 | && !lbs_ssid_cmp(priv->curbssparams.ssid, | 
|  | 199 | priv->curbssparams.ssid_len, | 
| Dan Williams | d8efea2 | 2007-05-28 23:54:55 -0400 | [diff] [blame] | 200 | bss->ssid, bss->ssid_len) | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 201 | && (priv->mode == IW_MODE_ADHOC) | 
|  | 202 | && (priv->connect_status == LBS_CONNECTED)) { | 
| Dan Williams | 0edef21 | 2007-08-02 13:14:29 -0400 | [diff] [blame] | 203 | union iwreq_data wrqu; | 
|  | 204 |  | 
|  | 205 | lbs_deb_join("ADHOC_J_CMD: New ad-hoc SSID is the same as " | 
|  | 206 | "current, not attempting to re-join"); | 
|  | 207 |  | 
|  | 208 | /* Send the re-association event though, because the association | 
|  | 209 | * request really was successful, even if just a null-op. | 
|  | 210 | */ | 
|  | 211 | memset(&wrqu, 0, sizeof(wrqu)); | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 212 | memcpy(wrqu.ap_addr.sa_data, priv->curbssparams.bssid, | 
| Dan Williams | 0edef21 | 2007-08-02 13:14:29 -0400 | [diff] [blame] | 213 | ETH_ALEN); | 
|  | 214 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; | 
|  | 215 | wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL); | 
|  | 216 | goto out; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 217 | } | 
|  | 218 |  | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 219 | /* Use shortpreamble only when both creator and card supports | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 220 | short preamble */ | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 221 | if (   !(bss->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 222 | || !(priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) { | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 223 | lbs_deb_join("AdhocJoin: Long preamble\n"); | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 224 | priv->preamble = CMD_TYPE_LONG_PREAMBLE; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 225 | } else { | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 226 | lbs_deb_join("AdhocJoin: Short preamble\n"); | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 227 | priv->preamble = CMD_TYPE_SHORT_PREAMBLE; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 228 | } | 
|  | 229 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 230 | lbs_set_radio_control(priv); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 231 |  | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 232 | lbs_deb_join("AdhocJoin: channel = %d\n", assoc_req->channel); | 
|  | 233 | lbs_deb_join("AdhocJoin: band = %c\n", assoc_req->band); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 234 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 235 | priv->adhoccreate = 0; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 236 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 237 | ret = lbs_prepare_and_send_command(priv, CMD_802_11_AD_HOC_JOIN, | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 238 | 0, CMD_OPTION_WAITFORRSP, | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 239 | OID_802_11_SSID, assoc_req); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 240 |  | 
| Dan Williams | 0edef21 | 2007-08-02 13:14:29 -0400 | [diff] [blame] | 241 | out: | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 242 | return ret; | 
|  | 243 | } | 
|  | 244 |  | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 245 | int lbs_stop_adhoc_network(struct lbs_private *priv) | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 246 | { | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 247 | return lbs_prepare_and_send_command(priv, CMD_802_11_AD_HOC_STOP, | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 248 | 0, CMD_OPTION_WAITFORRSP, 0, NULL); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 249 | } | 
|  | 250 |  | 
|  | 251 | /** | 
|  | 252 | *  @brief Send Deauthentication Request | 
|  | 253 | * | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 254 | *  @param priv      A pointer to struct lbs_private structure | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 255 | *  @return          0--success, -1--fail | 
|  | 256 | */ | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 257 | int lbs_send_deauthentication(struct lbs_private *priv) | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 258 | { | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 259 | return lbs_prepare_and_send_command(priv, CMD_802_11_DEAUTHENTICATE, | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 260 | 0, CMD_OPTION_WAITFORRSP, 0, NULL); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 261 | } | 
|  | 262 |  | 
|  | 263 | /** | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 264 | *  @brief This function prepares command of authenticate. | 
|  | 265 | * | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 266 | *  @param priv      A pointer to struct lbs_private structure | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 267 | *  @param cmd       A pointer to cmd_ds_command structure | 
|  | 268 | *  @param pdata_buf Void cast of pointer to a BSSID to authenticate with | 
|  | 269 | * | 
|  | 270 | *  @return         0 or -1 | 
|  | 271 | */ | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 272 | int lbs_cmd_80211_authenticate(struct lbs_private *priv, | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 273 | struct cmd_ds_command *cmd, | 
|  | 274 | void *pdata_buf) | 
|  | 275 | { | 
| Dan Williams | 6affe78 | 2007-05-10 22:56:42 -0400 | [diff] [blame] | 276 | struct cmd_ds_802_11_authenticate *pauthenticate = &cmd->params.auth; | 
|  | 277 | int ret = -1; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 278 | u8 *bssid = pdata_buf; | 
| Joe Perches | 0795af5 | 2007-10-03 17:59:30 -0700 | [diff] [blame] | 279 | DECLARE_MAC_BUF(mac); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 280 |  | 
| Dan Williams | 45f43de | 2007-05-25 22:58:55 -0400 | [diff] [blame] | 281 | lbs_deb_enter(LBS_DEB_JOIN); | 
|  | 282 |  | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 283 | cmd->command = cpu_to_le16(CMD_802_11_AUTHENTICATE); | 
| Dan Williams | 6affe78 | 2007-05-10 22:56:42 -0400 | [diff] [blame] | 284 | cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_authenticate) | 
|  | 285 | + S_DS_GEN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 286 |  | 
| Dan Williams | 6affe78 | 2007-05-10 22:56:42 -0400 | [diff] [blame] | 287 | /* translate auth mode to 802.11 defined wire value */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 288 | switch (priv->secinfo.auth_mode) { | 
| Dan Williams | 6affe78 | 2007-05-10 22:56:42 -0400 | [diff] [blame] | 289 | case IW_AUTH_ALG_OPEN_SYSTEM: | 
|  | 290 | pauthenticate->authtype = 0x00; | 
|  | 291 | break; | 
|  | 292 | case IW_AUTH_ALG_SHARED_KEY: | 
|  | 293 | pauthenticate->authtype = 0x01; | 
|  | 294 | break; | 
|  | 295 | case IW_AUTH_ALG_LEAP: | 
|  | 296 | pauthenticate->authtype = 0x80; | 
|  | 297 | break; | 
|  | 298 | default: | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 299 | lbs_deb_join("AUTH_CMD: invalid auth alg 0x%X\n", | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 300 | priv->secinfo.auth_mode); | 
| Dan Williams | 6affe78 | 2007-05-10 22:56:42 -0400 | [diff] [blame] | 301 | goto out; | 
|  | 302 | } | 
|  | 303 |  | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 304 | memcpy(pauthenticate->macaddr, bssid, ETH_ALEN); | 
|  | 305 |  | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 306 | lbs_deb_join("AUTH_CMD: BSSID %s, auth 0x%x\n", | 
| Joe Perches | 0795af5 | 2007-10-03 17:59:30 -0700 | [diff] [blame] | 307 | print_mac(mac, bssid), pauthenticate->authtype); | 
| Dan Williams | 6affe78 | 2007-05-10 22:56:42 -0400 | [diff] [blame] | 308 | ret = 0; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 309 |  | 
| Dan Williams | 6affe78 | 2007-05-10 22:56:42 -0400 | [diff] [blame] | 310 | out: | 
| Dan Williams | 45f43de | 2007-05-25 22:58:55 -0400 | [diff] [blame] | 311 | lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret); | 
| Dan Williams | 6affe78 | 2007-05-10 22:56:42 -0400 | [diff] [blame] | 312 | return ret; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 313 | } | 
|  | 314 |  | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 315 | int lbs_cmd_80211_deauthenticate(struct lbs_private *priv, | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 316 | struct cmd_ds_command *cmd) | 
|  | 317 | { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 318 | struct cmd_ds_802_11_deauthenticate *dauth = &cmd->params.deauth; | 
|  | 319 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 320 | lbs_deb_enter(LBS_DEB_JOIN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 321 |  | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 322 | cmd->command = cpu_to_le16(CMD_802_11_DEAUTHENTICATE); | 
| David Woodhouse | 981f187 | 2007-05-25 23:36:54 -0400 | [diff] [blame] | 323 | cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_deauthenticate) + | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 324 | S_DS_GEN); | 
|  | 325 |  | 
|  | 326 | /* set AP MAC address */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 327 | memmove(dauth->macaddr, priv->curbssparams.bssid, ETH_ALEN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 328 |  | 
|  | 329 | /* Reason code 3 = Station is leaving */ | 
|  | 330 | #define REASON_CODE_STA_LEAVING 3 | 
|  | 331 | dauth->reasoncode = cpu_to_le16(REASON_CODE_STA_LEAVING); | 
|  | 332 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 333 | lbs_deb_leave(LBS_DEB_JOIN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 334 | return 0; | 
|  | 335 | } | 
|  | 336 |  | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 337 | int lbs_cmd_80211_associate(struct lbs_private *priv, | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 338 | struct cmd_ds_command *cmd, void *pdata_buf) | 
|  | 339 | { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 340 | struct cmd_ds_802_11_associate *passo = &cmd->params.associate; | 
|  | 341 | int ret = 0; | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 342 | struct assoc_request * assoc_req = pdata_buf; | 
|  | 343 | struct bss_descriptor * bss = &assoc_req->bss; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 344 | u8 *pos; | 
| David Woodhouse | 981f187 | 2007-05-25 23:36:54 -0400 | [diff] [blame] | 345 | u16 tmpcap, tmplen; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 346 | struct mrvlietypes_ssidparamset *ssid; | 
|  | 347 | struct mrvlietypes_phyparamset *phy; | 
|  | 348 | struct mrvlietypes_ssparamset *ss; | 
|  | 349 | struct mrvlietypes_ratesparamset *rates; | 
|  | 350 | struct mrvlietypes_rsnparamset *rsn; | 
|  | 351 |  | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 352 | lbs_deb_enter(LBS_DEB_ASSOC); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 353 |  | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 354 | pos = (u8 *) passo; | 
|  | 355 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 356 | if (!priv) { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 357 | ret = -1; | 
|  | 358 | goto done; | 
|  | 359 | } | 
|  | 360 |  | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 361 | cmd->command = cpu_to_le16(CMD_802_11_ASSOCIATE); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 362 |  | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 363 | memcpy(passo->peerstaaddr, bss->bssid, sizeof(passo->peerstaaddr)); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 364 | pos += sizeof(passo->peerstaaddr); | 
|  | 365 |  | 
|  | 366 | /* set the listen interval */ | 
| Holger Schurig | 0aabc0a5 | 2007-08-02 13:10:59 -0400 | [diff] [blame] | 367 | passo->listeninterval = cpu_to_le16(MRVDRV_DEFAULT_LISTEN_INTERVAL); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 368 |  | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 369 | pos += sizeof(passo->capability); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 370 | pos += sizeof(passo->listeninterval); | 
|  | 371 | pos += sizeof(passo->bcnperiod); | 
|  | 372 | pos += sizeof(passo->dtimperiod); | 
|  | 373 |  | 
|  | 374 | ssid = (struct mrvlietypes_ssidparamset *) pos; | 
|  | 375 | ssid->header.type = cpu_to_le16(TLV_TYPE_SSID); | 
| Dan Williams | d8efea2 | 2007-05-28 23:54:55 -0400 | [diff] [blame] | 376 | tmplen = bss->ssid_len; | 
| David Woodhouse | 707985b | 2007-05-25 23:41:16 -0400 | [diff] [blame] | 377 | ssid->header.len = cpu_to_le16(tmplen); | 
| Dan Williams | d8efea2 | 2007-05-28 23:54:55 -0400 | [diff] [blame] | 378 | memcpy(ssid->ssid, bss->ssid, tmplen); | 
| David Woodhouse | 707985b | 2007-05-25 23:41:16 -0400 | [diff] [blame] | 379 | pos += sizeof(ssid->header) + tmplen; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 380 |  | 
|  | 381 | phy = (struct mrvlietypes_phyparamset *) pos; | 
|  | 382 | phy->header.type = cpu_to_le16(TLV_TYPE_PHY_DS); | 
| David Woodhouse | 707985b | 2007-05-25 23:41:16 -0400 | [diff] [blame] | 383 | tmplen = sizeof(phy->fh_ds.dsparamset); | 
|  | 384 | phy->header.len = cpu_to_le16(tmplen); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 385 | memcpy(&phy->fh_ds.dsparamset, | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 386 | &bss->phyparamset.dsparamset.currentchan, | 
| David Woodhouse | 707985b | 2007-05-25 23:41:16 -0400 | [diff] [blame] | 387 | tmplen); | 
|  | 388 | pos += sizeof(phy->header) + tmplen; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 389 |  | 
|  | 390 | ss = (struct mrvlietypes_ssparamset *) pos; | 
|  | 391 | ss->header.type = cpu_to_le16(TLV_TYPE_CF); | 
| David Woodhouse | 707985b | 2007-05-25 23:41:16 -0400 | [diff] [blame] | 392 | tmplen = sizeof(ss->cf_ibss.cfparamset); | 
|  | 393 | ss->header.len = cpu_to_le16(tmplen); | 
|  | 394 | pos += sizeof(ss->header) + tmplen; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 395 |  | 
|  | 396 | rates = (struct mrvlietypes_ratesparamset *) pos; | 
|  | 397 | rates->header.type = cpu_to_le16(TLV_TYPE_RATES); | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 398 | memcpy(&rates->rates, &bss->rates, MAX_RATES); | 
|  | 399 | tmplen = MAX_RATES; | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 400 | if (get_common_rates(priv, rates->rates, &tmplen)) { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 401 | ret = -1; | 
|  | 402 | goto done; | 
|  | 403 | } | 
| David Woodhouse | 981f187 | 2007-05-25 23:36:54 -0400 | [diff] [blame] | 404 | pos += sizeof(rates->header) + tmplen; | 
|  | 405 | rates->header.len = cpu_to_le16(tmplen); | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 406 | lbs_deb_assoc("ASSOC_CMD: num rates %u\n", tmplen); | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 407 |  | 
|  | 408 | /* Copy the infra. association rates into Current BSS state structure */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 409 | memset(&priv->curbssparams.rates, 0, sizeof(priv->curbssparams.rates)); | 
|  | 410 | memcpy(&priv->curbssparams.rates, &rates->rates, tmplen); | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 411 |  | 
|  | 412 | /* Set MSB on basic rates as the firmware requires, but _after_ | 
|  | 413 | * copying to current bss rates. | 
|  | 414 | */ | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 415 | lbs_set_basic_rate_flags(rates->rates, tmplen); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 416 |  | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 417 | if (assoc_req->secinfo.WPAenabled || assoc_req->secinfo.WPA2enabled) { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 418 | rsn = (struct mrvlietypes_rsnparamset *) pos; | 
| David Woodhouse | 981f187 | 2007-05-25 23:36:54 -0400 | [diff] [blame] | 419 | /* WPA_IE or WPA2_IE */ | 
|  | 420 | rsn->header.type = cpu_to_le16((u16) assoc_req->wpa_ie[0]); | 
|  | 421 | tmplen = (u16) assoc_req->wpa_ie[1]; | 
|  | 422 | rsn->header.len = cpu_to_le16(tmplen); | 
|  | 423 | memcpy(rsn->rsnie, &assoc_req->wpa_ie[2], tmplen); | 
| Holger Schurig | ece5619 | 2007-08-02 11:53:06 -0400 | [diff] [blame] | 424 | lbs_deb_hex(LBS_DEB_JOIN, "ASSOC_CMD: RSN IE", (u8 *) rsn, | 
| David Woodhouse | 981f187 | 2007-05-25 23:36:54 -0400 | [diff] [blame] | 425 | sizeof(rsn->header) + tmplen); | 
|  | 426 | pos += sizeof(rsn->header) + tmplen; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 427 | } | 
|  | 428 |  | 
|  | 429 | /* update curbssparams */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 430 | priv->curbssparams.channel = bss->phyparamset.dsparamset.currentchan; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 431 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 432 | if (lbs_parse_dnld_countryinfo_11d(priv, bss)) { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 433 | ret = -1; | 
|  | 434 | goto done; | 
|  | 435 | } | 
|  | 436 |  | 
|  | 437 | cmd->size = cpu_to_le16((u16) (pos - (u8 *) passo) + S_DS_GEN); | 
|  | 438 |  | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 439 | /* set the capability info */ | 
|  | 440 | tmpcap = (bss->capability & CAPINFO_MASK); | 
|  | 441 | if (bss->mode == IW_MODE_INFRA) | 
|  | 442 | tmpcap |= WLAN_CAPABILITY_ESS; | 
|  | 443 | passo->capability = cpu_to_le16(tmpcap); | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 444 | lbs_deb_assoc("ASSOC_CMD: capability 0x%04x\n", tmpcap); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 445 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 446 | done: | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 447 | lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 448 | return ret; | 
|  | 449 | } | 
|  | 450 |  | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 451 | int lbs_cmd_80211_ad_hoc_start(struct lbs_private *priv, | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 452 | struct cmd_ds_command *cmd, void *pdata_buf) | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 453 | { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 454 | struct cmd_ds_802_11_ad_hoc_start *adhs = &cmd->params.ads; | 
|  | 455 | int ret = 0; | 
|  | 456 | int cmdappendsize = 0; | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 457 | struct assoc_request * assoc_req = pdata_buf; | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 458 | u16 tmpcap = 0; | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 459 | size_t ratesize = 0; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 460 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 461 | lbs_deb_enter(LBS_DEB_JOIN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 462 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 463 | if (!priv) { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 464 | ret = -1; | 
|  | 465 | goto done; | 
|  | 466 | } | 
|  | 467 |  | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 468 | cmd->command = cpu_to_le16(CMD_802_11_AD_HOC_START); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 469 |  | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 470 | /* | 
|  | 471 | * Fill in the parameters for 2 data structures: | 
|  | 472 | *   1. cmd_ds_802_11_ad_hoc_start command | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 473 | *   2. priv->scantable[i] | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 474 | * | 
|  | 475 | * Driver will fill up SSID, bsstype,IBSS param, Physical Param, | 
|  | 476 | *   probe delay, and cap info. | 
|  | 477 | * | 
|  | 478 | * Firmware will fill up beacon period, DTIM, Basic rates | 
|  | 479 | *   and operational rates. | 
|  | 480 | */ | 
|  | 481 |  | 
| Dan Williams | b44898e | 2007-08-02 11:18:40 -0400 | [diff] [blame] | 482 | memset(adhs->ssid, 0, IW_ESSID_MAX_SIZE); | 
|  | 483 | memcpy(adhs->ssid, assoc_req->ssid, assoc_req->ssid_len); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 484 |  | 
| Dan Williams | d8efea2 | 2007-05-28 23:54:55 -0400 | [diff] [blame] | 485 | lbs_deb_join("ADHOC_S_CMD: SSID '%s', ssid length %u\n", | 
|  | 486 | escape_essid(assoc_req->ssid, assoc_req->ssid_len), | 
|  | 487 | assoc_req->ssid_len); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 488 |  | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 489 | /* set the BSS type */ | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 490 | adhs->bsstype = CMD_BSS_TYPE_IBSS; | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 491 | priv->mode = IW_MODE_ADHOC; | 
|  | 492 | if (priv->beacon_period == 0) | 
|  | 493 | priv->beacon_period = MRVDRV_BEACON_INTERVAL; | 
|  | 494 | adhs->beaconperiod = cpu_to_le16(priv->beacon_period); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 495 |  | 
|  | 496 | /* set Physical param set */ | 
|  | 497 | #define DS_PARA_IE_ID   3 | 
|  | 498 | #define DS_PARA_IE_LEN  1 | 
|  | 499 |  | 
|  | 500 | adhs->phyparamset.dsparamset.elementid = DS_PARA_IE_ID; | 
|  | 501 | adhs->phyparamset.dsparamset.len = DS_PARA_IE_LEN; | 
|  | 502 |  | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 503 | WARN_ON(!assoc_req->channel); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 504 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 505 | lbs_deb_join("ADHOC_S_CMD: Creating ADHOC on channel %d\n", | 
| David Woodhouse | 981f187 | 2007-05-25 23:36:54 -0400 | [diff] [blame] | 506 | assoc_req->channel); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 507 |  | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 508 | adhs->phyparamset.dsparamset.currentchan = assoc_req->channel; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 509 |  | 
|  | 510 | /* set IBSS param set */ | 
|  | 511 | #define IBSS_PARA_IE_ID   6 | 
|  | 512 | #define IBSS_PARA_IE_LEN  2 | 
|  | 513 |  | 
|  | 514 | adhs->ssparamset.ibssparamset.elementid = IBSS_PARA_IE_ID; | 
|  | 515 | adhs->ssparamset.ibssparamset.len = IBSS_PARA_IE_LEN; | 
| Holger Schurig | ae596ce | 2007-08-02 13:10:05 -0400 | [diff] [blame] | 516 | adhs->ssparamset.ibssparamset.atimwindow = 0; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 517 |  | 
|  | 518 | /* set capability info */ | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 519 | tmpcap = WLAN_CAPABILITY_IBSS; | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 520 | if (assoc_req->secinfo.wep_enabled) { | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 521 | lbs_deb_join("ADHOC_S_CMD: WEP enabled, setting privacy on\n"); | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 522 | tmpcap |= WLAN_CAPABILITY_PRIVACY; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 523 | } else { | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 524 | lbs_deb_join("ADHOC_S_CMD: WEP disabled, setting privacy off\n"); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 525 | } | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 526 | adhs->capability = cpu_to_le16(tmpcap); | 
|  | 527 |  | 
|  | 528 | /* probedelay */ | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 529 | adhs->probedelay = cpu_to_le16(CMD_SCAN_PROBE_DELAY_TIME); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 530 |  | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 531 | memset(adhs->rates, 0, sizeof(adhs->rates)); | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 532 | ratesize = min(sizeof(adhs->rates), sizeof(lbs_bg_rates)); | 
|  | 533 | memcpy(adhs->rates, lbs_bg_rates, ratesize); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 534 |  | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 535 | /* Copy the ad-hoc creating rates into Current BSS state structure */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 536 | memset(&priv->curbssparams.rates, 0, sizeof(priv->curbssparams.rates)); | 
|  | 537 | memcpy(&priv->curbssparams.rates, &adhs->rates, ratesize); | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 538 |  | 
|  | 539 | /* Set MSB on basic rates as the firmware requires, but _after_ | 
|  | 540 | * copying to current bss rates. | 
|  | 541 | */ | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 542 | lbs_set_basic_rate_flags(adhs->rates, ratesize); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 543 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 544 | lbs_deb_join("ADHOC_S_CMD: rates=%02x %02x %02x %02x \n", | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 545 | adhs->rates[0], adhs->rates[1], adhs->rates[2], adhs->rates[3]); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 546 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 547 | lbs_deb_join("ADHOC_S_CMD: AD HOC Start command is ready\n"); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 548 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 549 | if (lbs_create_dnld_countryinfo_11d(priv)) { | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 550 | lbs_deb_join("ADHOC_S_CMD: dnld_countryinfo_11d failed\n"); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 551 | ret = -1; | 
|  | 552 | goto done; | 
|  | 553 | } | 
|  | 554 |  | 
| David Woodhouse | 981f187 | 2007-05-25 23:36:54 -0400 | [diff] [blame] | 555 | cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_ad_hoc_start) + | 
|  | 556 | S_DS_GEN + cmdappendsize); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 557 |  | 
|  | 558 | ret = 0; | 
|  | 559 | done: | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 560 | lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 561 | return ret; | 
|  | 562 | } | 
|  | 563 |  | 
| Holger Schurig | e98a88d | 2008-03-19 14:25:58 +0100 | [diff] [blame^] | 564 | int lbs_cmd_80211_ad_hoc_stop(struct cmd_ds_command *cmd) | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 565 | { | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 566 | cmd->command = cpu_to_le16(CMD_802_11_AD_HOC_STOP); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 567 | cmd->size = cpu_to_le16(S_DS_GEN); | 
|  | 568 |  | 
|  | 569 | return 0; | 
|  | 570 | } | 
|  | 571 |  | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 572 | int lbs_cmd_80211_ad_hoc_join(struct lbs_private *priv, | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 573 | struct cmd_ds_command *cmd, void *pdata_buf) | 
|  | 574 | { | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 575 | struct cmd_ds_802_11_ad_hoc_join *join_cmd = &cmd->params.adj; | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 576 | struct assoc_request * assoc_req = pdata_buf; | 
|  | 577 | struct bss_descriptor *bss = &assoc_req->bss; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 578 | int cmdappendsize = 0; | 
|  | 579 | int ret = 0; | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 580 | u16 ratesize = 0; | 
| Joe Perches | 0795af5 | 2007-10-03 17:59:30 -0700 | [diff] [blame] | 581 | DECLARE_MAC_BUF(mac); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 582 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 583 | lbs_deb_enter(LBS_DEB_JOIN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 584 |  | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 585 | cmd->command = cpu_to_le16(CMD_802_11_AD_HOC_JOIN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 586 |  | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 587 | join_cmd->bss.type = CMD_BSS_TYPE_IBSS; | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 588 | join_cmd->bss.beaconperiod = cpu_to_le16(bss->beaconperiod); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 589 |  | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 590 | memcpy(&join_cmd->bss.bssid, &bss->bssid, ETH_ALEN); | 
|  | 591 | memcpy(&join_cmd->bss.ssid, &bss->ssid, bss->ssid_len); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 592 |  | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 593 | memcpy(&join_cmd->bss.phyparamset, &bss->phyparamset, | 
|  | 594 | sizeof(union ieeetypes_phyparamset)); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 595 |  | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 596 | memcpy(&join_cmd->bss.ssparamset, &bss->ssparamset, | 
|  | 597 | sizeof(union IEEEtypes_ssparamset)); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 598 |  | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 599 | join_cmd->bss.capability = cpu_to_le16(bss->capability & CAPINFO_MASK); | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 600 | lbs_deb_join("ADHOC_J_CMD: tmpcap=%4X CAPINFO_MASK=%4X\n", | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 601 | bss->capability, CAPINFO_MASK); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 602 |  | 
|  | 603 | /* information on BSSID descriptor passed to FW */ | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 604 | lbs_deb_join( | 
| Joe Perches | 0795af5 | 2007-10-03 17:59:30 -0700 | [diff] [blame] | 605 | "ADHOC_J_CMD: BSSID = %s, SSID = '%s'\n", | 
|  | 606 | print_mac(mac, join_cmd->bss.bssid), | 
|  | 607 | join_cmd->bss.ssid); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 608 |  | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 609 | /* failtimeout */ | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 610 | join_cmd->failtimeout = cpu_to_le16(MRVDRV_ASSOCIATION_TIME_OUT); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 611 |  | 
|  | 612 | /* probedelay */ | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 613 | join_cmd->probedelay = cpu_to_le16(CMD_SCAN_PROBE_DELAY_TIME); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 614 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 615 | priv->curbssparams.channel = bss->channel; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 616 |  | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 617 | /* Copy Data rates from the rates recorded in scan response */ | 
|  | 618 | memset(join_cmd->bss.rates, 0, sizeof(join_cmd->bss.rates)); | 
|  | 619 | ratesize = min_t(u16, sizeof(join_cmd->bss.rates), MAX_RATES); | 
|  | 620 | memcpy(join_cmd->bss.rates, bss->rates, ratesize); | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 621 | if (get_common_rates(priv, join_cmd->bss.rates, &ratesize)) { | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 622 | lbs_deb_join("ADHOC_J_CMD: get_common_rates returns error.\n"); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 623 | ret = -1; | 
|  | 624 | goto done; | 
|  | 625 | } | 
|  | 626 |  | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 627 | /* Copy the ad-hoc creating rates into Current BSS state structure */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 628 | memset(&priv->curbssparams.rates, 0, sizeof(priv->curbssparams.rates)); | 
|  | 629 | memcpy(&priv->curbssparams.rates, join_cmd->bss.rates, ratesize); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 630 |  | 
| Dan Williams | 8c51276 | 2007-08-02 11:40:45 -0400 | [diff] [blame] | 631 | /* Set MSB on basic rates as the firmware requires, but _after_ | 
|  | 632 | * copying to current bss rates. | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 633 | */ | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 634 | lbs_set_basic_rate_flags(join_cmd->bss.rates, ratesize); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 635 |  | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 636 | join_cmd->bss.ssparamset.ibssparamset.atimwindow = | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 637 | cpu_to_le16(bss->atimwindow); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 638 |  | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 639 | if (assoc_req->secinfo.wep_enabled) { | 
| Dan Williams | 0c9ca69 | 2007-08-02 10:43:44 -0400 | [diff] [blame] | 640 | u16 tmp = le16_to_cpu(join_cmd->bss.capability); | 
|  | 641 | tmp |= WLAN_CAPABILITY_PRIVACY; | 
|  | 642 | join_cmd->bss.capability = cpu_to_le16(tmp); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 643 | } | 
|  | 644 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 645 | if (priv->psmode == LBS802_11POWERMODEMAX_PSP) { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 646 | /* wake up first */ | 
| David Woodhouse | 981f187 | 2007-05-25 23:36:54 -0400 | [diff] [blame] | 647 | __le32 Localpsmode; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 648 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 649 | Localpsmode = cpu_to_le32(LBS802_11POWERMODECAM); | 
|  | 650 | ret = lbs_prepare_and_send_command(priv, | 
| Dan Williams | 0aef64d | 2007-08-02 11:31:18 -0400 | [diff] [blame] | 651 | CMD_802_11_PS_MODE, | 
|  | 652 | CMD_ACT_SET, | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 653 | 0, 0, &Localpsmode); | 
|  | 654 |  | 
|  | 655 | if (ret) { | 
|  | 656 | ret = -1; | 
|  | 657 | goto done; | 
|  | 658 | } | 
|  | 659 | } | 
|  | 660 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 661 | if (lbs_parse_dnld_countryinfo_11d(priv, bss)) { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 662 | ret = -1; | 
|  | 663 | goto done; | 
|  | 664 | } | 
|  | 665 |  | 
| David Woodhouse | 981f187 | 2007-05-25 23:36:54 -0400 | [diff] [blame] | 666 | cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_ad_hoc_join) + | 
|  | 667 | S_DS_GEN + cmdappendsize); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 668 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 669 | done: | 
|  | 670 | lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 671 | return ret; | 
|  | 672 | } | 
|  | 673 |  | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 674 | int lbs_ret_80211_associate(struct lbs_private *priv, | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 675 | struct cmd_ds_command *resp) | 
|  | 676 | { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 677 | int ret = 0; | 
|  | 678 | union iwreq_data wrqu; | 
|  | 679 | struct ieeetypes_assocrsp *passocrsp; | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 680 | struct bss_descriptor * bss; | 
| Dan Williams | c7fdf26 | 2007-08-02 13:20:29 -0400 | [diff] [blame] | 681 | u16 status_code; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 682 |  | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 683 | lbs_deb_enter(LBS_DEB_ASSOC); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 684 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 685 | if (!priv->in_progress_assoc_req) { | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 686 | lbs_deb_assoc("ASSOC_RESP: no in-progress assoc request\n"); | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 687 | ret = -1; | 
|  | 688 | goto done; | 
|  | 689 | } | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 690 | bss = &priv->in_progress_assoc_req->bss; | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 691 |  | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 692 | passocrsp = (struct ieeetypes_assocrsp *) & resp->params; | 
|  | 693 |  | 
| Dan Williams | c7fdf26 | 2007-08-02 13:20:29 -0400 | [diff] [blame] | 694 | /* | 
|  | 695 | * Older FW versions map the IEEE 802.11 Status Code in the association | 
|  | 696 | * response to the following values returned in passocrsp->statuscode: | 
|  | 697 | * | 
|  | 698 | *    IEEE Status Code                Marvell Status Code | 
|  | 699 | *    0                       ->      0x0000 ASSOC_RESULT_SUCCESS | 
|  | 700 | *    13                      ->      0x0004 ASSOC_RESULT_AUTH_REFUSED | 
|  | 701 | *    14                      ->      0x0004 ASSOC_RESULT_AUTH_REFUSED | 
|  | 702 | *    15                      ->      0x0004 ASSOC_RESULT_AUTH_REFUSED | 
|  | 703 | *    16                      ->      0x0004 ASSOC_RESULT_AUTH_REFUSED | 
|  | 704 | *    others                  ->      0x0003 ASSOC_RESULT_REFUSED | 
|  | 705 | * | 
|  | 706 | * Other response codes: | 
|  | 707 | *    0x0001 -> ASSOC_RESULT_INVALID_PARAMETERS (unused) | 
|  | 708 | *    0x0002 -> ASSOC_RESULT_TIMEOUT (internal timer expired waiting for | 
|  | 709 | *                                    association response from the AP) | 
|  | 710 | */ | 
|  | 711 |  | 
|  | 712 | status_code = le16_to_cpu(passocrsp->statuscode); | 
|  | 713 | switch (status_code) { | 
|  | 714 | case 0x00: | 
| Dan Williams | c7fdf26 | 2007-08-02 13:20:29 -0400 | [diff] [blame] | 715 | break; | 
|  | 716 | case 0x01: | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 717 | lbs_deb_assoc("ASSOC_RESP: invalid parameters\n"); | 
| Dan Williams | c7fdf26 | 2007-08-02 13:20:29 -0400 | [diff] [blame] | 718 | break; | 
|  | 719 | case 0x02: | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 720 | lbs_deb_assoc("ASSOC_RESP: internal timer " | 
|  | 721 | "expired while waiting for the AP\n"); | 
| Dan Williams | c7fdf26 | 2007-08-02 13:20:29 -0400 | [diff] [blame] | 722 | break; | 
|  | 723 | case 0x03: | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 724 | lbs_deb_assoc("ASSOC_RESP: association " | 
|  | 725 | "refused by AP\n"); | 
| Dan Williams | c7fdf26 | 2007-08-02 13:20:29 -0400 | [diff] [blame] | 726 | break; | 
|  | 727 | case 0x04: | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 728 | lbs_deb_assoc("ASSOC_RESP: authentication " | 
|  | 729 | "refused by AP\n"); | 
| Dan Williams | c7fdf26 | 2007-08-02 13:20:29 -0400 | [diff] [blame] | 730 | break; | 
|  | 731 | default: | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 732 | lbs_deb_assoc("ASSOC_RESP: failure reason 0x%02x " | 
|  | 733 | " unknown\n", status_code); | 
| Dan Williams | c7fdf26 | 2007-08-02 13:20:29 -0400 | [diff] [blame] | 734 | break; | 
|  | 735 | } | 
|  | 736 |  | 
|  | 737 | if (status_code) { | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 738 | lbs_mac_event_disconnected(priv); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 739 | ret = -1; | 
|  | 740 | goto done; | 
|  | 741 | } | 
|  | 742 |  | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 743 | lbs_deb_hex(LBS_DEB_ASSOC, "ASSOC_RESP", (void *)&resp->params, | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 744 | le16_to_cpu(resp->size) - S_DS_GEN); | 
|  | 745 |  | 
|  | 746 | /* Send a Media Connected event, according to the Spec */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 747 | priv->connect_status = LBS_CONNECTED; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 748 |  | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 749 | /* Update current SSID and BSSID */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 750 | memcpy(&priv->curbssparams.ssid, &bss->ssid, IW_ESSID_MAX_SIZE); | 
|  | 751 | priv->curbssparams.ssid_len = bss->ssid_len; | 
|  | 752 | memcpy(priv->curbssparams.bssid, bss->bssid, ETH_ALEN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 753 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 754 | priv->SNR[TYPE_RXPD][TYPE_AVG] = 0; | 
|  | 755 | priv->NF[TYPE_RXPD][TYPE_AVG] = 0; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 756 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 757 | memset(priv->rawSNR, 0x00, sizeof(priv->rawSNR)); | 
|  | 758 | memset(priv->rawNF, 0x00, sizeof(priv->rawNF)); | 
|  | 759 | priv->nextSNRNF = 0; | 
|  | 760 | priv->numSNRNF = 0; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 761 |  | 
| Holger Schurig | 634b8f4 | 2007-05-25 13:05:16 -0400 | [diff] [blame] | 762 | netif_carrier_on(priv->dev); | 
| David Woodhouse | a27b9f9 | 2007-12-12 00:41:51 -0500 | [diff] [blame] | 763 | if (!priv->tx_pending_len) | 
|  | 764 | netif_wake_queue(priv->dev); | 
| Javier Cardona | 51d84f5 | 2007-05-25 12:06:56 -0400 | [diff] [blame] | 765 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 766 | memcpy(wrqu.ap_addr.sa_data, priv->curbssparams.bssid, ETH_ALEN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 767 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; | 
| Holger Schurig | 634b8f4 | 2007-05-25 13:05:16 -0400 | [diff] [blame] | 768 | wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 769 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 770 | done: | 
| Holger Schurig | 9184346 | 2007-11-28 14:05:02 +0100 | [diff] [blame] | 771 | lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 772 | return ret; | 
|  | 773 | } | 
|  | 774 |  | 
| Holger Schurig | e98a88d | 2008-03-19 14:25:58 +0100 | [diff] [blame^] | 775 | int lbs_ret_80211_disassociate(struct lbs_private *priv) | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 776 | { | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 777 | lbs_deb_enter(LBS_DEB_JOIN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 778 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 779 | lbs_mac_event_disconnected(priv); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 780 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 781 | lbs_deb_leave(LBS_DEB_JOIN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 782 | return 0; | 
|  | 783 | } | 
|  | 784 |  | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 785 | int lbs_ret_80211_ad_hoc_start(struct lbs_private *priv, | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 786 | struct cmd_ds_command *resp) | 
|  | 787 | { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 788 | int ret = 0; | 
|  | 789 | u16 command = le16_to_cpu(resp->command); | 
|  | 790 | u16 result = le16_to_cpu(resp->result); | 
|  | 791 | struct cmd_ds_802_11_ad_hoc_result *padhocresult; | 
|  | 792 | union iwreq_data wrqu; | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 793 | struct bss_descriptor *bss; | 
| Joe Perches | 0795af5 | 2007-10-03 17:59:30 -0700 | [diff] [blame] | 794 | DECLARE_MAC_BUF(mac); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 795 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 796 | lbs_deb_enter(LBS_DEB_JOIN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 797 |  | 
|  | 798 | padhocresult = &resp->params.result; | 
|  | 799 |  | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 800 | lbs_deb_join("ADHOC_RESP: size = %d\n", le16_to_cpu(resp->size)); | 
|  | 801 | lbs_deb_join("ADHOC_RESP: command = %x\n", command); | 
|  | 802 | lbs_deb_join("ADHOC_RESP: result = %x\n", result); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 803 |  | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 804 | if (!priv->in_progress_assoc_req) { | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 805 | lbs_deb_join("ADHOC_RESP: no in-progress association request\n"); | 
|  | 806 | ret = -1; | 
|  | 807 | goto done; | 
|  | 808 | } | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 809 | bss = &priv->in_progress_assoc_req->bss; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 810 |  | 
|  | 811 | /* | 
|  | 812 | * Join result code 0 --> SUCCESS | 
|  | 813 | */ | 
|  | 814 | if (result) { | 
| Dan Williams | e76850d | 2007-05-25 17:09:41 -0400 | [diff] [blame] | 815 | lbs_deb_join("ADHOC_RESP: failed\n"); | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 816 | if (priv->connect_status == LBS_CONNECTED) { | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 817 | lbs_mac_event_disconnected(priv); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 818 | } | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 819 | ret = -1; | 
|  | 820 | goto done; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 821 | } | 
|  | 822 |  | 
|  | 823 | /* | 
|  | 824 | * Now the join cmd should be successful | 
|  | 825 | * If BSSID has changed use SSID to compare instead of BSSID | 
|  | 826 | */ | 
| Dan Williams | d8efea2 | 2007-05-28 23:54:55 -0400 | [diff] [blame] | 827 | lbs_deb_join("ADHOC_RESP: associated to '%s'\n", | 
|  | 828 | escape_essid(bss->ssid, bss->ssid_len)); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 829 |  | 
|  | 830 | /* Send a Media Connected event, according to the Spec */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 831 | priv->connect_status = LBS_CONNECTED; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 832 |  | 
| Holger Schurig | 6b63cd0 | 2007-08-02 11:53:36 -0400 | [diff] [blame] | 833 | if (command == CMD_RET(CMD_802_11_AD_HOC_START)) { | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 834 | /* Update the created network descriptor with the new BSSID */ | 
| Dan Williams | ea8da92 | 2007-08-02 11:18:23 -0400 | [diff] [blame] | 835 | memcpy(bss->bssid, padhocresult->bssid, ETH_ALEN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 836 | } | 
|  | 837 |  | 
|  | 838 | /* Set the BSSID from the joined/started descriptor */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 839 | memcpy(&priv->curbssparams.bssid, bss->bssid, ETH_ALEN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 840 |  | 
|  | 841 | /* Set the new SSID to current SSID */ | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 842 | memcpy(&priv->curbssparams.ssid, &bss->ssid, IW_ESSID_MAX_SIZE); | 
|  | 843 | priv->curbssparams.ssid_len = bss->ssid_len; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 844 |  | 
| Holger Schurig | 634b8f4 | 2007-05-25 13:05:16 -0400 | [diff] [blame] | 845 | netif_carrier_on(priv->dev); | 
| David Woodhouse | a27b9f9 | 2007-12-12 00:41:51 -0500 | [diff] [blame] | 846 | if (!priv->tx_pending_len) | 
|  | 847 | netif_wake_queue(priv->dev); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 848 |  | 
|  | 849 | memset(&wrqu, 0, sizeof(wrqu)); | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 850 | memcpy(wrqu.ap_addr.sa_data, priv->curbssparams.bssid, ETH_ALEN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 851 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; | 
| Holger Schurig | 634b8f4 | 2007-05-25 13:05:16 -0400 | [diff] [blame] | 852 | wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 853 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 854 | lbs_deb_join("ADHOC_RESP: - Joined/Started Ad Hoc\n"); | 
| David Woodhouse | aa21c00 | 2007-12-08 20:04:36 +0000 | [diff] [blame] | 855 | lbs_deb_join("ADHOC_RESP: channel = %d\n", priv->curbssparams.channel); | 
| Joe Perches | 0795af5 | 2007-10-03 17:59:30 -0700 | [diff] [blame] | 856 | lbs_deb_join("ADHOC_RESP: BSSID = %s\n", | 
|  | 857 | print_mac(mac, padhocresult->bssid)); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 858 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 859 | done: | 
|  | 860 | lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 861 | return ret; | 
|  | 862 | } | 
|  | 863 |  | 
| Holger Schurig | e98a88d | 2008-03-19 14:25:58 +0100 | [diff] [blame^] | 864 | int lbs_ret_80211_ad_hoc_stop(struct lbs_private *priv) | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 865 | { | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 866 | lbs_deb_enter(LBS_DEB_JOIN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 867 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 868 | lbs_mac_event_disconnected(priv); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 869 |  | 
| Holger Schurig | 9012b28 | 2007-05-25 11:27:16 -0400 | [diff] [blame] | 870 | lbs_deb_leave(LBS_DEB_JOIN); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 871 | return 0; | 
|  | 872 | } |