nl80211.c (7c1e51a34afb110a010a73141a2b5f000f798875) nl80211.c (804483e90794256f9ed53e795ffbf1e94de237c8)
1/*
2 * This is the new netlink-based wireless configuration interface.
3 *
4 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
5 */
6
7#include <linux/if.h>
8#include <linux/module.h>

--- 190 unchanged lines hidden (view full) ---

199 [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
200 .len = IEEE80211_MAX_DATA_LEN },
201 [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 },
202 [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG },
203 [NL80211_ATTR_HT_CAPABILITY_MASK] = {
204 .len = NL80211_HT_CAPABILITY_LEN
205 },
206 [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 },
1/*
2 * This is the new netlink-based wireless configuration interface.
3 *
4 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
5 */
6
7#include <linux/if.h>
8#include <linux/module.h>

--- 190 unchanged lines hidden (view full) ---

199 [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
200 .len = IEEE80211_MAX_DATA_LEN },
201 [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 },
202 [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG },
203 [NL80211_ATTR_HT_CAPABILITY_MASK] = {
204 .len = NL80211_HT_CAPABILITY_LEN
205 },
206 [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 },
207 [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 },
207};
208
209/* policy for the key attributes */
210static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
211 [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
212 [NL80211_KEY_IDX] = { .type = NLA_U8 },
213 [NL80211_KEY_CIPHER] = { .type = NLA_U32 },
214 [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },

--- 1994 unchanged lines hidden (view full) ---

2209 } else
2210 params.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
2211
2212 err = nl80211_crypto_settings(rdev, info, &params.crypto,
2213 NL80211_MAX_NR_CIPHER_SUITES);
2214 if (err)
2215 return err;
2216
208};
209
210/* policy for the key attributes */
211static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
212 [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
213 [NL80211_KEY_IDX] = { .type = NLA_U8 },
214 [NL80211_KEY_CIPHER] = { .type = NLA_U32 },
215 [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },

--- 1994 unchanged lines hidden (view full) ---

2210 } else
2211 params.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
2212
2213 err = nl80211_crypto_settings(rdev, info, &params.crypto,
2214 NL80211_MAX_NR_CIPHER_SUITES);
2215 if (err)
2216 return err;
2217
2218 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) {
2219 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER))
2220 return -EOPNOTSUPP;
2221 params.inactivity_timeout = nla_get_u16(
2222 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]);
2223 }
2224
2217 err = rdev->ops->start_ap(&rdev->wiphy, dev, &params);
2218 if (!err)
2219 wdev->beacon_interval = params.beacon_interval;
2220 return err;
2221}
2222
2223static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
2224{

--- 1060 unchanged lines hidden (view full) ---

3285 NLA_PUT_U8(msg, NL80211_MESHCONF_HWMP_ROOTMODE,
3286 cur_params.dot11MeshHWMPRootMode);
3287 NLA_PUT_U16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
3288 cur_params.dot11MeshHWMPRannInterval);
3289 NLA_PUT_U8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
3290 cur_params.dot11MeshGateAnnouncementProtocol);
3291 NLA_PUT_U8(msg, NL80211_MESHCONF_FORWARDING,
3292 cur_params.dot11MeshForwarding);
2225 err = rdev->ops->start_ap(&rdev->wiphy, dev, &params);
2226 if (!err)
2227 wdev->beacon_interval = params.beacon_interval;
2228 return err;
2229}
2230
2231static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
2232{

--- 1060 unchanged lines hidden (view full) ---

3293 NLA_PUT_U8(msg, NL80211_MESHCONF_HWMP_ROOTMODE,
3294 cur_params.dot11MeshHWMPRootMode);
3295 NLA_PUT_U16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
3296 cur_params.dot11MeshHWMPRannInterval);
3297 NLA_PUT_U8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
3298 cur_params.dot11MeshGateAnnouncementProtocol);
3299 NLA_PUT_U8(msg, NL80211_MESHCONF_FORWARDING,
3300 cur_params.dot11MeshForwarding);
3301 NLA_PUT_U32(msg, NL80211_MESHCONF_RSSI_THRESHOLD,
3302 cur_params.rssi_threshold);
3293 nla_nest_end(msg, pinfoattr);
3294 genlmsg_end(msg, hdr);
3295 return genlmsg_reply(msg, info);
3296
3297 nla_put_failure:
3298 genlmsg_cancel(msg, hdr);
3299 out:
3300 nlmsg_free(msg);

