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, ¶ms.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, ¶ms.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, ¶ms); 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, ¶ms); 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 --- |