--- 16 unchanged lines hidden (view full) ---

3317 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
3318 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = { .type = NLA_U16 },
3319 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = { .type = NLA_U16 },
3320 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = { .type = NLA_U16 },
3321 [NL80211_MESHCONF_HWMP_ROOTMODE] = { .type = NLA_U8 },
3322 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = { .type = NLA_U16 },
3323 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = { .type = NLA_U8 },
3324 [NL80211_MESHCONF_FORWARDING] = { .type = NLA_U8 },
3303 nla_nest_end(msg, pinfoattr);
3304 genlmsg_end(msg, hdr);
3305 return genlmsg_reply(msg, info);
3306
3307 nla_put_failure:
3308 genlmsg_cancel(msg, hdr);
3309 out:
3310 nlmsg_free(msg);

--- 16 unchanged lines hidden (view full) ---

3327 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
3328 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = { .type = NLA_U16 },
3329 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = { .type = NLA_U16 },
3330 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = { .type = NLA_U16 },
3331 [NL80211_MESHCONF_HWMP_ROOTMODE] = { .type = NLA_U8 },
3332 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = { .type = NLA_U16 },
3333 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = { .type = NLA_U8 },
3334 [NL80211_MESHCONF_FORWARDING] = { .type = NLA_U8 },
3335 [NL80211_MESHCONF_RSSI_THRESHOLD] = { .type = NLA_U32},
3325};
3326
3327static const struct nla_policy
3328 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
3329 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
3330 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
3331 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
3332 [NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY,

--- 75 unchanged lines hidden (view full) ---

3408 NL80211_MESHCONF_HWMP_RANN_INTERVAL,
3409 nla_get_u16);
3410 FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
3411 dot11MeshGateAnnouncementProtocol, mask,
3412 NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
3413 nla_get_u8);
3414 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding,
3415 mask, NL80211_MESHCONF_FORWARDING, nla_get_u8);
3336};
3337
3338static const struct nla_policy
3339 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
3340 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
3341 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
3342 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
3343 [NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY,

--- 75 unchanged lines hidden (view full) ---

3419 NL80211_MESHCONF_HWMP_RANN_INTERVAL,
3420 nla_get_u16);
3421 FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
3422 dot11MeshGateAnnouncementProtocol, mask,
3423 NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
3424 nla_get_u8);
3425 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding,
3426 mask, NL80211_MESHCONF_FORWARDING, nla_get_u8);
3427 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold,
3428 mask, NL80211_MESHCONF_RSSI_THRESHOLD, nla_get_u32);
3416 if (mask_out)
3417 *mask_out = mask;
3418
3419 return 0;
3420
3421#undef FILL_IN_MESH_PARAM_IF_SET
3422}
3423

--- 4244 unchanged lines hidden (view full) ---

7668{
7669 return __nl80211_unexpected_frame(dev,
7670 NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
7671 addr, gfp);
7672}
7673
7674int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
7675 struct net_device *netdev, u32 nlpid,
3429 if (mask_out)
3430 *mask_out = mask;
3431
3432 return 0;
3433
3434#undef FILL_IN_MESH_PARAM_IF_SET
3435}
3436

--- 4244 unchanged lines hidden (view full) ---

7681{
7682 return __nl80211_unexpected_frame(dev,
7683 NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
7684 addr, gfp);
7685}
7686
7687int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
7688 struct net_device *netdev, u32 nlpid,
7676 int freq, const u8 *buf, size_t len, gfp_t gfp)
7689 int freq, int sig_dbm,
7690 const u8 *buf, size_t len, gfp_t gfp)
7677{
7678 struct sk_buff *msg;
7679 void *hdr;
7680
7681 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
7682 if (!msg)
7683 return -ENOMEM;
7684
7685 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
7686 if (!hdr) {
7687 nlmsg_free(msg);
7688 return -ENOMEM;
7689 }
7690
7691 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
7692 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
7693 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
7691{
7692 struct sk_buff *msg;
7693 void *hdr;
7694
7695 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
7696 if (!msg)
7697 return -ENOMEM;
7698
7699 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
7700 if (!hdr) {
7701 nlmsg_free(msg);
7702 return -ENOMEM;
7703 }
7704
7705 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
7706 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
7707 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
7708 if (sig_dbm)
7709 NLA_PUT_U32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm);
7694 NLA_PUT(msg, NL80211_ATTR_FRAME, len, buf);
7695
7696 genlmsg_end(msg, hdr);
7697
7698 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlpid);
7699
7700 nla_put_failure:
7701 genlmsg_cancel(msg, hdr);

--- 245 unchanged lines hidden (view full) ---

7947 nla_put_failure:
7948 genlmsg_cancel(msg, hdr);
7949 nlmsg_free(msg);
7950}
7951EXPORT_SYMBOL(cfg80211_probe_status);
7952
7953void cfg80211_report_obss_beacon(struct wiphy *wiphy,
7954 const u8 *frame, size_t len,
7710 NLA_PUT(msg, NL80211_ATTR_FRAME, len, buf);
7711
7712 genlmsg_end(msg, hdr);
7713
7714 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlpid);
7715
7716 nla_put_failure:
7717 genlmsg_cancel(msg, hdr);

--- 245 unchanged lines hidden (view full) ---

7963 nla_put_failure:
7964 genlmsg_cancel(msg, hdr);
7965 nlmsg_free(msg);
7966}
7967EXPORT_SYMBOL(cfg80211_probe_status);
7968
7969void cfg80211_report_obss_beacon(struct wiphy *wiphy,
7970 const u8 *frame, size_t len,
7955 int freq, gfp_t gfp)
7971 int freq, int sig_dbm, gfp_t gfp)
7956{
7957 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
7958 struct sk_buff *msg;
7959 void *hdr;
7960 u32 nlpid = ACCESS_ONCE(rdev->ap_beacons_nlpid);
7961
7962 if (!nlpid)
7963 return;

--- 6 unchanged lines hidden (view full) ---

7970 if (!hdr) {
7971 nlmsg_free(msg);
7972 return;
7973 }
7974
7975 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
7976 if (freq)
7977 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
7972{
7973 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
7974 struct sk_buff *msg;
7975 void *hdr;
7976 u32 nlpid = ACCESS_ONCE(rdev->ap_beacons_nlpid);
7977
7978 if (!nlpid)
7979 return;

--- 6 unchanged lines hidden (view full) ---

7986 if (!hdr) {
7987 nlmsg_free(msg);
7988 return;
7989 }
7990
7991 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
7992 if (freq)
7993 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
7994 if (sig_dbm)
7995 NLA_PUT_U32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm);
7978 NLA_PUT(msg, NL80211_ATTR_FRAME, len, frame);
7979
7980 genlmsg_end(msg, hdr);
7981
7982 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlpid);
7983 return;
7984
7985 nla_put_failure:

--- 82 unchanged lines hidden ---
7996 NLA_PUT(msg, NL80211_ATTR_FRAME, len, frame);
7997
7998 genlmsg_end(msg, hdr);
7999
8000 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlpid);
8001 return;
8002
8003 nla_put_failure:

--- 82 unchanged lines hidden ---