diff options
Diffstat (limited to 'include/net')
49 files changed, 1478 insertions, 289 deletions
diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h new file mode 100644 index 000000000000..f7d372b7d4ff --- /dev/null +++ b/include/net/6lowpan.h | |||
| @@ -0,0 +1,434 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2011, Siemens AG | ||
| 3 | * written by Alexander Smirnov <alex.bluesman.smirnov@gmail.com> | ||
| 4 | */ | ||
| 5 | |||
| 6 | /* | ||
| 7 | * Based on patches from Jon Smirl <jonsmirl@gmail.com> | ||
| 8 | * Copyright (c) 2011 Jon Smirl <jonsmirl@gmail.com> | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 | ||
| 12 | * as published by the Free Software Foundation. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | * GNU General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License along | ||
| 20 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 21 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
| 22 | */ | ||
| 23 | |||
| 24 | /* Jon's code is based on 6lowpan implementation for Contiki which is: | ||
| 25 | * Copyright (c) 2008, Swedish Institute of Computer Science. | ||
| 26 | * All rights reserved. | ||
| 27 | * | ||
| 28 | * Redistribution and use in source and binary forms, with or without | ||
| 29 | * modification, are permitted provided that the following conditions | ||
| 30 | * are met: | ||
| 31 | * 1. Redistributions of source code must retain the above copyright | ||
| 32 | * notice, this list of conditions and the following disclaimer. | ||
| 33 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 34 | * notice, this list of conditions and the following disclaimer in the | ||
| 35 | * documentation and/or other materials provided with the distribution. | ||
| 36 | * 3. Neither the name of the Institute nor the names of its contributors | ||
| 37 | * may be used to endorse or promote products derived from this software | ||
| 38 | * without specific prior written permission. | ||
| 39 | * | ||
| 40 | * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND | ||
| 41 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 42 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
| 43 | * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE | ||
| 44 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 45 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
| 46 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 47 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 48 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
| 49 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
| 50 | * SUCH DAMAGE. | ||
| 51 | */ | ||
| 52 | |||
| 53 | #ifndef __6LOWPAN_H__ | ||
| 54 | #define __6LOWPAN_H__ | ||
| 55 | |||
| 56 | #include <net/ipv6.h> | ||
| 57 | |||
| 58 | #define UIP_802154_SHORTADDR_LEN 2 /* compressed ipv6 address length */ | ||
| 59 | #define UIP_IPH_LEN 40 /* ipv6 fixed header size */ | ||
| 60 | #define UIP_PROTO_UDP 17 /* ipv6 next header value for UDP */ | ||
| 61 | #define UIP_FRAGH_LEN 8 /* ipv6 fragment header size */ | ||
| 62 | |||
| 63 | /* | ||
| 64 | * ipv6 address based on mac | ||
| 65 | * second bit-flip (Universe/Local) is done according RFC2464 | ||
| 66 | */ | ||
| 67 | #define is_addr_mac_addr_based(a, m) \ | ||
| 68 | ((((a)->s6_addr[8]) == (((m)[0]) ^ 0x02)) && \ | ||
| 69 | (((a)->s6_addr[9]) == (m)[1]) && \ | ||
| 70 | (((a)->s6_addr[10]) == (m)[2]) && \ | ||
| 71 | (((a)->s6_addr[11]) == (m)[3]) && \ | ||
| 72 | (((a)->s6_addr[12]) == (m)[4]) && \ | ||
| 73 | (((a)->s6_addr[13]) == (m)[5]) && \ | ||
| 74 | (((a)->s6_addr[14]) == (m)[6]) && \ | ||
| 75 | (((a)->s6_addr[15]) == (m)[7])) | ||
| 76 | |||
| 77 | /* ipv6 address is unspecified */ | ||
| 78 | #define is_addr_unspecified(a) \ | ||
| 79 | ((((a)->s6_addr32[0]) == 0) && \ | ||
| 80 | (((a)->s6_addr32[1]) == 0) && \ | ||
| 81 | (((a)->s6_addr32[2]) == 0) && \ | ||
| 82 | (((a)->s6_addr32[3]) == 0)) | ||
| 83 | |||
| 84 | /* compare ipv6 addresses prefixes */ | ||
| 85 | #define ipaddr_prefixcmp(addr1, addr2, length) \ | ||
| 86 | (memcmp(addr1, addr2, length >> 3) == 0) | ||
| 87 | |||
| 88 | /* local link, i.e. FE80::/10 */ | ||
| 89 | #define is_addr_link_local(a) (((a)->s6_addr16[0]) == htons(0xFE80)) | ||
| 90 | |||
| 91 | /* | ||
| 92 | * check whether we can compress the IID to 16 bits, | ||
| 93 | * it's possible for unicast adresses with first 49 bits are zero only. | ||
| 94 | */ | ||
| 95 | #define lowpan_is_iid_16_bit_compressable(a) \ | ||
| 96 | ((((a)->s6_addr16[4]) == 0) && \ | ||
| 97 | (((a)->s6_addr[10]) == 0) && \ | ||
| 98 | (((a)->s6_addr[11]) == 0xff) && \ | ||
| 99 | (((a)->s6_addr[12]) == 0xfe) && \ | ||
| 100 | (((a)->s6_addr[13]) == 0)) | ||
| 101 | |||
| 102 | /* multicast address */ | ||
| 103 | #define is_addr_mcast(a) (((a)->s6_addr[0]) == 0xFF) | ||
| 104 | |||
| 105 | /* check whether the 112-bit gid of the multicast address is mappable to: */ | ||
| 106 | |||
| 107 | /* 9 bits, for FF02::1 (all nodes) and FF02::2 (all routers) addresses only. */ | ||
| 108 | #define lowpan_is_mcast_addr_compressable(a) \ | ||
| 109 | ((((a)->s6_addr16[1]) == 0) && \ | ||
| 110 | (((a)->s6_addr16[2]) == 0) && \ | ||
| 111 | (((a)->s6_addr16[3]) == 0) && \ | ||
| 112 | (((a)->s6_addr16[4]) == 0) && \ | ||
| 113 | (((a)->s6_addr16[5]) == 0) && \ | ||
| 114 | (((a)->s6_addr16[6]) == 0) && \ | ||
| 115 | (((a)->s6_addr[14]) == 0) && \ | ||
| 116 | ((((a)->s6_addr[15]) == 1) || (((a)->s6_addr[15]) == 2))) | ||
| 117 | |||
| 118 | /* 48 bits, FFXX::00XX:XXXX:XXXX */ | ||
| 119 | #define lowpan_is_mcast_addr_compressable48(a) \ | ||
| 120 | ((((a)->s6_addr16[1]) == 0) && \ | ||
| 121 | (((a)->s6_addr16[2]) == 0) && \ | ||
| 122 | (((a)->s6_addr16[3]) == 0) && \ | ||
| 123 | (((a)->s6_addr16[4]) == 0) && \ | ||
| 124 | (((a)->s6_addr[10]) == 0)) | ||
| 125 | |||
| 126 | /* 32 bits, FFXX::00XX:XXXX */ | ||
| 127 | #define lowpan_is_mcast_addr_compressable32(a) \ | ||
| 128 | ((((a)->s6_addr16[1]) == 0) && \ | ||
| 129 | (((a)->s6_addr16[2]) == 0) && \ | ||
| 130 | (((a)->s6_addr16[3]) == 0) && \ | ||
| 131 | (((a)->s6_addr16[4]) == 0) && \ | ||
| 132 | (((a)->s6_addr16[5]) == 0) && \ | ||
| 133 | (((a)->s6_addr[12]) == 0)) | ||
| 134 | |||
| 135 | /* 8 bits, FF02::00XX */ | ||
| 136 | #define lowpan_is_mcast_addr_compressable8(a) \ | ||
| 137 | ((((a)->s6_addr[1]) == 2) && \ | ||
| 138 | (((a)->s6_addr16[1]) == 0) && \ | ||
| 139 | (((a)->s6_addr16[2]) == 0) && \ | ||
| 140 | (((a)->s6_addr16[3]) == 0) && \ | ||
| 141 | (((a)->s6_addr16[4]) == 0) && \ | ||
| 142 | (((a)->s6_addr16[5]) == 0) && \ | ||
| 143 | (((a)->s6_addr16[6]) == 0) && \ | ||
| 144 | (((a)->s6_addr[14]) == 0)) | ||
| 145 | |||
| 146 | #define lowpan_is_addr_broadcast(a) \ | ||
| 147 | ((((a)[0]) == 0xFF) && \ | ||
| 148 | (((a)[1]) == 0xFF) && \ | ||
| 149 | (((a)[2]) == 0xFF) && \ | ||
| 150 | (((a)[3]) == 0xFF) && \ | ||
| 151 | (((a)[4]) == 0xFF) && \ | ||
| 152 | (((a)[5]) == 0xFF) && \ | ||
| 153 | (((a)[6]) == 0xFF) && \ | ||
| 154 | (((a)[7]) == 0xFF)) | ||
| 155 | |||
| 156 | #define LOWPAN_DISPATCH_IPV6 0x41 /* 01000001 = 65 */ | ||
| 157 | #define LOWPAN_DISPATCH_HC1 0x42 /* 01000010 = 66 */ | ||
| 158 | #define LOWPAN_DISPATCH_IPHC 0x60 /* 011xxxxx = ... */ | ||
| 159 | #define LOWPAN_DISPATCH_FRAG1 0xc0 /* 11000xxx */ | ||
| 160 | #define LOWPAN_DISPATCH_FRAGN 0xe0 /* 11100xxx */ | ||
| 161 | |||
| 162 | #define LOWPAN_DISPATCH_MASK 0xf8 /* 11111000 */ | ||
| 163 | |||
| 164 | #define LOWPAN_FRAG_TIMEOUT (HZ * 60) /* time-out 60 sec */ | ||
| 165 | |||
| 166 | #define LOWPAN_FRAG1_HEAD_SIZE 0x4 | ||
| 167 | #define LOWPAN_FRAGN_HEAD_SIZE 0x5 | ||
| 168 | |||
| 169 | /* | ||
| 170 | * According IEEE802.15.4 standard: | ||
| 171 | * - MTU is 127 octets | ||
| 172 | * - maximum MHR size is 37 octets | ||
| 173 | * - MFR size is 2 octets | ||
| 174 | * | ||
| 175 | * so minimal payload size that we may guarantee is: | ||
| 176 | * MTU - MHR - MFR = 88 octets | ||
| 177 | */ | ||
| 178 | #define LOWPAN_FRAG_SIZE 88 | ||
| 179 | |||
| 180 | /* | ||
| 181 | * Values of fields within the IPHC encoding first byte | ||
| 182 | * (C stands for compressed and I for inline) | ||
| 183 | */ | ||
| 184 | #define LOWPAN_IPHC_TF 0x18 | ||
| 185 | |||
| 186 | #define LOWPAN_IPHC_FL_C 0x10 | ||
| 187 | #define LOWPAN_IPHC_TC_C 0x08 | ||
| 188 | #define LOWPAN_IPHC_NH_C 0x04 | ||
| 189 | #define LOWPAN_IPHC_TTL_1 0x01 | ||
| 190 | #define LOWPAN_IPHC_TTL_64 0x02 | ||
| 191 | #define LOWPAN_IPHC_TTL_255 0x03 | ||
| 192 | #define LOWPAN_IPHC_TTL_I 0x00 | ||
| 193 | |||
| 194 | |||
| 195 | /* Values of fields within the IPHC encoding second byte */ | ||
| 196 | #define LOWPAN_IPHC_CID 0x80 | ||
| 197 | |||
| 198 | #define LOWPAN_IPHC_ADDR_00 0x00 | ||
| 199 | #define LOWPAN_IPHC_ADDR_01 0x01 | ||
| 200 | #define LOWPAN_IPHC_ADDR_02 0x02 | ||
| 201 | #define LOWPAN_IPHC_ADDR_03 0x03 | ||
| 202 | |||
| 203 | #define LOWPAN_IPHC_SAC 0x40 | ||
| 204 | #define LOWPAN_IPHC_SAM 0x30 | ||
| 205 | |||
| 206 | #define LOWPAN_IPHC_SAM_BIT 4 | ||
| 207 | |||
| 208 | #define LOWPAN_IPHC_M 0x08 | ||
| 209 | #define LOWPAN_IPHC_DAC 0x04 | ||
| 210 | #define LOWPAN_IPHC_DAM_00 0x00 | ||
| 211 | #define LOWPAN_IPHC_DAM_01 0x01 | ||
| 212 | #define LOWPAN_IPHC_DAM_10 0x02 | ||
| 213 | #define LOWPAN_IPHC_DAM_11 0x03 | ||
| 214 | |||
| 215 | #define LOWPAN_IPHC_DAM_BIT 0 | ||
| 216 | /* | ||
| 217 | * LOWPAN_UDP encoding (works together with IPHC) | ||
| 218 | */ | ||
| 219 | #define LOWPAN_NHC_UDP_MASK 0xF8 | ||
| 220 | #define LOWPAN_NHC_UDP_ID 0xF0 | ||
| 221 | #define LOWPAN_NHC_UDP_CHECKSUMC 0x04 | ||
| 222 | #define LOWPAN_NHC_UDP_CHECKSUMI 0x00 | ||
| 223 | |||
| 224 | #define LOWPAN_NHC_UDP_4BIT_PORT 0xF0B0 | ||
| 225 | #define LOWPAN_NHC_UDP_4BIT_MASK 0xFFF0 | ||
| 226 | #define LOWPAN_NHC_UDP_8BIT_PORT 0xF000 | ||
| 227 | #define LOWPAN_NHC_UDP_8BIT_MASK 0xFF00 | ||
| 228 | |||
| 229 | /* values for port compression, _with checksum_ ie bit 5 set to 0 */ | ||
| 230 | #define LOWPAN_NHC_UDP_CS_P_00 0xF0 /* all inline */ | ||
| 231 | #define LOWPAN_NHC_UDP_CS_P_01 0xF1 /* source 16bit inline, | ||
| 232 | dest = 0xF0 + 8 bit inline */ | ||
| 233 | #define LOWPAN_NHC_UDP_CS_P_10 0xF2 /* source = 0xF0 + 8bit inline, | ||
| 234 | dest = 16 bit inline */ | ||
| 235 | #define LOWPAN_NHC_UDP_CS_P_11 0xF3 /* source & dest = 0xF0B + 4bit inline */ | ||
| 236 | #define LOWPAN_NHC_UDP_CS_C 0x04 /* checksum elided */ | ||
| 237 | |||
| 238 | #ifdef DEBUG | ||
| 239 | /* print data in line */ | ||
| 240 | static inline void raw_dump_inline(const char *caller, char *msg, | ||
| 241 | unsigned char *buf, int len) | ||
| 242 | { | ||
| 243 | if (msg) | ||
| 244 | pr_debug("%s():%s: ", caller, msg); | ||
| 245 | |||
| 246 | print_hex_dump_debug("", DUMP_PREFIX_NONE, 16, 1, buf, len, false); | ||
| 247 | } | ||
| 248 | |||
| 249 | /* print data in a table format: | ||
| 250 | * | ||
| 251 | * addr: xx xx xx xx xx xx | ||
| 252 | * addr: xx xx xx xx xx xx | ||
| 253 | * ... | ||
| 254 | */ | ||
| 255 | static inline void raw_dump_table(const char *caller, char *msg, | ||
| 256 | unsigned char *buf, int len) | ||
| 257 | { | ||
| 258 | if (msg) | ||
| 259 | pr_debug("%s():%s:\n", caller, msg); | ||
| 260 | |||
| 261 | print_hex_dump_debug("\t", DUMP_PREFIX_OFFSET, 16, 1, buf, len, false); | ||
| 262 | } | ||
| 263 | #else | ||
| 264 | static inline void raw_dump_table(const char *caller, char *msg, | ||
| 265 | unsigned char *buf, int len) { } | ||
| 266 | static inline void raw_dump_inline(const char *caller, char *msg, | ||
| 267 | unsigned char *buf, int len) { } | ||
| 268 | #endif | ||
| 269 | |||
| 270 | static inline int lowpan_fetch_skb_u8(struct sk_buff *skb, u8 *val) | ||
| 271 | { | ||
| 272 | if (unlikely(!pskb_may_pull(skb, 1))) | ||
| 273 | return -EINVAL; | ||
| 274 | |||
| 275 | *val = skb->data[0]; | ||
| 276 | skb_pull(skb, 1); | ||
| 277 | |||
| 278 | return 0; | ||
| 279 | } | ||
| 280 | |||
| 281 | static inline int lowpan_fetch_skb_u16(struct sk_buff *skb, u16 *val) | ||
| 282 | { | ||
| 283 | if (unlikely(!pskb_may_pull(skb, 2))) | ||
| 284 | return -EINVAL; | ||
| 285 | |||
| 286 | *val = (skb->data[0] << 8) | skb->data[1]; | ||
| 287 | skb_pull(skb, 2); | ||
| 288 | |||
| 289 | return 0; | ||
| 290 | } | ||
| 291 | |||
| 292 | static inline bool lowpan_fetch_skb(struct sk_buff *skb, | ||
| 293 | void *data, const unsigned int len) | ||
| 294 | { | ||
| 295 | if (unlikely(!pskb_may_pull(skb, len))) | ||
| 296 | return true; | ||
| 297 | |||
| 298 | skb_copy_from_linear_data(skb, data, len); | ||
| 299 | skb_pull(skb, len); | ||
| 300 | |||
| 301 | return false; | ||
| 302 | } | ||
| 303 | |||
| 304 | static inline void lowpan_push_hc_data(u8 **hc_ptr, const void *data, | ||
| 305 | const size_t len) | ||
| 306 | { | ||
| 307 | memcpy(*hc_ptr, data, len); | ||
| 308 | *hc_ptr += len; | ||
| 309 | } | ||
| 310 | |||
| 311 | static inline u8 lowpan_addr_mode_size(const u8 addr_mode) | ||
| 312 | { | ||
| 313 | static const u8 addr_sizes[] = { | ||
| 314 | [LOWPAN_IPHC_ADDR_00] = 16, | ||
| 315 | [LOWPAN_IPHC_ADDR_01] = 8, | ||
| 316 | [LOWPAN_IPHC_ADDR_02] = 2, | ||
| 317 | [LOWPAN_IPHC_ADDR_03] = 0, | ||
| 318 | }; | ||
| 319 | return addr_sizes[addr_mode]; | ||
| 320 | } | ||
| 321 | |||
| 322 | static inline u8 lowpan_next_hdr_size(const u8 h_enc, u16 *uncomp_header) | ||
| 323 | { | ||
| 324 | u8 ret = 1; | ||
| 325 | |||
| 326 | if ((h_enc & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_ID) { | ||
| 327 | *uncomp_header += sizeof(struct udphdr); | ||
| 328 | |||
| 329 | switch (h_enc & LOWPAN_NHC_UDP_CS_P_11) { | ||
| 330 | case LOWPAN_NHC_UDP_CS_P_00: | ||
| 331 | ret += 4; | ||
| 332 | break; | ||
| 333 | case LOWPAN_NHC_UDP_CS_P_01: | ||
| 334 | case LOWPAN_NHC_UDP_CS_P_10: | ||
| 335 | ret += 3; | ||
| 336 | break; | ||
| 337 | case LOWPAN_NHC_UDP_CS_P_11: | ||
| 338 | ret++; | ||
| 339 | break; | ||
| 340 | default: | ||
| 341 | break; | ||
| 342 | } | ||
| 343 | |||
| 344 | if (!(h_enc & LOWPAN_NHC_UDP_CS_C)) | ||
| 345 | ret += 2; | ||
| 346 | } | ||
| 347 | |||
| 348 | return ret; | ||
| 349 | } | ||
| 350 | |||
| 351 | /** | ||
| 352 | * lowpan_uncompress_size - returns skb->len size with uncompressed header | ||
| 353 | * @skb: sk_buff with 6lowpan header inside | ||
| 354 | * @datagram_offset: optional to get the datagram_offset value | ||
| 355 | * | ||
| 356 | * Returns the skb->len with uncompressed header | ||
| 357 | */ | ||
| 358 | static inline u16 | ||
| 359 | lowpan_uncompress_size(const struct sk_buff *skb, u16 *dgram_offset) | ||
| 360 | { | ||
| 361 | u16 ret = 2, uncomp_header = sizeof(struct ipv6hdr); | ||
| 362 | u8 iphc0, iphc1, h_enc; | ||
| 363 | |||
| 364 | iphc0 = skb_network_header(skb)[0]; | ||
| 365 | iphc1 = skb_network_header(skb)[1]; | ||
| 366 | |||
| 367 | switch ((iphc0 & LOWPAN_IPHC_TF) >> 3) { | ||
| 368 | case 0: | ||
| 369 | ret += 4; | ||
| 370 | break; | ||
| 371 | case 1: | ||
| 372 | ret += 3; | ||
| 373 | break; | ||
| 374 | case 2: | ||
| 375 | ret++; | ||
| 376 | break; | ||
| 377 | default: | ||
| 378 | break; | ||
| 379 | } | ||
| 380 | |||
| 381 | if (!(iphc0 & LOWPAN_IPHC_NH_C)) | ||
| 382 | ret++; | ||
| 383 | |||
| 384 | if (!(iphc0 & 0x03)) | ||
| 385 | ret++; | ||
| 386 | |||
| 387 | ret += lowpan_addr_mode_size((iphc1 & LOWPAN_IPHC_SAM) >> | ||
| 388 | LOWPAN_IPHC_SAM_BIT); | ||
| 389 | |||
| 390 | if (iphc1 & LOWPAN_IPHC_M) { | ||
| 391 | switch ((iphc1 & LOWPAN_IPHC_DAM_11) >> | ||
| 392 | LOWPAN_IPHC_DAM_BIT) { | ||
| 393 | case LOWPAN_IPHC_DAM_00: | ||
| 394 | ret += 16; | ||
| 395 | break; | ||
| 396 | case LOWPAN_IPHC_DAM_01: | ||
| 397 | ret += 6; | ||
| 398 | break; | ||
| 399 | case LOWPAN_IPHC_DAM_10: | ||
| 400 | ret += 4; | ||
| 401 | break; | ||
| 402 | case LOWPAN_IPHC_DAM_11: | ||
| 403 | ret++; | ||
| 404 | break; | ||
| 405 | default: | ||
| 406 | break; | ||
| 407 | } | ||
| 408 | } else { | ||
| 409 | ret += lowpan_addr_mode_size((iphc1 & LOWPAN_IPHC_DAM_11) >> | ||
| 410 | LOWPAN_IPHC_DAM_BIT); | ||
| 411 | } | ||
| 412 | |||
| 413 | if (iphc0 & LOWPAN_IPHC_NH_C) { | ||
| 414 | h_enc = skb_network_header(skb)[ret]; | ||
| 415 | ret += lowpan_next_hdr_size(h_enc, &uncomp_header); | ||
| 416 | } | ||
| 417 | |||
| 418 | if (dgram_offset) | ||
| 419 | *dgram_offset = uncomp_header; | ||
| 420 | |||
| 421 | return skb->len + uncomp_header - ret; | ||
| 422 | } | ||
| 423 | |||
| 424 | typedef int (*skb_delivery_cb)(struct sk_buff *skb, struct net_device *dev); | ||
| 425 | |||
| 426 | int lowpan_process_data(struct sk_buff *skb, struct net_device *dev, | ||
| 427 | const u8 *saddr, const u8 saddr_type, const u8 saddr_len, | ||
| 428 | const u8 *daddr, const u8 daddr_type, const u8 daddr_len, | ||
| 429 | u8 iphc0, u8 iphc1, skb_delivery_cb skb_deliver); | ||
| 430 | int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev, | ||
| 431 | unsigned short type, const void *_daddr, | ||
| 432 | const void *_saddr, unsigned int len); | ||
| 433 | |||
| 434 | #endif /* __6LOWPAN_H__ */ | ||
diff --git a/include/net/act_api.h b/include/net/act_api.h index 788d8378e587..3ee4c92afd1b 100644 --- a/include/net/act_api.h +++ b/include/net/act_api.h | |||
| @@ -89,7 +89,7 @@ struct tc_action_ops { | |||
| 89 | struct module *owner; | 89 | struct module *owner; |
| 90 | int (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *); | 90 | int (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *); |
| 91 | int (*dump)(struct sk_buff *, struct tc_action *, int, int); | 91 | int (*dump)(struct sk_buff *, struct tc_action *, int, int); |
| 92 | int (*cleanup)(struct tc_action *, int bind); | 92 | void (*cleanup)(struct tc_action *, int bind); |
| 93 | int (*lookup)(struct tc_action *, u32); | 93 | int (*lookup)(struct tc_action *, u32); |
| 94 | int (*init)(struct net *net, struct nlattr *nla, | 94 | int (*init)(struct net *net, struct nlattr *nla, |
| 95 | struct nlattr *est, struct tc_action *act, int ovr, | 95 | struct nlattr *est, struct tc_action *act, int ovr, |
| @@ -98,20 +98,18 @@ struct tc_action_ops { | |||
| 98 | }; | 98 | }; |
| 99 | 99 | ||
| 100 | int tcf_hash_search(struct tc_action *a, u32 index); | 100 | int tcf_hash_search(struct tc_action *a, u32 index); |
| 101 | void tcf_hash_destroy(struct tcf_common *p, struct tcf_hashinfo *hinfo); | 101 | void tcf_hash_destroy(struct tc_action *a); |
| 102 | int tcf_hash_release(struct tcf_common *p, int bind, | 102 | int tcf_hash_release(struct tc_action *a, int bind); |
| 103 | struct tcf_hashinfo *hinfo); | ||
| 104 | u32 tcf_hash_new_index(struct tcf_hashinfo *hinfo); | 103 | u32 tcf_hash_new_index(struct tcf_hashinfo *hinfo); |
| 105 | struct tcf_common *tcf_hash_check(u32 index, struct tc_action *a, | 104 | int tcf_hash_check(u32 index, struct tc_action *a, int bind); |
| 106 | int bind); | 105 | int tcf_hash_create(u32 index, struct nlattr *est, struct tc_action *a, |
| 107 | struct tcf_common *tcf_hash_create(u32 index, struct nlattr *est, | 106 | int size, int bind); |
| 108 | struct tc_action *a, int size, | 107 | void tcf_hash_cleanup(struct tc_action *a, struct nlattr *est); |
| 109 | int bind); | 108 | void tcf_hash_insert(struct tc_action *a); |
| 110 | void tcf_hash_insert(struct tcf_common *p, struct tcf_hashinfo *hinfo); | ||
| 111 | 109 | ||
| 112 | int tcf_register_action(struct tc_action_ops *a); | 110 | int tcf_register_action(struct tc_action_ops *a, unsigned int mask); |
| 113 | int tcf_unregister_action(struct tc_action_ops *a); | 111 | int tcf_unregister_action(struct tc_action_ops *a); |
| 114 | void tcf_action_destroy(struct list_head *actions, int bind); | 112 | int tcf_action_destroy(struct list_head *actions, int bind); |
| 115 | int tcf_action_exec(struct sk_buff *skb, const struct list_head *actions, | 113 | int tcf_action_exec(struct sk_buff *skb, const struct list_head *actions, |
| 116 | struct tcf_result *res); | 114 | struct tcf_result *res); |
| 117 | int tcf_action_init(struct net *net, struct nlattr *nla, | 115 | int tcf_action_init(struct net *net, struct nlattr *nla, |
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index 50e39a8822b4..933a9f22a05f 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h | |||
| @@ -314,7 +314,7 @@ static inline bool ipv6_addr_is_multicast(const struct in6_addr *addr) | |||
| 314 | static inline bool ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr) | 314 | static inline bool ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr) |
| 315 | { | 315 | { |
| 316 | #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 | 316 | #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 |
| 317 | __u64 *p = (__u64 *)addr; | 317 | __be64 *p = (__be64 *)addr; |
| 318 | return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | (p[1] ^ cpu_to_be64(1))) == 0UL; | 318 | return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | (p[1] ^ cpu_to_be64(1))) == 0UL; |
| 319 | #else | 319 | #else |
| 320 | return ((addr->s6_addr32[0] ^ htonl(0xff020000)) | | 320 | return ((addr->s6_addr32[0] ^ htonl(0xff020000)) | |
| @@ -326,7 +326,7 @@ static inline bool ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr) | |||
| 326 | static inline bool ipv6_addr_is_ll_all_routers(const struct in6_addr *addr) | 326 | static inline bool ipv6_addr_is_ll_all_routers(const struct in6_addr *addr) |
| 327 | { | 327 | { |
| 328 | #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 | 328 | #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 |
| 329 | __u64 *p = (__u64 *)addr; | 329 | __be64 *p = (__be64 *)addr; |
| 330 | return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | (p[1] ^ cpu_to_be64(2))) == 0UL; | 330 | return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | (p[1] ^ cpu_to_be64(2))) == 0UL; |
| 331 | #else | 331 | #else |
| 332 | return ((addr->s6_addr32[0] ^ htonl(0xff020000)) | | 332 | return ((addr->s6_addr32[0] ^ htonl(0xff020000)) | |
| @@ -343,7 +343,7 @@ static inline bool ipv6_addr_is_isatap(const struct in6_addr *addr) | |||
| 343 | static inline bool ipv6_addr_is_solict_mult(const struct in6_addr *addr) | 343 | static inline bool ipv6_addr_is_solict_mult(const struct in6_addr *addr) |
| 344 | { | 344 | { |
| 345 | #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 | 345 | #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 |
| 346 | __u64 *p = (__u64 *)addr; | 346 | __be64 *p = (__be64 *)addr; |
| 347 | return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | | 347 | return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | |
| 348 | ((p[1] ^ cpu_to_be64(0x00000001ff000000UL)) & | 348 | ((p[1] ^ cpu_to_be64(0x00000001ff000000UL)) & |
| 349 | cpu_to_be64(0xffffffffff000000UL))) == 0UL; | 349 | cpu_to_be64(0xffffffffff000000UL))) == 0UL; |
diff --git a/include/net/af_ieee802154.h b/include/net/af_ieee802154.h index 75e64c7a2960..f79ae2aa76d6 100644 --- a/include/net/af_ieee802154.h +++ b/include/net/af_ieee802154.h | |||
| @@ -36,7 +36,7 @@ enum { | |||
| 36 | /* address length, octets */ | 36 | /* address length, octets */ |
| 37 | #define IEEE802154_ADDR_LEN 8 | 37 | #define IEEE802154_ADDR_LEN 8 |
| 38 | 38 | ||
| 39 | struct ieee802154_addr { | 39 | struct ieee802154_addr_sa { |
| 40 | int addr_type; | 40 | int addr_type; |
| 41 | u16 pan_id; | 41 | u16 pan_id; |
| 42 | union { | 42 | union { |
| @@ -51,7 +51,7 @@ struct ieee802154_addr { | |||
| 51 | 51 | ||
| 52 | struct sockaddr_ieee802154 { | 52 | struct sockaddr_ieee802154 { |
| 53 | sa_family_t family; /* AF_IEEE802154 */ | 53 | sa_family_t family; /* AF_IEEE802154 */ |
| 54 | struct ieee802154_addr addr; | 54 | struct ieee802154_addr_sa addr; |
| 55 | }; | 55 | }; |
| 56 | 56 | ||
| 57 | /* get/setsockopt */ | 57 | /* get/setsockopt */ |
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index f4f9ee466791..904777c1cd24 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h | |||
| @@ -65,6 +65,7 @@ struct bt_security { | |||
| 65 | #define BT_SECURITY_LOW 1 | 65 | #define BT_SECURITY_LOW 1 |
| 66 | #define BT_SECURITY_MEDIUM 2 | 66 | #define BT_SECURITY_MEDIUM 2 |
| 67 | #define BT_SECURITY_HIGH 3 | 67 | #define BT_SECURITY_HIGH 3 |
| 68 | #define BT_SECURITY_FIPS 4 | ||
| 68 | 69 | ||
| 69 | #define BT_DEFER_SETUP 7 | 70 | #define BT_DEFER_SETUP 7 |
| 70 | 71 | ||
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 66c1cd87bfe7..be150cf8cd43 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
| @@ -117,11 +117,18 @@ enum { | |||
| 117 | HCI_SERVICE_CACHE, | 117 | HCI_SERVICE_CACHE, |
| 118 | HCI_DEBUG_KEYS, | 118 | HCI_DEBUG_KEYS, |
| 119 | HCI_DUT_MODE, | 119 | HCI_DUT_MODE, |
| 120 | HCI_FORCE_SC, | ||
| 121 | HCI_FORCE_STATIC_ADDR, | ||
| 120 | HCI_UNREGISTER, | 122 | HCI_UNREGISTER, |
| 121 | HCI_USER_CHANNEL, | 123 | HCI_USER_CHANNEL, |
| 122 | 124 | ||
| 123 | HCI_LE_SCAN, | 125 | HCI_LE_SCAN, |
| 124 | HCI_SSP_ENABLED, | 126 | HCI_SSP_ENABLED, |
| 127 | HCI_SC_ENABLED, | ||
| 128 | HCI_SC_ONLY, | ||
| 129 | HCI_PRIVACY, | ||
| 130 | HCI_RPA_EXPIRED, | ||
| 131 | HCI_RPA_RESOLVING, | ||
| 125 | HCI_HS_ENABLED, | 132 | HCI_HS_ENABLED, |
| 126 | HCI_LE_ENABLED, | 133 | HCI_LE_ENABLED, |
| 127 | HCI_ADVERTISING, | 134 | HCI_ADVERTISING, |
| @@ -133,6 +140,7 @@ enum { | |||
| 133 | HCI_FAST_CONNECTABLE, | 140 | HCI_FAST_CONNECTABLE, |
| 134 | HCI_BREDR_ENABLED, | 141 | HCI_BREDR_ENABLED, |
| 135 | HCI_6LOWPAN_ENABLED, | 142 | HCI_6LOWPAN_ENABLED, |
| 143 | HCI_LE_SCAN_INTERRUPTED, | ||
| 136 | }; | 144 | }; |
| 137 | 145 | ||
| 138 | /* A mask for the flags that are supposed to remain when a reset happens | 146 | /* A mask for the flags that are supposed to remain when a reset happens |
| @@ -175,6 +183,8 @@ enum { | |||
| 175 | #define HCI_CMD_TIMEOUT msecs_to_jiffies(2000) /* 2 seconds */ | 183 | #define HCI_CMD_TIMEOUT msecs_to_jiffies(2000) /* 2 seconds */ |
| 176 | #define HCI_ACL_TX_TIMEOUT msecs_to_jiffies(45000) /* 45 seconds */ | 184 | #define HCI_ACL_TX_TIMEOUT msecs_to_jiffies(45000) /* 45 seconds */ |
| 177 | #define HCI_AUTO_OFF_TIMEOUT msecs_to_jiffies(2000) /* 2 seconds */ | 185 | #define HCI_AUTO_OFF_TIMEOUT msecs_to_jiffies(2000) /* 2 seconds */ |
| 186 | #define HCI_POWER_OFF_TIMEOUT msecs_to_jiffies(5000) /* 5 seconds */ | ||
| 187 | #define HCI_LE_CONN_TIMEOUT msecs_to_jiffies(20000) /* 20 seconds */ | ||
| 178 | 188 | ||
| 179 | /* HCI data types */ | 189 | /* HCI data types */ |
| 180 | #define HCI_COMMAND_PKT 0x01 | 190 | #define HCI_COMMAND_PKT 0x01 |
| @@ -282,10 +292,14 @@ enum { | |||
| 282 | #define LMP_SYNC_TRAIN 0x04 | 292 | #define LMP_SYNC_TRAIN 0x04 |
| 283 | #define LMP_SYNC_SCAN 0x08 | 293 | #define LMP_SYNC_SCAN 0x08 |
| 284 | 294 | ||
| 295 | #define LMP_SC 0x01 | ||
| 296 | #define LMP_PING 0x02 | ||
| 297 | |||
| 285 | /* Host features */ | 298 | /* Host features */ |
| 286 | #define LMP_HOST_SSP 0x01 | 299 | #define LMP_HOST_SSP 0x01 |
| 287 | #define LMP_HOST_LE 0x02 | 300 | #define LMP_HOST_LE 0x02 |
| 288 | #define LMP_HOST_LE_BREDR 0x04 | 301 | #define LMP_HOST_LE_BREDR 0x04 |
| 302 | #define LMP_HOST_SC 0x08 | ||
| 289 | 303 | ||
| 290 | /* Connection modes */ | 304 | /* Connection modes */ |
| 291 | #define HCI_CM_ACTIVE 0x0000 | 305 | #define HCI_CM_ACTIVE 0x0000 |
| @@ -307,6 +321,7 @@ enum { | |||
| 307 | #define HCI_LM_TRUSTED 0x0008 | 321 | #define HCI_LM_TRUSTED 0x0008 |
| 308 | #define HCI_LM_RELIABLE 0x0010 | 322 | #define HCI_LM_RELIABLE 0x0010 |
| 309 | #define HCI_LM_SECURE 0x0020 | 323 | #define HCI_LM_SECURE 0x0020 |
| 324 | #define HCI_LM_FIPS 0x0040 | ||
| 310 | 325 | ||
| 311 | /* Authentication types */ | 326 | /* Authentication types */ |
| 312 | #define HCI_AT_NO_BONDING 0x00 | 327 | #define HCI_AT_NO_BONDING 0x00 |
| @@ -327,17 +342,24 @@ enum { | |||
| 327 | #define HCI_LK_LOCAL_UNIT 0x01 | 342 | #define HCI_LK_LOCAL_UNIT 0x01 |
| 328 | #define HCI_LK_REMOTE_UNIT 0x02 | 343 | #define HCI_LK_REMOTE_UNIT 0x02 |
| 329 | #define HCI_LK_DEBUG_COMBINATION 0x03 | 344 | #define HCI_LK_DEBUG_COMBINATION 0x03 |
| 330 | #define HCI_LK_UNAUTH_COMBINATION 0x04 | 345 | #define HCI_LK_UNAUTH_COMBINATION_P192 0x04 |
| 331 | #define HCI_LK_AUTH_COMBINATION 0x05 | 346 | #define HCI_LK_AUTH_COMBINATION_P192 0x05 |
| 332 | #define HCI_LK_CHANGED_COMBINATION 0x06 | 347 | #define HCI_LK_CHANGED_COMBINATION 0x06 |
| 348 | #define HCI_LK_UNAUTH_COMBINATION_P256 0x07 | ||
| 349 | #define HCI_LK_AUTH_COMBINATION_P256 0x08 | ||
| 333 | /* The spec doesn't define types for SMP keys, the _MASTER suffix is implied */ | 350 | /* The spec doesn't define types for SMP keys, the _MASTER suffix is implied */ |
| 334 | #define HCI_SMP_STK 0x80 | 351 | #define HCI_SMP_STK 0x80 |
| 335 | #define HCI_SMP_STK_SLAVE 0x81 | 352 | #define HCI_SMP_STK_SLAVE 0x81 |
| 336 | #define HCI_SMP_LTK 0x82 | 353 | #define HCI_SMP_LTK 0x82 |
| 337 | #define HCI_SMP_LTK_SLAVE 0x83 | 354 | #define HCI_SMP_LTK_SLAVE 0x83 |
| 338 | 355 | ||
| 356 | /* Long Term Key types */ | ||
| 357 | #define HCI_LTK_UNAUTH 0x00 | ||
| 358 | #define HCI_LTK_AUTH 0x01 | ||
| 359 | |||
| 339 | /* ---- HCI Error Codes ---- */ | 360 | /* ---- HCI Error Codes ---- */ |
| 340 | #define HCI_ERROR_AUTH_FAILURE 0x05 | 361 | #define HCI_ERROR_AUTH_FAILURE 0x05 |
| 362 | #define HCI_ERROR_MEMORY_EXCEEDED 0x07 | ||
| 341 | #define HCI_ERROR_CONNECTION_TIMEOUT 0x08 | 363 | #define HCI_ERROR_CONNECTION_TIMEOUT 0x08 |
| 342 | #define HCI_ERROR_REJ_BAD_ADDR 0x0f | 364 | #define HCI_ERROR_REJ_BAD_ADDR 0x0f |
| 343 | #define HCI_ERROR_REMOTE_USER_TERM 0x13 | 365 | #define HCI_ERROR_REMOTE_USER_TERM 0x13 |
| @@ -660,6 +682,15 @@ struct hci_rp_set_csb { | |||
| 660 | 682 | ||
| 661 | #define HCI_OP_START_SYNC_TRAIN 0x0443 | 683 | #define HCI_OP_START_SYNC_TRAIN 0x0443 |
| 662 | 684 | ||
| 685 | #define HCI_OP_REMOTE_OOB_EXT_DATA_REPLY 0x0445 | ||
| 686 | struct hci_cp_remote_oob_ext_data_reply { | ||
| 687 | bdaddr_t bdaddr; | ||
| 688 | __u8 hash192[16]; | ||
| 689 | __u8 randomizer192[16]; | ||
| 690 | __u8 hash256[16]; | ||
| 691 | __u8 randomizer256[16]; | ||
| 692 | } __packed; | ||
| 693 | |||
| 663 | #define HCI_OP_SNIFF_MODE 0x0803 | 694 | #define HCI_OP_SNIFF_MODE 0x0803 |
| 664 | struct hci_cp_sniff_mode { | 695 | struct hci_cp_sniff_mode { |
| 665 | __le16 handle; | 696 | __le16 handle; |
| @@ -933,6 +964,26 @@ struct hci_rp_write_sync_train_params { | |||
| 933 | __le16 sync_train_int; | 964 | __le16 sync_train_int; |
| 934 | } __packed; | 965 | } __packed; |
| 935 | 966 | ||
| 967 | #define HCI_OP_READ_SC_SUPPORT 0x0c79 | ||
| 968 | struct hci_rp_read_sc_support { | ||
| 969 | __u8 status; | ||
| 970 | __u8 support; | ||
| 971 | } __packed; | ||
| 972 | |||
| 973 | #define HCI_OP_WRITE_SC_SUPPORT 0x0c7a | ||
| 974 | struct hci_cp_write_sc_support { | ||
| 975 | __u8 support; | ||
| 976 | } __packed; | ||
| 977 | |||
| 978 | #define HCI_OP_READ_LOCAL_OOB_EXT_DATA 0x0c7d | ||
| 979 | struct hci_rp_read_local_oob_ext_data { | ||
| 980 | __u8 status; | ||
| 981 | __u8 hash192[16]; | ||
| 982 | __u8 randomizer192[16]; | ||
| 983 | __u8 hash256[16]; | ||
| 984 | __u8 randomizer256[16]; | ||
| 985 | } __packed; | ||
| 986 | |||
| 936 | #define HCI_OP_READ_LOCAL_VERSION 0x1001 | 987 | #define HCI_OP_READ_LOCAL_VERSION 0x1001 |
| 937 | struct hci_rp_read_local_version { | 988 | struct hci_rp_read_local_version { |
| 938 | __u8 status; | 989 | __u8 status; |
| @@ -1133,6 +1184,9 @@ struct hci_cp_le_set_scan_enable { | |||
| 1133 | __u8 filter_dup; | 1184 | __u8 filter_dup; |
| 1134 | } __packed; | 1185 | } __packed; |
| 1135 | 1186 | ||
| 1187 | #define HCI_LE_USE_PEER_ADDR 0x00 | ||
| 1188 | #define HCI_LE_USE_WHITELIST 0x01 | ||
| 1189 | |||
| 1136 | #define HCI_OP_LE_CREATE_CONN 0x200d | 1190 | #define HCI_OP_LE_CREATE_CONN 0x200d |
| 1137 | struct hci_cp_le_create_conn { | 1191 | struct hci_cp_le_create_conn { |
| 1138 | __le16 scan_interval; | 1192 | __le16 scan_interval; |
| @@ -1157,6 +1211,20 @@ struct hci_rp_le_read_white_list_size { | |||
| 1157 | __u8 size; | 1211 | __u8 size; |
| 1158 | } __packed; | 1212 | } __packed; |
| 1159 | 1213 | ||
| 1214 | #define HCI_OP_LE_CLEAR_WHITE_LIST 0x2010 | ||
| 1215 | |||
| 1216 | #define HCI_OP_LE_ADD_TO_WHITE_LIST 0x2011 | ||
| 1217 | struct hci_cp_le_add_to_white_list { | ||
| 1218 | __u8 bdaddr_type; | ||
| 1219 | bdaddr_t bdaddr; | ||
| 1220 | } __packed; | ||
| 1221 | |||
| 1222 | #define HCI_OP_LE_DEL_FROM_WHITE_LIST 0x2012 | ||
| 1223 | struct hci_cp_le_del_from_white_list { | ||
| 1224 | __u8 bdaddr_type; | ||
| 1225 | bdaddr_t bdaddr; | ||
| 1226 | } __packed; | ||
| 1227 | |||
| 1160 | #define HCI_OP_LE_CONN_UPDATE 0x2013 | 1228 | #define HCI_OP_LE_CONN_UPDATE 0x2013 |
| 1161 | struct hci_cp_le_conn_update { | 1229 | struct hci_cp_le_conn_update { |
| 1162 | __le16 handle; | 1230 | __le16 handle; |
| @@ -1171,7 +1239,7 @@ struct hci_cp_le_conn_update { | |||
| 1171 | #define HCI_OP_LE_START_ENC 0x2019 | 1239 | #define HCI_OP_LE_START_ENC 0x2019 |
| 1172 | struct hci_cp_le_start_enc { | 1240 | struct hci_cp_le_start_enc { |
| 1173 | __le16 handle; | 1241 | __le16 handle; |
| 1174 | __u8 rand[8]; | 1242 | __le64 rand; |
| 1175 | __le16 ediv; | 1243 | __le16 ediv; |
| 1176 | __u8 ltk[16]; | 1244 | __u8 ltk[16]; |
| 1177 | } __packed; | 1245 | } __packed; |
| @@ -1583,7 +1651,7 @@ struct hci_ev_le_conn_complete { | |||
| 1583 | #define HCI_EV_LE_LTK_REQ 0x05 | 1651 | #define HCI_EV_LE_LTK_REQ 0x05 |
| 1584 | struct hci_ev_le_ltk_req { | 1652 | struct hci_ev_le_ltk_req { |
| 1585 | __le16 handle; | 1653 | __le16 handle; |
| 1586 | __u8 random[8]; | 1654 | __le64 rand; |
| 1587 | __le16 ediv; | 1655 | __le16 ediv; |
| 1588 | } __packed; | 1656 | } __packed; |
| 1589 | 1657 | ||
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index f2f0cf5865c4..5f8bc05694ac 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
| @@ -91,6 +91,13 @@ struct bt_uuid { | |||
| 91 | u8 svc_hint; | 91 | u8 svc_hint; |
| 92 | }; | 92 | }; |
| 93 | 93 | ||
| 94 | struct smp_csrk { | ||
| 95 | bdaddr_t bdaddr; | ||
| 96 | u8 bdaddr_type; | ||
| 97 | u8 master; | ||
| 98 | u8 val[16]; | ||
| 99 | }; | ||
| 100 | |||
| 94 | struct smp_ltk { | 101 | struct smp_ltk { |
| 95 | struct list_head list; | 102 | struct list_head list; |
| 96 | bdaddr_t bdaddr; | 103 | bdaddr_t bdaddr; |
| @@ -99,9 +106,17 @@ struct smp_ltk { | |||
| 99 | u8 type; | 106 | u8 type; |
| 100 | u8 enc_size; | 107 | u8 enc_size; |
| 101 | __le16 ediv; | 108 | __le16 ediv; |
| 102 | u8 rand[8]; | 109 | __le64 rand; |
| 103 | u8 val[16]; | 110 | u8 val[16]; |
| 104 | } __packed; | 111 | }; |
| 112 | |||
| 113 | struct smp_irk { | ||
| 114 | struct list_head list; | ||
| 115 | bdaddr_t rpa; | ||
| 116 | bdaddr_t bdaddr; | ||
| 117 | u8 addr_type; | ||
| 118 | u8 val[16]; | ||
| 119 | }; | ||
| 105 | 120 | ||
| 106 | struct link_key { | 121 | struct link_key { |
| 107 | struct list_head list; | 122 | struct list_head list; |
| @@ -114,12 +129,17 @@ struct link_key { | |||
| 114 | struct oob_data { | 129 | struct oob_data { |
| 115 | struct list_head list; | 130 | struct list_head list; |
| 116 | bdaddr_t bdaddr; | 131 | bdaddr_t bdaddr; |
| 117 | u8 hash[16]; | 132 | u8 hash192[16]; |
| 118 | u8 randomizer[16]; | 133 | u8 randomizer192[16]; |
| 134 | u8 hash256[16]; | ||
| 135 | u8 randomizer256[16]; | ||
| 119 | }; | 136 | }; |
| 120 | 137 | ||
| 121 | #define HCI_MAX_SHORT_NAME_LENGTH 10 | 138 | #define HCI_MAX_SHORT_NAME_LENGTH 10 |
| 122 | 139 | ||
| 140 | /* Default LE RPA expiry time, 15 minutes */ | ||
| 141 | #define HCI_DEFAULT_RPA_TIMEOUT (15 * 60) | ||
| 142 | |||
| 123 | struct amp_assoc { | 143 | struct amp_assoc { |
| 124 | __u16 len; | 144 | __u16 len; |
| 125 | __u16 offset; | 145 | __u16 offset; |
| @@ -141,8 +161,9 @@ struct hci_dev { | |||
| 141 | __u8 bus; | 161 | __u8 bus; |
| 142 | __u8 dev_type; | 162 | __u8 dev_type; |
| 143 | bdaddr_t bdaddr; | 163 | bdaddr_t bdaddr; |
| 164 | bdaddr_t random_addr; | ||
| 144 | bdaddr_t static_addr; | 165 | bdaddr_t static_addr; |
| 145 | __u8 own_addr_type; | 166 | __u8 adv_addr_type; |
| 146 | __u8 dev_name[HCI_MAX_NAME_LENGTH]; | 167 | __u8 dev_name[HCI_MAX_NAME_LENGTH]; |
| 147 | __u8 short_name[HCI_MAX_SHORT_NAME_LENGTH]; | 168 | __u8 short_name[HCI_MAX_SHORT_NAME_LENGTH]; |
| 148 | __u8 eir[HCI_MAX_EIR_LENGTH]; | 169 | __u8 eir[HCI_MAX_EIR_LENGTH]; |
| @@ -167,6 +188,8 @@ struct hci_dev { | |||
| 167 | __u16 page_scan_interval; | 188 | __u16 page_scan_interval; |
| 168 | __u16 page_scan_window; | 189 | __u16 page_scan_window; |
| 169 | __u8 page_scan_type; | 190 | __u8 page_scan_type; |
| 191 | __u8 le_adv_channel_map; | ||
| 192 | __u8 le_scan_type; | ||
| 170 | __u16 le_scan_interval; | 193 | __u16 le_scan_interval; |
| 171 | __u16 le_scan_window; | 194 | __u16 le_scan_window; |
| 172 | __u16 le_conn_min_interval; | 195 | __u16 le_conn_min_interval; |
| @@ -257,19 +280,21 @@ struct hci_dev { | |||
| 257 | __u32 req_status; | 280 | __u32 req_status; |
| 258 | __u32 req_result; | 281 | __u32 req_result; |
| 259 | 282 | ||
| 260 | struct list_head mgmt_pending; | 283 | struct crypto_blkcipher *tfm_aes; |
| 261 | 284 | ||
| 262 | struct discovery_state discovery; | 285 | struct discovery_state discovery; |
| 263 | struct hci_conn_hash conn_hash; | 286 | struct hci_conn_hash conn_hash; |
| 264 | struct list_head blacklist; | ||
| 265 | 287 | ||
| 288 | struct list_head mgmt_pending; | ||
| 289 | struct list_head blacklist; | ||
| 266 | struct list_head uuids; | 290 | struct list_head uuids; |
| 267 | |||
| 268 | struct list_head link_keys; | 291 | struct list_head link_keys; |
| 269 | |||
| 270 | struct list_head long_term_keys; | 292 | struct list_head long_term_keys; |
| 271 | 293 | struct list_head identity_resolving_keys; | |
| 272 | struct list_head remote_oob_data; | 294 | struct list_head remote_oob_data; |
| 295 | struct list_head le_white_list; | ||
| 296 | struct list_head le_conn_params; | ||
| 297 | struct list_head pend_le_conns; | ||
| 273 | 298 | ||
| 274 | struct hci_dev_stats stat; | 299 | struct hci_dev_stats stat; |
| 275 | 300 | ||
| @@ -291,6 +316,11 @@ struct hci_dev { | |||
| 291 | __u8 scan_rsp_data[HCI_MAX_AD_LENGTH]; | 316 | __u8 scan_rsp_data[HCI_MAX_AD_LENGTH]; |
| 292 | __u8 scan_rsp_data_len; | 317 | __u8 scan_rsp_data_len; |
| 293 | 318 | ||
| 319 | __u8 irk[16]; | ||
| 320 | __u32 rpa_timeout; | ||
| 321 | struct delayed_work rpa_expired; | ||
| 322 | bdaddr_t rpa; | ||
| 323 | |||
| 294 | int (*open)(struct hci_dev *hdev); | 324 | int (*open)(struct hci_dev *hdev); |
| 295 | int (*close)(struct hci_dev *hdev); | 325 | int (*close)(struct hci_dev *hdev); |
| 296 | int (*flush)(struct hci_dev *hdev); | 326 | int (*flush)(struct hci_dev *hdev); |
| @@ -310,6 +340,10 @@ struct hci_conn { | |||
| 310 | __u8 dst_type; | 340 | __u8 dst_type; |
| 311 | bdaddr_t src; | 341 | bdaddr_t src; |
| 312 | __u8 src_type; | 342 | __u8 src_type; |
| 343 | bdaddr_t init_addr; | ||
| 344 | __u8 init_addr_type; | ||
| 345 | bdaddr_t resp_addr; | ||
| 346 | __u8 resp_addr_type; | ||
| 313 | __u16 handle; | 347 | __u16 handle; |
| 314 | __u16 state; | 348 | __u16 state; |
| 315 | __u8 mode; | 349 | __u8 mode; |
| @@ -332,6 +366,8 @@ struct hci_conn { | |||
| 332 | __u8 passkey_entered; | 366 | __u8 passkey_entered; |
| 333 | __u16 disc_timeout; | 367 | __u16 disc_timeout; |
| 334 | __u16 setting; | 368 | __u16 setting; |
| 369 | __u16 le_conn_min_interval; | ||
| 370 | __u16 le_conn_max_interval; | ||
| 335 | unsigned long flags; | 371 | unsigned long flags; |
| 336 | 372 | ||
| 337 | __u8 remote_cap; | 373 | __u8 remote_cap; |
| @@ -347,6 +383,7 @@ struct hci_conn { | |||
| 347 | struct delayed_work disc_work; | 383 | struct delayed_work disc_work; |
| 348 | struct delayed_work auto_accept_work; | 384 | struct delayed_work auto_accept_work; |
| 349 | struct delayed_work idle_work; | 385 | struct delayed_work idle_work; |
| 386 | struct delayed_work le_conn_timeout; | ||
| 350 | 387 | ||
| 351 | struct device dev; | 388 | struct device dev; |
| 352 | 389 | ||
| @@ -372,6 +409,22 @@ struct hci_chan { | |||
| 372 | __u8 state; | 409 | __u8 state; |
| 373 | }; | 410 | }; |
| 374 | 411 | ||
| 412 | struct hci_conn_params { | ||
| 413 | struct list_head list; | ||
| 414 | |||
| 415 | bdaddr_t addr; | ||
| 416 | u8 addr_type; | ||
| 417 | |||
| 418 | u16 conn_min_interval; | ||
| 419 | u16 conn_max_interval; | ||
| 420 | |||
| 421 | enum { | ||
| 422 | HCI_AUTO_CONN_DISABLED, | ||
| 423 | HCI_AUTO_CONN_ALWAYS, | ||
| 424 | HCI_AUTO_CONN_LINK_LOSS, | ||
| 425 | } auto_connect; | ||
| 426 | }; | ||
| 427 | |||
| 375 | extern struct list_head hci_dev_list; | 428 | extern struct list_head hci_dev_list; |
| 376 | extern struct list_head hci_cb_list; | 429 | extern struct list_head hci_cb_list; |
| 377 | extern rwlock_t hci_dev_list_lock; | 430 | extern rwlock_t hci_dev_list_lock; |
| @@ -446,6 +499,8 @@ enum { | |||
| 446 | HCI_CONN_LE_SMP_PEND, | 499 | HCI_CONN_LE_SMP_PEND, |
| 447 | HCI_CONN_MGMT_CONNECTED, | 500 | HCI_CONN_MGMT_CONNECTED, |
| 448 | HCI_CONN_SSP_ENABLED, | 501 | HCI_CONN_SSP_ENABLED, |
| 502 | HCI_CONN_SC_ENABLED, | ||
| 503 | HCI_CONN_AES_CCM, | ||
| 449 | HCI_CONN_POWER_SAVE, | 504 | HCI_CONN_POWER_SAVE, |
| 450 | HCI_CONN_REMOTE_OOB, | 505 | HCI_CONN_REMOTE_OOB, |
| 451 | HCI_CONN_6LOWPAN, | 506 | HCI_CONN_6LOWPAN, |
| @@ -458,6 +513,13 @@ static inline bool hci_conn_ssp_enabled(struct hci_conn *conn) | |||
| 458 | test_bit(HCI_CONN_SSP_ENABLED, &conn->flags); | 513 | test_bit(HCI_CONN_SSP_ENABLED, &conn->flags); |
| 459 | } | 514 | } |
| 460 | 515 | ||
| 516 | static inline bool hci_conn_sc_enabled(struct hci_conn *conn) | ||
| 517 | { | ||
| 518 | struct hci_dev *hdev = conn->hdev; | ||
| 519 | return test_bit(HCI_SC_ENABLED, &hdev->dev_flags) && | ||
| 520 | test_bit(HCI_CONN_SC_ENABLED, &conn->flags); | ||
| 521 | } | ||
| 522 | |||
| 461 | static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c) | 523 | static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c) |
| 462 | { | 524 | { |
| 463 | struct hci_conn_hash *h = &hdev->conn_hash; | 525 | struct hci_conn_hash *h = &hdev->conn_hash; |
| @@ -521,6 +583,13 @@ static inline unsigned int hci_conn_num(struct hci_dev *hdev, __u8 type) | |||
| 521 | } | 583 | } |
| 522 | } | 584 | } |
| 523 | 585 | ||
| 586 | static inline unsigned int hci_conn_count(struct hci_dev *hdev) | ||
| 587 | { | ||
| 588 | struct hci_conn_hash *c = &hdev->conn_hash; | ||
| 589 | |||
| 590 | return c->acl_num + c->amp_num + c->sco_num + c->le_num; | ||
| 591 | } | ||
| 592 | |||
| 524 | static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev, | 593 | static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev, |
| 525 | __u16 handle) | 594 | __u16 handle) |
| 526 | { | 595 | { |
| @@ -594,8 +663,10 @@ void hci_chan_del(struct hci_chan *chan); | |||
| 594 | void hci_chan_list_flush(struct hci_conn *conn); | 663 | void hci_chan_list_flush(struct hci_conn *conn); |
| 595 | struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle); | 664 | struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle); |
| 596 | 665 | ||
| 597 | struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, | 666 | struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, |
| 598 | __u8 dst_type, __u8 sec_level, __u8 auth_type); | 667 | u8 dst_type, u8 sec_level, u8 auth_type); |
| 668 | struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst, | ||
| 669 | u8 sec_level, u8 auth_type); | ||
| 599 | struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst, | 670 | struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst, |
| 600 | __u16 setting); | 671 | __u16 setting); |
| 601 | int hci_conn_check_link_mode(struct hci_conn *conn); | 672 | int hci_conn_check_link_mode(struct hci_conn *conn); |
| @@ -606,6 +677,8 @@ int hci_conn_switch_role(struct hci_conn *conn, __u8 role); | |||
| 606 | 677 | ||
| 607 | void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active); | 678 | void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active); |
| 608 | 679 | ||
| 680 | void hci_le_conn_failed(struct hci_conn *conn, u8 status); | ||
| 681 | |||
| 609 | /* | 682 | /* |
| 610 | * hci_conn_get() and hci_conn_put() are used to control the life-time of an | 683 | * hci_conn_get() and hci_conn_put() are used to control the life-time of an |
| 611 | * "hci_conn" object. They do not guarantee that the hci_conn object is running, | 684 | * "hci_conn" object. They do not guarantee that the hci_conn object is running, |
| @@ -737,31 +810,64 @@ int hci_inquiry(void __user *arg); | |||
| 737 | 810 | ||
| 738 | struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, | 811 | struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, |
| 739 | bdaddr_t *bdaddr, u8 type); | 812 | bdaddr_t *bdaddr, u8 type); |
| 740 | int hci_blacklist_clear(struct hci_dev *hdev); | ||
| 741 | int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); | 813 | int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); |
| 742 | int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); | 814 | int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); |
| 743 | 815 | ||
| 744 | int hci_uuids_clear(struct hci_dev *hdev); | 816 | struct bdaddr_list *hci_white_list_lookup(struct hci_dev *hdev, |
| 817 | bdaddr_t *bdaddr, u8 type); | ||
| 818 | void hci_white_list_clear(struct hci_dev *hdev); | ||
| 819 | int hci_white_list_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); | ||
| 820 | int hci_white_list_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); | ||
| 821 | |||
| 822 | struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev, | ||
| 823 | bdaddr_t *addr, u8 addr_type); | ||
| 824 | int hci_conn_params_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type, | ||
| 825 | u8 auto_connect, u16 conn_min_interval, | ||
| 826 | u16 conn_max_interval); | ||
| 827 | void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type); | ||
| 828 | void hci_conn_params_clear(struct hci_dev *hdev); | ||
| 829 | |||
| 830 | struct bdaddr_list *hci_pend_le_conn_lookup(struct hci_dev *hdev, | ||
| 831 | bdaddr_t *addr, u8 addr_type); | ||
| 832 | void hci_pend_le_conn_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type); | ||
| 833 | void hci_pend_le_conn_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type); | ||
| 834 | void hci_pend_le_conns_clear(struct hci_dev *hdev); | ||
| 835 | |||
| 836 | void hci_update_background_scan(struct hci_dev *hdev); | ||
| 745 | 837 | ||
| 746 | int hci_link_keys_clear(struct hci_dev *hdev); | 838 | void hci_uuids_clear(struct hci_dev *hdev); |
| 839 | |||
| 840 | void hci_link_keys_clear(struct hci_dev *hdev); | ||
| 747 | struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr); | 841 | struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr); |
| 748 | int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key, | 842 | int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key, |
| 749 | bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len); | 843 | bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len); |
| 750 | struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, u8 rand[8]); | 844 | struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, __le64 rand, |
| 751 | int hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type, u8 type, | 845 | bool master); |
| 752 | int new_key, u8 authenticated, u8 tk[16], u8 enc_size, | 846 | struct smp_ltk *hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, |
| 753 | __le16 ediv, u8 rand[8]); | 847 | u8 addr_type, u8 type, u8 authenticated, |
| 848 | u8 tk[16], u8 enc_size, __le16 ediv, __le64 rand); | ||
| 754 | struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr, | 849 | struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr, |
| 755 | u8 addr_type); | 850 | u8 addr_type, bool master); |
| 756 | int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr); | 851 | int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type); |
| 757 | int hci_smp_ltks_clear(struct hci_dev *hdev); | 852 | void hci_smp_ltks_clear(struct hci_dev *hdev); |
| 758 | int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr); | 853 | int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr); |
| 759 | 854 | ||
| 760 | int hci_remote_oob_data_clear(struct hci_dev *hdev); | 855 | struct smp_irk *hci_find_irk_by_rpa(struct hci_dev *hdev, bdaddr_t *rpa); |
| 856 | struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr, | ||
| 857 | u8 addr_type); | ||
| 858 | struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, | ||
| 859 | u8 addr_type, u8 val[16], bdaddr_t *rpa); | ||
| 860 | void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type); | ||
| 861 | void hci_smp_irks_clear(struct hci_dev *hdev); | ||
| 862 | |||
| 863 | void hci_remote_oob_data_clear(struct hci_dev *hdev); | ||
| 761 | struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev, | 864 | struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev, |
| 762 | bdaddr_t *bdaddr); | 865 | bdaddr_t *bdaddr); |
| 763 | int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash, | 866 | int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, |
| 764 | u8 *randomizer); | 867 | u8 *hash, u8 *randomizer); |
| 868 | int hci_add_remote_oob_ext_data(struct hci_dev *hdev, bdaddr_t *bdaddr, | ||
| 869 | u8 *hash192, u8 *randomizer192, | ||
| 870 | u8 *hash256, u8 *randomizer256); | ||
| 765 | int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr); | 871 | int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr); |
| 766 | 872 | ||
| 767 | void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb); | 873 | void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb); |
| @@ -803,9 +909,12 @@ void hci_conn_del_sysfs(struct hci_conn *conn); | |||
| 803 | #define lmp_csb_slave_capable(dev) ((dev)->features[2][0] & LMP_CSB_SLAVE) | 909 | #define lmp_csb_slave_capable(dev) ((dev)->features[2][0] & LMP_CSB_SLAVE) |
| 804 | #define lmp_sync_train_capable(dev) ((dev)->features[2][0] & LMP_SYNC_TRAIN) | 910 | #define lmp_sync_train_capable(dev) ((dev)->features[2][0] & LMP_SYNC_TRAIN) |
| 805 | #define lmp_sync_scan_capable(dev) ((dev)->features[2][0] & LMP_SYNC_SCAN) | 911 | #define lmp_sync_scan_capable(dev) ((dev)->features[2][0] & LMP_SYNC_SCAN) |
| 912 | #define lmp_sc_capable(dev) ((dev)->features[2][1] & LMP_SC) | ||
| 913 | #define lmp_ping_capable(dev) ((dev)->features[2][1] & LMP_PING) | ||
| 806 | 914 | ||
| 807 | /* ----- Host capabilities ----- */ | 915 | /* ----- Host capabilities ----- */ |
| 808 | #define lmp_host_ssp_capable(dev) ((dev)->features[1][0] & LMP_HOST_SSP) | 916 | #define lmp_host_ssp_capable(dev) ((dev)->features[1][0] & LMP_HOST_SSP) |
| 917 | #define lmp_host_sc_capable(dev) ((dev)->features[1][0] & LMP_HOST_SC) | ||
| 809 | #define lmp_host_le_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE)) | 918 | #define lmp_host_le_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE)) |
| 810 | #define lmp_host_le_br_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE_BREDR)) | 919 | #define lmp_host_le_br_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE_BREDR)) |
| 811 | 920 | ||
| @@ -1019,6 +1128,26 @@ static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type) | |||
| 1019 | return false; | 1128 | return false; |
| 1020 | } | 1129 | } |
| 1021 | 1130 | ||
| 1131 | static inline bool hci_bdaddr_is_rpa(bdaddr_t *bdaddr, u8 addr_type) | ||
| 1132 | { | ||
| 1133 | if (addr_type != 0x01) | ||
| 1134 | return false; | ||
| 1135 | |||
| 1136 | if ((bdaddr->b[5] & 0xc0) == 0x40) | ||
| 1137 | return true; | ||
| 1138 | |||
| 1139 | return false; | ||
| 1140 | } | ||
| 1141 | |||
| 1142 | static inline struct smp_irk *hci_get_irk(struct hci_dev *hdev, | ||
| 1143 | bdaddr_t *bdaddr, u8 addr_type) | ||
| 1144 | { | ||
| 1145 | if (!hci_bdaddr_is_rpa(bdaddr, addr_type)) | ||
| 1146 | return NULL; | ||
| 1147 | |||
| 1148 | return hci_find_irk_by_rpa(hdev, bdaddr); | ||
| 1149 | } | ||
| 1150 | |||
| 1022 | int hci_register_cb(struct hci_cb *hcb); | 1151 | int hci_register_cb(struct hci_cb *hcb); |
| 1023 | int hci_unregister_cb(struct hci_cb *hcb); | 1152 | int hci_unregister_cb(struct hci_cb *hcb); |
| 1024 | 1153 | ||
| @@ -1040,6 +1169,9 @@ void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen, | |||
| 1040 | const void *param, u8 event); | 1169 | const void *param, u8 event); |
| 1041 | void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status); | 1170 | void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status); |
| 1042 | 1171 | ||
| 1172 | void hci_req_add_le_scan_disable(struct hci_request *req); | ||
| 1173 | void hci_req_add_le_passive_scan(struct hci_request *req); | ||
| 1174 | |||
| 1043 | struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, | 1175 | struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, |
| 1044 | const void *param, u32 timeout); | 1176 | const void *param, u32 timeout); |
| 1045 | struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen, | 1177 | struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen, |
| @@ -1085,6 +1217,7 @@ int mgmt_powered(struct hci_dev *hdev, u8 powered); | |||
| 1085 | void mgmt_discoverable_timeout(struct hci_dev *hdev); | 1217 | void mgmt_discoverable_timeout(struct hci_dev *hdev); |
| 1086 | void mgmt_discoverable(struct hci_dev *hdev, u8 discoverable); | 1218 | void mgmt_discoverable(struct hci_dev *hdev, u8 discoverable); |
| 1087 | void mgmt_connectable(struct hci_dev *hdev, u8 connectable); | 1219 | void mgmt_connectable(struct hci_dev *hdev, u8 connectable); |
| 1220 | void mgmt_advertising(struct hci_dev *hdev, u8 advertising); | ||
| 1088 | void mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status); | 1221 | void mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status); |
| 1089 | void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key, | 1222 | void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key, |
| 1090 | bool persistent); | 1223 | bool persistent); |
| @@ -1092,7 +1225,8 @@ void mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, | |||
| 1092 | u8 addr_type, u32 flags, u8 *name, u8 name_len, | 1225 | u8 addr_type, u32 flags, u8 *name, u8 name_len, |
| 1093 | u8 *dev_class); | 1226 | u8 *dev_class); |
| 1094 | void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr, | 1227 | void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr, |
| 1095 | u8 link_type, u8 addr_type, u8 reason); | 1228 | u8 link_type, u8 addr_type, u8 reason, |
| 1229 | bool mgmt_connected); | ||
| 1096 | void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, | 1230 | void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, |
| 1097 | u8 link_type, u8 addr_type, u8 status); | 1231 | u8 link_type, u8 addr_type, u8 status); |
| 1098 | void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, | 1232 | void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, |
| @@ -1103,7 +1237,7 @@ void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, | |||
| 1103 | void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, | 1237 | void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, |
| 1104 | u8 status); | 1238 | u8 status); |
| 1105 | int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr, | 1239 | int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr, |
| 1106 | u8 link_type, u8 addr_type, __le32 value, | 1240 | u8 link_type, u8 addr_type, u32 value, |
| 1107 | u8 confirm_hint); | 1241 | u8 confirm_hint); |
| 1108 | int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, | 1242 | int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, |
| 1109 | u8 link_type, u8 addr_type, u8 status); | 1243 | u8 link_type, u8 addr_type, u8 status); |
| @@ -1122,11 +1256,13 @@ void mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, | |||
| 1122 | u8 addr_type, u8 status); | 1256 | u8 addr_type, u8 status); |
| 1123 | void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status); | 1257 | void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status); |
| 1124 | void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); | 1258 | void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); |
| 1259 | void mgmt_sc_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); | ||
| 1125 | void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, | 1260 | void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, |
| 1126 | u8 status); | 1261 | u8 status); |
| 1127 | void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status); | 1262 | void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status); |
| 1128 | void mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash, | 1263 | void mgmt_read_local_oob_data_complete(struct hci_dev *hdev, u8 *hash192, |
| 1129 | u8 *randomizer, u8 status); | 1264 | u8 *randomizer192, u8 *hash256, |
| 1265 | u8 *randomizer256, u8 status); | ||
| 1130 | void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, | 1266 | void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, |
| 1131 | u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, | 1267 | u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, |
| 1132 | u8 ssp, u8 *eir, u16 eir_len); | 1268 | u8 ssp, u8 *eir, u16 eir_len); |
| @@ -1135,8 +1271,12 @@ void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, | |||
| 1135 | void mgmt_discovering(struct hci_dev *hdev, u8 discovering); | 1271 | void mgmt_discovering(struct hci_dev *hdev, u8 discovering); |
| 1136 | int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); | 1272 | int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); |
| 1137 | int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); | 1273 | int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); |
| 1138 | void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent); | 1274 | void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, bool persistent); |
| 1275 | void mgmt_new_irk(struct hci_dev *hdev, struct smp_irk *irk); | ||
| 1276 | void mgmt_new_csrk(struct hci_dev *hdev, struct smp_csrk *csrk, | ||
| 1277 | bool persistent); | ||
| 1139 | void mgmt_reenable_advertising(struct hci_dev *hdev); | 1278 | void mgmt_reenable_advertising(struct hci_dev *hdev); |
| 1279 | void mgmt_smp_complete(struct hci_conn *conn, bool complete); | ||
| 1140 | 1280 | ||
| 1141 | /* HCI info for socket */ | 1281 | /* HCI info for socket */ |
| 1142 | #define hci_pi(sk) ((struct hci_pinfo *) sk) | 1282 | #define hci_pi(sk) ((struct hci_pinfo *) sk) |
| @@ -1168,9 +1308,14 @@ struct hci_sec_filter { | |||
| 1168 | 1308 | ||
| 1169 | void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, | 1309 | void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, |
| 1170 | u16 latency, u16 to_multiplier); | 1310 | u16 latency, u16 to_multiplier); |
| 1171 | void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8], | 1311 | void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __le64 rand, |
| 1172 | __u8 ltk[16]); | 1312 | __u8 ltk[16]); |
| 1173 | 1313 | ||
| 1314 | int hci_update_random_address(struct hci_request *req, bool require_privacy, | ||
| 1315 | u8 *own_addr_type); | ||
| 1316 | void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr, | ||
| 1317 | u8 *bdaddr_type); | ||
| 1318 | |||
| 1174 | #define SCO_AIRMODE_MASK 0x0003 | 1319 | #define SCO_AIRMODE_MASK 0x0003 |
| 1175 | #define SCO_AIRMODE_CVSD 0x0000 | 1320 | #define SCO_AIRMODE_CVSD 0x0000 |
| 1176 | #define SCO_AIRMODE_TRANSP 0x0003 | 1321 | #define SCO_AIRMODE_TRANSP 0x0003 |
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index dbc4a89984ca..4abdcb220e3a 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
| @@ -91,6 +91,7 @@ struct l2cap_conninfo { | |||
| 91 | #define L2CAP_LM_TRUSTED 0x0008 | 91 | #define L2CAP_LM_TRUSTED 0x0008 |
| 92 | #define L2CAP_LM_RELIABLE 0x0010 | 92 | #define L2CAP_LM_RELIABLE 0x0010 |
| 93 | #define L2CAP_LM_SECURE 0x0020 | 93 | #define L2CAP_LM_SECURE 0x0020 |
| 94 | #define L2CAP_LM_FIPS 0x0040 | ||
| 94 | 95 | ||
| 95 | /* L2CAP command codes */ | 96 | /* L2CAP command codes */ |
| 96 | #define L2CAP_COMMAND_REJ 0x01 | 97 | #define L2CAP_COMMAND_REJ 0x01 |
| @@ -623,6 +624,9 @@ struct l2cap_conn { | |||
| 623 | __u32 rx_len; | 624 | __u32 rx_len; |
| 624 | __u8 tx_ident; | 625 | __u8 tx_ident; |
| 625 | 626 | ||
| 627 | struct sk_buff_head pending_rx; | ||
| 628 | struct work_struct pending_rx_work; | ||
| 629 | |||
| 626 | __u8 disc_reason; | 630 | __u8 disc_reason; |
| 627 | 631 | ||
| 628 | struct delayed_work security_timer; | 632 | struct delayed_work security_timer; |
| @@ -647,7 +651,7 @@ struct l2cap_user { | |||
| 647 | #define L2CAP_CHAN_RAW 1 | 651 | #define L2CAP_CHAN_RAW 1 |
| 648 | #define L2CAP_CHAN_CONN_LESS 2 | 652 | #define L2CAP_CHAN_CONN_LESS 2 |
| 649 | #define L2CAP_CHAN_CONN_ORIENTED 3 | 653 | #define L2CAP_CHAN_CONN_ORIENTED 3 |
| 650 | #define L2CAP_CHAN_CONN_FIX_A2MP 4 | 654 | #define L2CAP_CHAN_FIXED 4 |
| 651 | 655 | ||
| 652 | /* ----- L2CAP socket info ----- */ | 656 | /* ----- L2CAP socket info ----- */ |
| 653 | #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) | 657 | #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) |
| @@ -853,7 +857,6 @@ static inline long l2cap_chan_no_get_sndtimeo(struct l2cap_chan *chan) | |||
| 853 | } | 857 | } |
| 854 | 858 | ||
| 855 | extern bool disable_ertm; | 859 | extern bool disable_ertm; |
| 856 | extern bool enable_lecoc; | ||
| 857 | 860 | ||
| 858 | int l2cap_init_sockets(void); | 861 | int l2cap_init_sockets(void); |
| 859 | void l2cap_cleanup_sockets(void); | 862 | void l2cap_cleanup_sockets(void); |
| @@ -878,6 +881,7 @@ int l2cap_ertm_init(struct l2cap_chan *chan); | |||
| 878 | void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); | 881 | void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); |
| 879 | void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); | 882 | void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); |
| 880 | void l2cap_chan_del(struct l2cap_chan *chan, int err); | 883 | void l2cap_chan_del(struct l2cap_chan *chan, int err); |
| 884 | void l2cap_conn_update_id_addr(struct hci_conn *hcon); | ||
| 881 | void l2cap_send_conn_req(struct l2cap_chan *chan); | 885 | void l2cap_send_conn_req(struct l2cap_chan *chan); |
| 882 | void l2cap_move_start(struct l2cap_chan *chan); | 886 | void l2cap_move_start(struct l2cap_chan *chan); |
| 883 | void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan, | 887 | void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan, |
diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h index 518c5c84e39a..d4b571c2f9fd 100644 --- a/include/net/bluetooth/mgmt.h +++ b/include/net/bluetooth/mgmt.h | |||
| @@ -94,6 +94,9 @@ struct mgmt_rp_read_index_list { | |||
| 94 | #define MGMT_SETTING_HS 0x00000100 | 94 | #define MGMT_SETTING_HS 0x00000100 |
| 95 | #define MGMT_SETTING_LE 0x00000200 | 95 | #define MGMT_SETTING_LE 0x00000200 |
| 96 | #define MGMT_SETTING_ADVERTISING 0x00000400 | 96 | #define MGMT_SETTING_ADVERTISING 0x00000400 |
| 97 | #define MGMT_SETTING_SECURE_CONN 0x00000800 | ||
| 98 | #define MGMT_SETTING_DEBUG_KEYS 0x00001000 | ||
| 99 | #define MGMT_SETTING_PRIVACY 0x00002000 | ||
| 97 | 100 | ||
| 98 | #define MGMT_OP_READ_INFO 0x0004 | 101 | #define MGMT_OP_READ_INFO 0x0004 |
| 99 | #define MGMT_READ_INFO_SIZE 0 | 102 | #define MGMT_READ_INFO_SIZE 0 |
| @@ -180,11 +183,11 @@ struct mgmt_cp_load_link_keys { | |||
| 180 | 183 | ||
| 181 | struct mgmt_ltk_info { | 184 | struct mgmt_ltk_info { |
| 182 | struct mgmt_addr_info addr; | 185 | struct mgmt_addr_info addr; |
| 183 | __u8 authenticated; | 186 | __u8 type; |
| 184 | __u8 master; | 187 | __u8 master; |
| 185 | __u8 enc_size; | 188 | __u8 enc_size; |
| 186 | __le16 ediv; | 189 | __le16 ediv; |
| 187 | __u8 rand[8]; | 190 | __le64 rand; |
| 188 | __u8 val[16]; | 191 | __u8 val[16]; |
| 189 | } __packed; | 192 | } __packed; |
| 190 | 193 | ||
| @@ -294,6 +297,12 @@ struct mgmt_rp_read_local_oob_data { | |||
| 294 | __u8 hash[16]; | 297 | __u8 hash[16]; |
| 295 | __u8 randomizer[16]; | 298 | __u8 randomizer[16]; |
| 296 | } __packed; | 299 | } __packed; |
| 300 | struct mgmt_rp_read_local_oob_ext_data { | ||
| 301 | __u8 hash192[16]; | ||
| 302 | __u8 randomizer192[16]; | ||
| 303 | __u8 hash256[16]; | ||
| 304 | __u8 randomizer256[16]; | ||
| 305 | } __packed; | ||
| 297 | 306 | ||
| 298 | #define MGMT_OP_ADD_REMOTE_OOB_DATA 0x0021 | 307 | #define MGMT_OP_ADD_REMOTE_OOB_DATA 0x0021 |
| 299 | struct mgmt_cp_add_remote_oob_data { | 308 | struct mgmt_cp_add_remote_oob_data { |
| @@ -302,6 +311,14 @@ struct mgmt_cp_add_remote_oob_data { | |||
| 302 | __u8 randomizer[16]; | 311 | __u8 randomizer[16]; |
| 303 | } __packed; | 312 | } __packed; |
| 304 | #define MGMT_ADD_REMOTE_OOB_DATA_SIZE (MGMT_ADDR_INFO_SIZE + 32) | 313 | #define MGMT_ADD_REMOTE_OOB_DATA_SIZE (MGMT_ADDR_INFO_SIZE + 32) |
| 314 | struct mgmt_cp_add_remote_oob_ext_data { | ||
| 315 | struct mgmt_addr_info addr; | ||
| 316 | __u8 hash192[16]; | ||
| 317 | __u8 randomizer192[16]; | ||
| 318 | __u8 hash256[16]; | ||
| 319 | __u8 randomizer256[16]; | ||
| 320 | } __packed; | ||
| 321 | #define MGMT_ADD_REMOTE_OOB_EXT_DATA_SIZE (MGMT_ADDR_INFO_SIZE + 64) | ||
| 305 | 322 | ||
| 306 | #define MGMT_OP_REMOVE_REMOTE_OOB_DATA 0x0022 | 323 | #define MGMT_OP_REMOVE_REMOTE_OOB_DATA 0x0022 |
| 307 | struct mgmt_cp_remove_remote_oob_data { | 324 | struct mgmt_cp_remove_remote_oob_data { |
| @@ -369,6 +386,29 @@ struct mgmt_cp_set_scan_params { | |||
| 369 | } __packed; | 386 | } __packed; |
| 370 | #define MGMT_SET_SCAN_PARAMS_SIZE 4 | 387 | #define MGMT_SET_SCAN_PARAMS_SIZE 4 |
| 371 | 388 | ||
| 389 | #define MGMT_OP_SET_SECURE_CONN 0x002D | ||
| 390 | |||
| 391 | #define MGMT_OP_SET_DEBUG_KEYS 0x002E | ||
| 392 | |||
| 393 | #define MGMT_OP_SET_PRIVACY 0x002F | ||
| 394 | struct mgmt_cp_set_privacy { | ||
| 395 | __u8 privacy; | ||
| 396 | __u8 irk[16]; | ||
| 397 | } __packed; | ||
| 398 | #define MGMT_SET_PRIVACY_SIZE 17 | ||
| 399 | |||
| 400 | struct mgmt_irk_info { | ||
| 401 | struct mgmt_addr_info addr; | ||
| 402 | __u8 val[16]; | ||
| 403 | } __packed; | ||
| 404 | |||
| 405 | #define MGMT_OP_LOAD_IRKS 0x0030 | ||
| 406 | struct mgmt_cp_load_irks { | ||
| 407 | __le16 irk_count; | ||
| 408 | struct mgmt_irk_info irks[0]; | ||
| 409 | } __packed; | ||
| 410 | #define MGMT_LOAD_IRKS_SIZE 2 | ||
| 411 | |||
| 372 | #define MGMT_EV_CMD_COMPLETE 0x0001 | 412 | #define MGMT_EV_CMD_COMPLETE 0x0001 |
| 373 | struct mgmt_ev_cmd_complete { | 413 | struct mgmt_ev_cmd_complete { |
| 374 | __le16 opcode; | 414 | __le16 opcode; |
| @@ -504,3 +544,22 @@ struct mgmt_ev_passkey_notify { | |||
| 504 | __le32 passkey; | 544 | __le32 passkey; |
| 505 | __u8 entered; | 545 | __u8 entered; |
| 506 | } __packed; | 546 | } __packed; |
| 547 | |||
| 548 | #define MGMT_EV_NEW_IRK 0x0018 | ||
| 549 | struct mgmt_ev_new_irk { | ||
| 550 | __u8 store_hint; | ||
| 551 | bdaddr_t rpa; | ||
| 552 | struct mgmt_irk_info irk; | ||
| 553 | } __packed; | ||
| 554 | |||
| 555 | struct mgmt_csrk_info { | ||
| 556 | struct mgmt_addr_info addr; | ||
| 557 | __u8 master; | ||
| 558 | __u8 val[16]; | ||
| 559 | } __packed; | ||
| 560 | |||
| 561 | #define MGMT_EV_NEW_CSRK 0x0019 | ||
| 562 | struct mgmt_ev_new_csrk { | ||
| 563 | __u8 store_hint; | ||
| 564 | struct mgmt_csrk_info key; | ||
| 565 | } __packed; | ||
diff --git a/include/net/bluetooth/rfcomm.h b/include/net/bluetooth/rfcomm.h index 486213a1aed8..2611cc389d7d 100644 --- a/include/net/bluetooth/rfcomm.h +++ b/include/net/bluetooth/rfcomm.h | |||
| @@ -238,9 +238,11 @@ int rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, | |||
| 238 | u8 channel); | 238 | u8 channel); |
| 239 | int rfcomm_dlc_close(struct rfcomm_dlc *d, int reason); | 239 | int rfcomm_dlc_close(struct rfcomm_dlc *d, int reason); |
| 240 | int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb); | 240 | int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb); |
| 241 | void rfcomm_dlc_send_noerror(struct rfcomm_dlc *d, struct sk_buff *skb); | ||
| 241 | int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig); | 242 | int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig); |
| 242 | int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig); | 243 | int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig); |
| 243 | void rfcomm_dlc_accept(struct rfcomm_dlc *d); | 244 | void rfcomm_dlc_accept(struct rfcomm_dlc *d); |
| 245 | struct rfcomm_dlc *rfcomm_dlc_exists(bdaddr_t *src, bdaddr_t *dst, u8 channel); | ||
| 244 | 246 | ||
| 245 | #define rfcomm_dlc_lock(d) spin_lock(&d->lock) | 247 | #define rfcomm_dlc_lock(d) spin_lock(&d->lock) |
| 246 | #define rfcomm_dlc_unlock(d) spin_unlock(&d->lock) | 248 | #define rfcomm_dlc_unlock(d) spin_unlock(&d->lock) |
| @@ -295,6 +297,7 @@ struct rfcomm_conninfo { | |||
| 295 | #define RFCOMM_LM_TRUSTED 0x0008 | 297 | #define RFCOMM_LM_TRUSTED 0x0008 |
| 296 | #define RFCOMM_LM_RELIABLE 0x0010 | 298 | #define RFCOMM_LM_RELIABLE 0x0010 |
| 297 | #define RFCOMM_LM_SECURE 0x0020 | 299 | #define RFCOMM_LM_SECURE 0x0020 |
| 300 | #define RFCOMM_LM_FIPS 0x0040 | ||
| 298 | 301 | ||
| 299 | #define rfcomm_pi(sk) ((struct rfcomm_pinfo *) sk) | 302 | #define rfcomm_pi(sk) ((struct rfcomm_pinfo *) sk) |
| 300 | 303 | ||
| @@ -323,11 +326,16 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, | |||
| 323 | #define RFCOMMGETDEVINFO _IOR('R', 211, int) | 326 | #define RFCOMMGETDEVINFO _IOR('R', 211, int) |
| 324 | #define RFCOMMSTEALDLC _IOW('R', 220, int) | 327 | #define RFCOMMSTEALDLC _IOW('R', 220, int) |
| 325 | 328 | ||
| 329 | /* rfcomm_dev.flags bit definitions */ | ||
| 326 | #define RFCOMM_REUSE_DLC 0 | 330 | #define RFCOMM_REUSE_DLC 0 |
| 327 | #define RFCOMM_RELEASE_ONHUP 1 | 331 | #define RFCOMM_RELEASE_ONHUP 1 |
| 328 | #define RFCOMM_HANGUP_NOW 2 | 332 | #define RFCOMM_HANGUP_NOW 2 |
| 329 | #define RFCOMM_TTY_ATTACHED 3 | 333 | #define RFCOMM_TTY_ATTACHED 3 |
| 330 | #define RFCOMM_TTY_RELEASED 4 | 334 | #define RFCOMM_DEFUNCT_BIT4 4 /* don't reuse this bit - userspace visible */ |
| 335 | |||
| 336 | /* rfcomm_dev.status bit definitions */ | ||
| 337 | #define RFCOMM_DEV_RELEASED 0 | ||
| 338 | #define RFCOMM_TTY_OWNED 1 | ||
| 331 | 339 | ||
| 332 | struct rfcomm_dev_req { | 340 | struct rfcomm_dev_req { |
| 333 | s16 dev_id; | 341 | s16 dev_id; |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index b1f84b05c67e..f3539a15c411 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
| @@ -151,6 +151,7 @@ enum ieee80211_channel_flags { | |||
| 151 | * @dfs_state: current state of this channel. Only relevant if radar is required | 151 | * @dfs_state: current state of this channel. Only relevant if radar is required |
| 152 | * on this channel. | 152 | * on this channel. |
| 153 | * @dfs_state_entered: timestamp (jiffies) when the dfs state was entered. | 153 | * @dfs_state_entered: timestamp (jiffies) when the dfs state was entered. |
| 154 | * @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels. | ||
| 154 | */ | 155 | */ |
| 155 | struct ieee80211_channel { | 156 | struct ieee80211_channel { |
| 156 | enum ieee80211_band band; | 157 | enum ieee80211_band band; |
| @@ -165,6 +166,7 @@ struct ieee80211_channel { | |||
| 165 | int orig_mag, orig_mpwr; | 166 | int orig_mag, orig_mpwr; |
| 166 | enum nl80211_dfs_state dfs_state; | 167 | enum nl80211_dfs_state dfs_state; |
| 167 | unsigned long dfs_state_entered; | 168 | unsigned long dfs_state_entered; |
| 169 | unsigned int dfs_cac_ms; | ||
| 168 | }; | 170 | }; |
| 169 | 171 | ||
| 170 | /** | 172 | /** |
| @@ -1394,10 +1396,12 @@ struct cfg80211_scan_request { | |||
| 1394 | /** | 1396 | /** |
| 1395 | * struct cfg80211_match_set - sets of attributes to match | 1397 | * struct cfg80211_match_set - sets of attributes to match |
| 1396 | * | 1398 | * |
| 1397 | * @ssid: SSID to be matched | 1399 | * @ssid: SSID to be matched; may be zero-length for no match (RSSI only) |
| 1400 | * @rssi_thold: don't report scan results below this threshold (in s32 dBm) | ||
| 1398 | */ | 1401 | */ |
| 1399 | struct cfg80211_match_set { | 1402 | struct cfg80211_match_set { |
| 1400 | struct cfg80211_ssid ssid; | 1403 | struct cfg80211_ssid ssid; |
| 1404 | s32 rssi_thold; | ||
| 1401 | }; | 1405 | }; |
| 1402 | 1406 | ||
| 1403 | /** | 1407 | /** |
| @@ -1420,7 +1424,8 @@ struct cfg80211_match_set { | |||
| 1420 | * @dev: the interface | 1424 | * @dev: the interface |
| 1421 | * @scan_start: start time of the scheduled scan | 1425 | * @scan_start: start time of the scheduled scan |
| 1422 | * @channels: channels to scan | 1426 | * @channels: channels to scan |
| 1423 | * @rssi_thold: don't report scan results below this threshold (in s32 dBm) | 1427 | * @min_rssi_thold: for drivers only supporting a single threshold, this |
| 1428 | * contains the minimum over all matchsets | ||
| 1424 | */ | 1429 | */ |
| 1425 | struct cfg80211_sched_scan_request { | 1430 | struct cfg80211_sched_scan_request { |
| 1426 | struct cfg80211_ssid *ssids; | 1431 | struct cfg80211_ssid *ssids; |
| @@ -1433,7 +1438,7 @@ struct cfg80211_sched_scan_request { | |||
| 1433 | u32 flags; | 1438 | u32 flags; |
| 1434 | struct cfg80211_match_set *match_sets; | 1439 | struct cfg80211_match_set *match_sets; |
| 1435 | int n_match_sets; | 1440 | int n_match_sets; |
| 1436 | s32 rssi_thold; | 1441 | s32 min_rssi_thold; |
| 1437 | 1442 | ||
| 1438 | /* internal */ | 1443 | /* internal */ |
| 1439 | struct wiphy *wiphy; | 1444 | struct wiphy *wiphy; |
| @@ -1701,8 +1706,14 @@ struct cfg80211_ibss_params { | |||
| 1701 | * | 1706 | * |
| 1702 | * @channel: The channel to use or %NULL if not specified (auto-select based | 1707 | * @channel: The channel to use or %NULL if not specified (auto-select based |
| 1703 | * on scan results) | 1708 | * on scan results) |
| 1709 | * @channel_hint: The channel of the recommended BSS for initial connection or | ||
| 1710 | * %NULL if not specified | ||
| 1704 | * @bssid: The AP BSSID or %NULL if not specified (auto-select based on scan | 1711 | * @bssid: The AP BSSID or %NULL if not specified (auto-select based on scan |
| 1705 | * results) | 1712 | * results) |
| 1713 | * @bssid_hint: The recommended AP BSSID for initial connection to the BSS or | ||
| 1714 | * %NULL if not specified. Unlike the @bssid parameter, the driver is | ||
| 1715 | * allowed to ignore this @bssid_hint if it has knowledge of a better BSS | ||
| 1716 | * to use. | ||
| 1706 | * @ssid: SSID | 1717 | * @ssid: SSID |
| 1707 | * @ssid_len: Length of ssid in octets | 1718 | * @ssid_len: Length of ssid in octets |
| 1708 | * @auth_type: Authentication type (algorithm) | 1719 | * @auth_type: Authentication type (algorithm) |
| @@ -1725,11 +1736,13 @@ struct cfg80211_ibss_params { | |||
| 1725 | */ | 1736 | */ |
| 1726 | struct cfg80211_connect_params { | 1737 | struct cfg80211_connect_params { |
| 1727 | struct ieee80211_channel *channel; | 1738 | struct ieee80211_channel *channel; |
| 1728 | u8 *bssid; | 1739 | struct ieee80211_channel *channel_hint; |
| 1729 | u8 *ssid; | 1740 | const u8 *bssid; |
| 1741 | const u8 *bssid_hint; | ||
| 1742 | const u8 *ssid; | ||
| 1730 | size_t ssid_len; | 1743 | size_t ssid_len; |
| 1731 | enum nl80211_auth_type auth_type; | 1744 | enum nl80211_auth_type auth_type; |
| 1732 | u8 *ie; | 1745 | const u8 *ie; |
| 1733 | size_t ie_len; | 1746 | size_t ie_len; |
| 1734 | bool privacy; | 1747 | bool privacy; |
| 1735 | enum nl80211_mfp mfp; | 1748 | enum nl80211_mfp mfp; |
| @@ -1768,6 +1781,7 @@ struct cfg80211_bitrate_mask { | |||
| 1768 | u32 legacy; | 1781 | u32 legacy; |
| 1769 | u8 ht_mcs[IEEE80211_HT_MCS_MASK_LEN]; | 1782 | u8 ht_mcs[IEEE80211_HT_MCS_MASK_LEN]; |
| 1770 | u16 vht_mcs[NL80211_VHT_NSS_MAX]; | 1783 | u16 vht_mcs[NL80211_VHT_NSS_MAX]; |
| 1784 | enum nl80211_txrate_gi gi; | ||
| 1771 | } control[IEEE80211_NUM_BANDS]; | 1785 | } control[IEEE80211_NUM_BANDS]; |
| 1772 | }; | 1786 | }; |
| 1773 | /** | 1787 | /** |
| @@ -2194,7 +2208,12 @@ struct cfg80211_qos_map { | |||
| 2194 | * @set_cqm_txe_config: Configure connection quality monitor TX error | 2208 | * @set_cqm_txe_config: Configure connection quality monitor TX error |
| 2195 | * thresholds. | 2209 | * thresholds. |
| 2196 | * @sched_scan_start: Tell the driver to start a scheduled scan. | 2210 | * @sched_scan_start: Tell the driver to start a scheduled scan. |
| 2197 | * @sched_scan_stop: Tell the driver to stop an ongoing scheduled scan. | 2211 | * @sched_scan_stop: Tell the driver to stop an ongoing scheduled scan. This |
| 2212 | * call must stop the scheduled scan and be ready for starting a new one | ||
| 2213 | * before it returns, i.e. @sched_scan_start may be called immediately | ||
| 2214 | * after that again and should not fail in that case. The driver should | ||
| 2215 | * not call cfg80211_sched_scan_stopped() for a requested stop (when this | ||
| 2216 | * method returns 0.) | ||
| 2198 | * | 2217 | * |
| 2199 | * @mgmt_frame_register: Notify driver that a management frame type was | 2218 | * @mgmt_frame_register: Notify driver that a management frame type was |
| 2200 | * registered. Note that this callback may not sleep, and cannot run | 2219 | * registered. Note that this callback may not sleep, and cannot run |
| @@ -2453,7 +2472,8 @@ struct cfg80211_ops { | |||
| 2453 | 2472 | ||
| 2454 | int (*tdls_mgmt)(struct wiphy *wiphy, struct net_device *dev, | 2473 | int (*tdls_mgmt)(struct wiphy *wiphy, struct net_device *dev, |
| 2455 | u8 *peer, u8 action_code, u8 dialog_token, | 2474 | u8 *peer, u8 action_code, u8 dialog_token, |
| 2456 | u16 status_code, const u8 *buf, size_t len); | 2475 | u16 status_code, u32 peer_capability, |
| 2476 | const u8 *buf, size_t len); | ||
| 2457 | int (*tdls_oper)(struct wiphy *wiphy, struct net_device *dev, | 2477 | int (*tdls_oper)(struct wiphy *wiphy, struct net_device *dev, |
| 2458 | u8 *peer, enum nl80211_tdls_operation oper); | 2478 | u8 *peer, enum nl80211_tdls_operation oper); |
| 2459 | 2479 | ||
| @@ -2485,7 +2505,8 @@ struct cfg80211_ops { | |||
| 2485 | 2505 | ||
| 2486 | int (*start_radar_detection)(struct wiphy *wiphy, | 2506 | int (*start_radar_detection)(struct wiphy *wiphy, |
| 2487 | struct net_device *dev, | 2507 | struct net_device *dev, |
| 2488 | struct cfg80211_chan_def *chandef); | 2508 | struct cfg80211_chan_def *chandef, |
| 2509 | u32 cac_time_ms); | ||
| 2489 | int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev, | 2510 | int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev, |
| 2490 | struct cfg80211_update_ft_ies_params *ftie); | 2511 | struct cfg80211_update_ft_ies_params *ftie); |
| 2491 | int (*crit_proto_start)(struct wiphy *wiphy, | 2512 | int (*crit_proto_start)(struct wiphy *wiphy, |
| @@ -2598,9 +2619,12 @@ struct ieee80211_iface_limit { | |||
| 2598 | * only in special cases. | 2619 | * only in special cases. |
| 2599 | * @radar_detect_widths: bitmap of channel widths supported for radar detection | 2620 | * @radar_detect_widths: bitmap of channel widths supported for radar detection |
| 2600 | * | 2621 | * |
| 2601 | * These examples can be expressed as follows: | 2622 | * With this structure the driver can describe which interface |
| 2623 | * combinations it supports concurrently. | ||
| 2624 | * | ||
| 2625 | * Examples: | ||
| 2602 | * | 2626 | * |
| 2603 | * Allow #STA <= 1, #AP <= 1, matching BI, channels = 1, 2 total: | 2627 | * 1. Allow #STA <= 1, #AP <= 1, matching BI, channels = 1, 2 total: |
| 2604 | * | 2628 | * |
| 2605 | * struct ieee80211_iface_limit limits1[] = { | 2629 | * struct ieee80211_iface_limit limits1[] = { |
| 2606 | * { .max = 1, .types = BIT(NL80211_IFTYPE_STATION), }, | 2630 | * { .max = 1, .types = BIT(NL80211_IFTYPE_STATION), }, |
| @@ -2614,7 +2638,7 @@ struct ieee80211_iface_limit { | |||
| 2614 | * }; | 2638 | * }; |
| 2615 | * | 2639 | * |
| 2616 | * | 2640 | * |
| 2617 | * Allow #{AP, P2P-GO} <= 8, channels = 1, 8 total: | 2641 | * 2. Allow #{AP, P2P-GO} <= 8, channels = 1, 8 total: |
| 2618 | * | 2642 | * |
| 2619 | * struct ieee80211_iface_limit limits2[] = { | 2643 | * struct ieee80211_iface_limit limits2[] = { |
| 2620 | * { .max = 8, .types = BIT(NL80211_IFTYPE_AP) | | 2644 | * { .max = 8, .types = BIT(NL80211_IFTYPE_AP) | |
| @@ -2628,7 +2652,8 @@ struct ieee80211_iface_limit { | |||
| 2628 | * }; | 2652 | * }; |
| 2629 | * | 2653 | * |
| 2630 | * | 2654 | * |
| 2631 | * Allow #STA <= 1, #{P2P-client,P2P-GO} <= 3 on two channels, 4 total. | 2655 | * 3. Allow #STA <= 1, #{P2P-client,P2P-GO} <= 3 on two channels, 4 total. |
| 2656 | * | ||
| 2632 | * This allows for an infrastructure connection and three P2P connections. | 2657 | * This allows for an infrastructure connection and three P2P connections. |
| 2633 | * | 2658 | * |
| 2634 | * struct ieee80211_iface_limit limits3[] = { | 2659 | * struct ieee80211_iface_limit limits3[] = { |
| @@ -2778,7 +2803,7 @@ struct wiphy_vendor_command { | |||
| 2778 | * @perm_addr: permanent MAC address of this device | 2803 | * @perm_addr: permanent MAC address of this device |
| 2779 | * @addr_mask: If the device supports multiple MAC addresses by masking, | 2804 | * @addr_mask: If the device supports multiple MAC addresses by masking, |
| 2780 | * set this to a mask with variable bits set to 1, e.g. if the last | 2805 | * set this to a mask with variable bits set to 1, e.g. if the last |
| 2781 | * four bits are variable then set it to 00:...:00:0f. The actual | 2806 | * four bits are variable then set it to 00-00-00-00-00-0f. The actual |
| 2782 | * variable bits shall be determined by the interfaces added, with | 2807 | * variable bits shall be determined by the interfaces added, with |
| 2783 | * interfaces not matching the mask being rejected to be brought up. | 2808 | * interfaces not matching the mask being rejected to be brought up. |
| 2784 | * @n_addresses: number of addresses in @addresses. | 2809 | * @n_addresses: number of addresses in @addresses. |
| @@ -2875,6 +2900,11 @@ struct wiphy_vendor_command { | |||
| 2875 | * @n_vendor_commands: number of vendor commands | 2900 | * @n_vendor_commands: number of vendor commands |
| 2876 | * @vendor_events: array of vendor events supported by the hardware | 2901 | * @vendor_events: array of vendor events supported by the hardware |
| 2877 | * @n_vendor_events: number of vendor events | 2902 | * @n_vendor_events: number of vendor events |
| 2903 | * | ||
| 2904 | * @max_ap_assoc_sta: maximum number of associated stations supported in AP mode | ||
| 2905 | * (including P2P GO) or 0 to indicate no such limit is advertised. The | ||
| 2906 | * driver is allowed to advertise a theoretical limit that it can reach in | ||
| 2907 | * some cases, but may not always reach. | ||
| 2878 | */ | 2908 | */ |
| 2879 | struct wiphy { | 2909 | struct wiphy { |
| 2880 | /* assign these fields before you register the wiphy */ | 2910 | /* assign these fields before you register the wiphy */ |
| @@ -2990,6 +3020,8 @@ struct wiphy { | |||
| 2990 | const struct nl80211_vendor_cmd_info *vendor_events; | 3020 | const struct nl80211_vendor_cmd_info *vendor_events; |
| 2991 | int n_vendor_commands, n_vendor_events; | 3021 | int n_vendor_commands, n_vendor_events; |
| 2992 | 3022 | ||
| 3023 | u16 max_ap_assoc_sta; | ||
| 3024 | |||
| 2993 | char priv[0] __aligned(NETDEV_ALIGN); | 3025 | char priv[0] __aligned(NETDEV_ALIGN); |
| 2994 | }; | 3026 | }; |
| 2995 | 3027 | ||
| @@ -3127,8 +3159,8 @@ struct cfg80211_cached_keys; | |||
| 3127 | * @identifier: (private) Identifier used in nl80211 to identify this | 3159 | * @identifier: (private) Identifier used in nl80211 to identify this |
| 3128 | * wireless device if it has no netdev | 3160 | * wireless device if it has no netdev |
| 3129 | * @current_bss: (private) Used by the internal configuration code | 3161 | * @current_bss: (private) Used by the internal configuration code |
| 3130 | * @channel: (private) Used by the internal configuration code to track | 3162 | * @chandef: (private) Used by the internal configuration code to track |
| 3131 | * the user-set AP, monitor and WDS channel | 3163 | * the user-set channel definition. |
| 3132 | * @preset_chandef: (private) Used by the internal configuration code to | 3164 | * @preset_chandef: (private) Used by the internal configuration code to |
| 3133 | * track the channel to be used for AP later | 3165 | * track the channel to be used for AP later |
| 3134 | * @bssid: (private) Used by the internal configuration code | 3166 | * @bssid: (private) Used by the internal configuration code |
| @@ -3151,6 +3183,7 @@ struct cfg80211_cached_keys; | |||
| 3151 | * @p2p_started: true if this is a P2P Device that has been started | 3183 | * @p2p_started: true if this is a P2P Device that has been started |
| 3152 | * @cac_started: true if DFS channel availability check has been started | 3184 | * @cac_started: true if DFS channel availability check has been started |
| 3153 | * @cac_start_time: timestamp (jiffies) when the dfs state was entered. | 3185 | * @cac_start_time: timestamp (jiffies) when the dfs state was entered. |
| 3186 | * @cac_time_ms: CAC time in ms | ||
| 3154 | * @ps: powersave mode is enabled | 3187 | * @ps: powersave mode is enabled |
| 3155 | * @ps_timeout: dynamic powersave timeout | 3188 | * @ps_timeout: dynamic powersave timeout |
| 3156 | * @ap_unexpected_nlportid: (private) netlink port ID of application | 3189 | * @ap_unexpected_nlportid: (private) netlink port ID of application |
| @@ -3192,9 +3225,7 @@ struct wireless_dev { | |||
| 3192 | 3225 | ||
| 3193 | struct cfg80211_internal_bss *current_bss; /* associated / joined */ | 3226 | struct cfg80211_internal_bss *current_bss; /* associated / joined */ |
| 3194 | struct cfg80211_chan_def preset_chandef; | 3227 | struct cfg80211_chan_def preset_chandef; |
| 3195 | 3228 | struct cfg80211_chan_def chandef; | |
| 3196 | /* for AP and mesh channel tracking */ | ||
| 3197 | struct ieee80211_channel *channel; | ||
| 3198 | 3229 | ||
| 3199 | bool ibss_fixed; | 3230 | bool ibss_fixed; |
| 3200 | bool ibss_dfs_possible; | 3231 | bool ibss_dfs_possible; |
| @@ -3208,6 +3239,7 @@ struct wireless_dev { | |||
| 3208 | 3239 | ||
| 3209 | bool cac_started; | 3240 | bool cac_started; |
| 3210 | unsigned long cac_start_time; | 3241 | unsigned long cac_start_time; |
| 3242 | unsigned int cac_time_ms; | ||
| 3211 | 3243 | ||
| 3212 | #ifdef CONFIG_CFG80211_WEXT | 3244 | #ifdef CONFIG_CFG80211_WEXT |
| 3213 | /* wext data */ | 3245 | /* wext data */ |
| @@ -3640,7 +3672,7 @@ void cfg80211_sched_scan_stopped(struct wiphy *wiphy); | |||
| 3640 | * cfg80211_inform_bss_width_frame - inform cfg80211 of a received BSS frame | 3672 | * cfg80211_inform_bss_width_frame - inform cfg80211 of a received BSS frame |
| 3641 | * | 3673 | * |
| 3642 | * @wiphy: the wiphy reporting the BSS | 3674 | * @wiphy: the wiphy reporting the BSS |
| 3643 | * @channel: The channel the frame was received on | 3675 | * @rx_channel: The channel the frame was received on |
| 3644 | * @scan_width: width of the control channel | 3676 | * @scan_width: width of the control channel |
| 3645 | * @mgmt: the management frame (probe response or beacon) | 3677 | * @mgmt: the management frame (probe response or beacon) |
| 3646 | * @len: length of the management frame | 3678 | * @len: length of the management frame |
| @@ -3655,18 +3687,18 @@ void cfg80211_sched_scan_stopped(struct wiphy *wiphy); | |||
| 3655 | */ | 3687 | */ |
| 3656 | struct cfg80211_bss * __must_check | 3688 | struct cfg80211_bss * __must_check |
| 3657 | cfg80211_inform_bss_width_frame(struct wiphy *wiphy, | 3689 | cfg80211_inform_bss_width_frame(struct wiphy *wiphy, |
| 3658 | struct ieee80211_channel *channel, | 3690 | struct ieee80211_channel *rx_channel, |
| 3659 | enum nl80211_bss_scan_width scan_width, | 3691 | enum nl80211_bss_scan_width scan_width, |
| 3660 | struct ieee80211_mgmt *mgmt, size_t len, | 3692 | struct ieee80211_mgmt *mgmt, size_t len, |
| 3661 | s32 signal, gfp_t gfp); | 3693 | s32 signal, gfp_t gfp); |
| 3662 | 3694 | ||
| 3663 | static inline struct cfg80211_bss * __must_check | 3695 | static inline struct cfg80211_bss * __must_check |
| 3664 | cfg80211_inform_bss_frame(struct wiphy *wiphy, | 3696 | cfg80211_inform_bss_frame(struct wiphy *wiphy, |
| 3665 | struct ieee80211_channel *channel, | 3697 | struct ieee80211_channel *rx_channel, |
| 3666 | struct ieee80211_mgmt *mgmt, size_t len, | 3698 | struct ieee80211_mgmt *mgmt, size_t len, |
| 3667 | s32 signal, gfp_t gfp) | 3699 | s32 signal, gfp_t gfp) |
| 3668 | { | 3700 | { |
| 3669 | return cfg80211_inform_bss_width_frame(wiphy, channel, | 3701 | return cfg80211_inform_bss_width_frame(wiphy, rx_channel, |
| 3670 | NL80211_BSS_CHAN_WIDTH_20, | 3702 | NL80211_BSS_CHAN_WIDTH_20, |
| 3671 | mgmt, len, signal, gfp); | 3703 | mgmt, len, signal, gfp); |
| 3672 | } | 3704 | } |
| @@ -3675,7 +3707,7 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy, | |||
| 3675 | * cfg80211_inform_bss - inform cfg80211 of a new BSS | 3707 | * cfg80211_inform_bss - inform cfg80211 of a new BSS |
| 3676 | * | 3708 | * |
| 3677 | * @wiphy: the wiphy reporting the BSS | 3709 | * @wiphy: the wiphy reporting the BSS |
| 3678 | * @channel: The channel the frame was received on | 3710 | * @rx_channel: The channel the frame was received on |
| 3679 | * @scan_width: width of the control channel | 3711 | * @scan_width: width of the control channel |
| 3680 | * @bssid: the BSSID of the BSS | 3712 | * @bssid: the BSSID of the BSS |
| 3681 | * @tsf: the TSF sent by the peer in the beacon/probe response (or 0) | 3713 | * @tsf: the TSF sent by the peer in the beacon/probe response (or 0) |
| @@ -3694,7 +3726,7 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy, | |||
| 3694 | */ | 3726 | */ |
| 3695 | struct cfg80211_bss * __must_check | 3727 | struct cfg80211_bss * __must_check |
| 3696 | cfg80211_inform_bss_width(struct wiphy *wiphy, | 3728 | cfg80211_inform_bss_width(struct wiphy *wiphy, |
| 3697 | struct ieee80211_channel *channel, | 3729 | struct ieee80211_channel *rx_channel, |
| 3698 | enum nl80211_bss_scan_width scan_width, | 3730 | enum nl80211_bss_scan_width scan_width, |
| 3699 | const u8 *bssid, u64 tsf, u16 capability, | 3731 | const u8 *bssid, u64 tsf, u16 capability, |
| 3700 | u16 beacon_interval, const u8 *ie, size_t ielen, | 3732 | u16 beacon_interval, const u8 *ie, size_t ielen, |
| @@ -3702,12 +3734,12 @@ cfg80211_inform_bss_width(struct wiphy *wiphy, | |||
| 3702 | 3734 | ||
| 3703 | static inline struct cfg80211_bss * __must_check | 3735 | static inline struct cfg80211_bss * __must_check |
| 3704 | cfg80211_inform_bss(struct wiphy *wiphy, | 3736 | cfg80211_inform_bss(struct wiphy *wiphy, |
| 3705 | struct ieee80211_channel *channel, | 3737 | struct ieee80211_channel *rx_channel, |
| 3706 | const u8 *bssid, u64 tsf, u16 capability, | 3738 | const u8 *bssid, u64 tsf, u16 capability, |
| 3707 | u16 beacon_interval, const u8 *ie, size_t ielen, | 3739 | u16 beacon_interval, const u8 *ie, size_t ielen, |
| 3708 | s32 signal, gfp_t gfp) | 3740 | s32 signal, gfp_t gfp) |
| 3709 | { | 3741 | { |
| 3710 | return cfg80211_inform_bss_width(wiphy, channel, | 3742 | return cfg80211_inform_bss_width(wiphy, rx_channel, |
| 3711 | NL80211_BSS_CHAN_WIDTH_20, | 3743 | NL80211_BSS_CHAN_WIDTH_20, |
| 3712 | bssid, tsf, capability, | 3744 | bssid, tsf, capability, |
| 3713 | beacon_interval, ie, ielen, signal, | 3745 | beacon_interval, ie, ielen, signal, |
| @@ -3876,6 +3908,7 @@ void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr, | |||
| 3876 | * | 3908 | * |
| 3877 | * @dev: network device | 3909 | * @dev: network device |
| 3878 | * @bssid: the BSSID of the IBSS joined | 3910 | * @bssid: the BSSID of the IBSS joined |
| 3911 | * @channel: the channel of the IBSS joined | ||
| 3879 | * @gfp: allocation flags | 3912 | * @gfp: allocation flags |
| 3880 | * | 3913 | * |
| 3881 | * This function notifies cfg80211 that the device joined an IBSS or | 3914 | * This function notifies cfg80211 that the device joined an IBSS or |
| @@ -3885,7 +3918,8 @@ void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr, | |||
| 3885 | * with the locally generated beacon -- this guarantees that there is | 3918 | * with the locally generated beacon -- this guarantees that there is |
| 3886 | * always a scan result for this IBSS. cfg80211 will handle the rest. | 3919 | * always a scan result for this IBSS. cfg80211 will handle the rest. |
| 3887 | */ | 3920 | */ |
| 3888 | void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp); | 3921 | void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, |
| 3922 | struct ieee80211_channel *channel, gfp_t gfp); | ||
| 3889 | 3923 | ||
| 3890 | /** | 3924 | /** |
| 3891 | * cfg80211_notify_new_candidate - notify cfg80211 of a new mesh peer candidate | 3925 | * cfg80211_notify_new_candidate - notify cfg80211 of a new mesh peer candidate |
diff --git a/include/net/checksum.h b/include/net/checksum.h index 37a0e24adbe7..a28f4e0f6251 100644 --- a/include/net/checksum.h +++ b/include/net/checksum.h | |||
| @@ -69,6 +69,19 @@ static inline __wsum csum_sub(__wsum csum, __wsum addend) | |||
| 69 | return csum_add(csum, ~addend); | 69 | return csum_add(csum, ~addend); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | static inline __sum16 csum16_add(__sum16 csum, __be16 addend) | ||
| 73 | { | ||
| 74 | u16 res = (__force u16)csum; | ||
| 75 | |||
| 76 | res += (__force u16)addend; | ||
| 77 | return (__force __sum16)(res + (res < (__force u16)addend)); | ||
| 78 | } | ||
| 79 | |||
| 80 | static inline __sum16 csum16_sub(__sum16 csum, __be16 addend) | ||
| 81 | { | ||
| 82 | return csum16_add(csum, ~addend); | ||
| 83 | } | ||
| 84 | |||
| 72 | static inline __wsum | 85 | static inline __wsum |
| 73 | csum_block_add(__wsum csum, __wsum csum2, int offset) | 86 | csum_block_add(__wsum csum, __wsum csum2, int offset) |
| 74 | { | 87 | { |
| @@ -112,9 +125,15 @@ static inline void csum_replace4(__sum16 *sum, __be32 from, __be32 to) | |||
| 112 | *sum = csum_fold(csum_partial(diff, sizeof(diff), ~csum_unfold(*sum))); | 125 | *sum = csum_fold(csum_partial(diff, sizeof(diff), ~csum_unfold(*sum))); |
| 113 | } | 126 | } |
| 114 | 127 | ||
| 115 | static inline void csum_replace2(__sum16 *sum, __be16 from, __be16 to) | 128 | /* Implements RFC 1624 (Incremental Internet Checksum) |
| 129 | * 3. Discussion states : | ||
| 130 | * HC' = ~(~HC + ~m + m') | ||
| 131 | * m : old value of a 16bit field | ||
| 132 | * m' : new value of a 16bit field | ||
| 133 | */ | ||
| 134 | static inline void csum_replace2(__sum16 *sum, __be16 old, __be16 new) | ||
| 116 | { | 135 | { |
| 117 | csum_replace4(sum, (__force __be32)from, (__force __be32)to); | 136 | *sum = ~csum16_add(csum16_sub(~(*sum), old), new); |
| 118 | } | 137 | } |
| 119 | 138 | ||
| 120 | struct sk_buff; | 139 | struct sk_buff; |
diff --git a/include/net/dst.h b/include/net/dst.h index 77eb53fabfb0..46ed958e0c6e 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
| @@ -54,10 +54,9 @@ struct dst_entry { | |||
| 54 | #define DST_NOHASH 0x0008 | 54 | #define DST_NOHASH 0x0008 |
| 55 | #define DST_NOCACHE 0x0010 | 55 | #define DST_NOCACHE 0x0010 |
| 56 | #define DST_NOCOUNT 0x0020 | 56 | #define DST_NOCOUNT 0x0020 |
| 57 | #define DST_NOPEER 0x0040 | 57 | #define DST_FAKE_RTABLE 0x0040 |
| 58 | #define DST_FAKE_RTABLE 0x0080 | 58 | #define DST_XFRM_TUNNEL 0x0080 |
| 59 | #define DST_XFRM_TUNNEL 0x0100 | 59 | #define DST_XFRM_QUEUE 0x0100 |
| 60 | #define DST_XFRM_QUEUE 0x0200 | ||
| 61 | 60 | ||
| 62 | unsigned short pending_confirm; | 61 | unsigned short pending_confirm; |
| 63 | 62 | ||
| @@ -109,9 +108,11 @@ struct dst_entry { | |||
| 109 | u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old); | 108 | u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old); |
| 110 | extern const u32 dst_default_metrics[]; | 109 | extern const u32 dst_default_metrics[]; |
| 111 | 110 | ||
| 112 | #define DST_METRICS_READ_ONLY 0x1UL | 111 | #define DST_METRICS_READ_ONLY 0x1UL |
| 112 | #define DST_METRICS_FORCE_OVERWRITE 0x2UL | ||
| 113 | #define DST_METRICS_FLAGS 0x3UL | ||
| 113 | #define __DST_METRICS_PTR(Y) \ | 114 | #define __DST_METRICS_PTR(Y) \ |
| 114 | ((u32 *)((Y) & ~DST_METRICS_READ_ONLY)) | 115 | ((u32 *)((Y) & ~DST_METRICS_FLAGS)) |
| 115 | #define DST_METRICS_PTR(X) __DST_METRICS_PTR((X)->_metrics) | 116 | #define DST_METRICS_PTR(X) __DST_METRICS_PTR((X)->_metrics) |
| 116 | 117 | ||
| 117 | static inline bool dst_metrics_read_only(const struct dst_entry *dst) | 118 | static inline bool dst_metrics_read_only(const struct dst_entry *dst) |
| @@ -119,6 +120,11 @@ static inline bool dst_metrics_read_only(const struct dst_entry *dst) | |||
| 119 | return dst->_metrics & DST_METRICS_READ_ONLY; | 120 | return dst->_metrics & DST_METRICS_READ_ONLY; |
| 120 | } | 121 | } |
| 121 | 122 | ||
| 123 | static inline void dst_metrics_set_force_overwrite(struct dst_entry *dst) | ||
| 124 | { | ||
| 125 | dst->_metrics |= DST_METRICS_FORCE_OVERWRITE; | ||
| 126 | } | ||
| 127 | |||
| 122 | void __dst_destroy_metrics_generic(struct dst_entry *dst, unsigned long old); | 128 | void __dst_destroy_metrics_generic(struct dst_entry *dst, unsigned long old); |
| 123 | 129 | ||
| 124 | static inline void dst_destroy_metrics_generic(struct dst_entry *dst) | 130 | static inline void dst_destroy_metrics_generic(struct dst_entry *dst) |
diff --git a/include/net/flow.h b/include/net/flow.h index d23e7fa2042e..64fd24836650 100644 --- a/include/net/flow.h +++ b/include/net/flow.h | |||
| @@ -218,9 +218,11 @@ struct flow_cache_object *flow_cache_lookup(struct net *net, | |||
| 218 | const struct flowi *key, u16 family, | 218 | const struct flowi *key, u16 family, |
| 219 | u8 dir, flow_resolve_t resolver, | 219 | u8 dir, flow_resolve_t resolver, |
| 220 | void *ctx); | 220 | void *ctx); |
| 221 | int flow_cache_init(struct net *net); | ||
| 222 | void flow_cache_fini(struct net *net); | ||
| 221 | 223 | ||
| 222 | void flow_cache_flush(void); | 224 | void flow_cache_flush(struct net *net); |
| 223 | void flow_cache_flush_deferred(void); | 225 | void flow_cache_flush_deferred(struct net *net); |
| 224 | extern atomic_t flow_cache_genid; | 226 | extern atomic_t flow_cache_genid; |
| 225 | 227 | ||
| 226 | #endif | 228 | #endif |
diff --git a/include/net/flowcache.h b/include/net/flowcache.h new file mode 100644 index 000000000000..c8f665ec6e0d --- /dev/null +++ b/include/net/flowcache.h | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | #ifndef _NET_FLOWCACHE_H | ||
| 2 | #define _NET_FLOWCACHE_H | ||
| 3 | |||
| 4 | #include <linux/interrupt.h> | ||
| 5 | #include <linux/types.h> | ||
| 6 | #include <linux/timer.h> | ||
| 7 | #include <linux/notifier.h> | ||
| 8 | |||
| 9 | struct flow_cache_percpu { | ||
| 10 | struct hlist_head *hash_table; | ||
| 11 | int hash_count; | ||
| 12 | u32 hash_rnd; | ||
| 13 | int hash_rnd_recalc; | ||
| 14 | struct tasklet_struct flush_tasklet; | ||
| 15 | }; | ||
| 16 | |||
| 17 | struct flow_cache { | ||
| 18 | u32 hash_shift; | ||
| 19 | struct flow_cache_percpu __percpu *percpu; | ||
| 20 | struct notifier_block hotcpu_notifier; | ||
| 21 | int low_watermark; | ||
| 22 | int high_watermark; | ||
| 23 | struct timer_list rnd_timer; | ||
| 24 | }; | ||
| 25 | #endif /* _NET_FLOWCACHE_H */ | ||
diff --git a/include/net/ieee80211_radiotap.h b/include/net/ieee80211_radiotap.h index 8b5b71433297..b0fd9476c538 100644 --- a/include/net/ieee80211_radiotap.h +++ b/include/net/ieee80211_radiotap.h | |||
| @@ -316,6 +316,10 @@ enum ieee80211_radiotap_type { | |||
| 316 | #define IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM 0x10 | 316 | #define IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM 0x10 |
| 317 | #define IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED 0x20 | 317 | #define IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED 0x20 |
| 318 | 318 | ||
| 319 | #define IEEE80211_RADIOTAP_CODING_LDPC_USER0 0x01 | ||
| 320 | #define IEEE80211_RADIOTAP_CODING_LDPC_USER1 0x02 | ||
| 321 | #define IEEE80211_RADIOTAP_CODING_LDPC_USER2 0x04 | ||
| 322 | #define IEEE80211_RADIOTAP_CODING_LDPC_USER3 0x08 | ||
| 319 | 323 | ||
| 320 | /* helpers */ | 324 | /* helpers */ |
| 321 | static inline int ieee80211_get_radiotap_len(unsigned char *data) | 325 | static inline int ieee80211_get_radiotap_len(unsigned char *data) |
diff --git a/include/net/ieee802154.h b/include/net/ieee802154.h index ee59f8b188dd..c7ae0ac528dc 100644 --- a/include/net/ieee802154.h +++ b/include/net/ieee802154.h | |||
| @@ -42,22 +42,42 @@ | |||
| 42 | (((x) << IEEE802154_FC_TYPE_SHIFT) & IEEE802154_FC_TYPE_MASK)); \ | 42 | (((x) << IEEE802154_FC_TYPE_SHIFT) & IEEE802154_FC_TYPE_MASK)); \ |
| 43 | } while (0) | 43 | } while (0) |
| 44 | 44 | ||
| 45 | #define IEEE802154_FC_SECEN (1 << 3) | 45 | #define IEEE802154_FC_SECEN_SHIFT 3 |
| 46 | #define IEEE802154_FC_FRPEND (1 << 4) | 46 | #define IEEE802154_FC_SECEN (1 << IEEE802154_FC_SECEN_SHIFT) |
| 47 | #define IEEE802154_FC_ACK_REQ (1 << 5) | 47 | #define IEEE802154_FC_FRPEND_SHIFT 4 |
| 48 | #define IEEE802154_FC_INTRA_PAN (1 << 6) | 48 | #define IEEE802154_FC_FRPEND (1 << IEEE802154_FC_FRPEND_SHIFT) |
| 49 | #define IEEE802154_FC_ACK_REQ_SHIFT 5 | ||
| 50 | #define IEEE802154_FC_ACK_REQ (1 << IEEE802154_FC_ACK_REQ_SHIFT) | ||
| 51 | #define IEEE802154_FC_INTRA_PAN_SHIFT 6 | ||
| 52 | #define IEEE802154_FC_INTRA_PAN (1 << IEEE802154_FC_INTRA_PAN_SHIFT) | ||
| 49 | 53 | ||
| 50 | #define IEEE802154_FC_SAMODE_SHIFT 14 | 54 | #define IEEE802154_FC_SAMODE_SHIFT 14 |
| 51 | #define IEEE802154_FC_SAMODE_MASK (3 << IEEE802154_FC_SAMODE_SHIFT) | 55 | #define IEEE802154_FC_SAMODE_MASK (3 << IEEE802154_FC_SAMODE_SHIFT) |
| 52 | #define IEEE802154_FC_DAMODE_SHIFT 10 | 56 | #define IEEE802154_FC_DAMODE_SHIFT 10 |
| 53 | #define IEEE802154_FC_DAMODE_MASK (3 << IEEE802154_FC_DAMODE_SHIFT) | 57 | #define IEEE802154_FC_DAMODE_MASK (3 << IEEE802154_FC_DAMODE_SHIFT) |
| 54 | 58 | ||
| 59 | #define IEEE802154_FC_VERSION_SHIFT 12 | ||
| 60 | #define IEEE802154_FC_VERSION_MASK (3 << IEEE802154_FC_VERSION_SHIFT) | ||
| 61 | #define IEEE802154_FC_VERSION(x) ((x & IEEE802154_FC_VERSION_MASK) >> IEEE802154_FC_VERSION_SHIFT) | ||
| 62 | |||
| 55 | #define IEEE802154_FC_SAMODE(x) \ | 63 | #define IEEE802154_FC_SAMODE(x) \ |
| 56 | (((x) & IEEE802154_FC_SAMODE_MASK) >> IEEE802154_FC_SAMODE_SHIFT) | 64 | (((x) & IEEE802154_FC_SAMODE_MASK) >> IEEE802154_FC_SAMODE_SHIFT) |
| 57 | 65 | ||
| 58 | #define IEEE802154_FC_DAMODE(x) \ | 66 | #define IEEE802154_FC_DAMODE(x) \ |
| 59 | (((x) & IEEE802154_FC_DAMODE_MASK) >> IEEE802154_FC_DAMODE_SHIFT) | 67 | (((x) & IEEE802154_FC_DAMODE_MASK) >> IEEE802154_FC_DAMODE_SHIFT) |
| 60 | 68 | ||
| 69 | #define IEEE802154_SCF_SECLEVEL_MASK 7 | ||
| 70 | #define IEEE802154_SCF_SECLEVEL_SHIFT 0 | ||
| 71 | #define IEEE802154_SCF_SECLEVEL(x) (x & IEEE802154_SCF_SECLEVEL_MASK) | ||
| 72 | #define IEEE802154_SCF_KEY_ID_MODE_SHIFT 3 | ||
| 73 | #define IEEE802154_SCF_KEY_ID_MODE_MASK (3 << IEEE802154_SCF_KEY_ID_MODE_SHIFT) | ||
| 74 | #define IEEE802154_SCF_KEY_ID_MODE(x) \ | ||
| 75 | ((x & IEEE802154_SCF_KEY_ID_MODE_MASK) >> IEEE802154_SCF_KEY_ID_MODE_SHIFT) | ||
| 76 | |||
| 77 | #define IEEE802154_SCF_KEY_IMPLICIT 0 | ||
| 78 | #define IEEE802154_SCF_KEY_INDEX 1 | ||
| 79 | #define IEEE802154_SCF_KEY_SHORT_INDEX 2 | ||
| 80 | #define IEEE802154_SCF_KEY_HW_INDEX 3 | ||
| 61 | 81 | ||
| 62 | /* MAC footer size */ | 82 | /* MAC footer size */ |
| 63 | #define IEEE802154_MFR_SIZE 2 /* 2 octets */ | 83 | #define IEEE802154_MFR_SIZE 2 /* 2 octets */ |
diff --git a/include/net/ieee802154_netdev.h b/include/net/ieee802154_netdev.h index 8196d5d40359..5a719ca892f4 100644 --- a/include/net/ieee802154_netdev.h +++ b/include/net/ieee802154_netdev.h | |||
| @@ -28,6 +28,164 @@ | |||
| 28 | #define IEEE802154_NETDEVICE_H | 28 | #define IEEE802154_NETDEVICE_H |
| 29 | 29 | ||
| 30 | #include <net/af_ieee802154.h> | 30 | #include <net/af_ieee802154.h> |
| 31 | #include <linux/netdevice.h> | ||
| 32 | #include <linux/skbuff.h> | ||
| 33 | |||
| 34 | struct ieee802154_sechdr { | ||
| 35 | #if defined(__LITTLE_ENDIAN_BITFIELD) | ||
| 36 | u8 level:3, | ||
| 37 | key_id_mode:2, | ||
| 38 | reserved:3; | ||
| 39 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
| 40 | u8 reserved:3, | ||
| 41 | key_id_mode:2, | ||
| 42 | level:3; | ||
| 43 | #else | ||
| 44 | #error "Please fix <asm/byteorder.h>" | ||
| 45 | #endif | ||
| 46 | u8 key_id; | ||
| 47 | __le32 frame_counter; | ||
| 48 | union { | ||
| 49 | __le32 short_src; | ||
| 50 | __le64 extended_src; | ||
| 51 | }; | ||
| 52 | }; | ||
| 53 | |||
| 54 | struct ieee802154_addr { | ||
| 55 | u8 mode; | ||
| 56 | __le16 pan_id; | ||
| 57 | union { | ||
| 58 | __le16 short_addr; | ||
| 59 | __le64 extended_addr; | ||
| 60 | }; | ||
| 61 | }; | ||
| 62 | |||
| 63 | struct ieee802154_hdr_fc { | ||
| 64 | #if defined(__LITTLE_ENDIAN_BITFIELD) | ||
| 65 | u16 type:3, | ||
| 66 | security_enabled:1, | ||
| 67 | frame_pending:1, | ||
| 68 | ack_request:1, | ||
| 69 | intra_pan:1, | ||
| 70 | reserved:3, | ||
| 71 | dest_addr_mode:2, | ||
| 72 | version:2, | ||
| 73 | source_addr_mode:2; | ||
| 74 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
| 75 | u16 reserved:1, | ||
| 76 | intra_pan:1, | ||
| 77 | ack_request:1, | ||
| 78 | frame_pending:1, | ||
| 79 | security_enabled:1, | ||
| 80 | type:3, | ||
| 81 | source_addr_mode:2, | ||
| 82 | version:2, | ||
| 83 | dest_addr_mode:2, | ||
| 84 | reserved2:2; | ||
| 85 | #else | ||
| 86 | #error "Please fix <asm/byteorder.h>" | ||
| 87 | #endif | ||
| 88 | }; | ||
| 89 | |||
| 90 | struct ieee802154_hdr { | ||
| 91 | struct ieee802154_hdr_fc fc; | ||
| 92 | u8 seq; | ||
| 93 | struct ieee802154_addr source; | ||
| 94 | struct ieee802154_addr dest; | ||
| 95 | struct ieee802154_sechdr sec; | ||
| 96 | }; | ||
| 97 | |||
| 98 | /* pushes hdr onto the skb. fields of hdr->fc that can be calculated from | ||
| 99 | * the contents of hdr will be, and the actual value of those bits in | ||
| 100 | * hdr->fc will be ignored. this includes the INTRA_PAN bit and the frame | ||
| 101 | * version, if SECEN is set. | ||
| 102 | */ | ||
| 103 | int ieee802154_hdr_push(struct sk_buff *skb, const struct ieee802154_hdr *hdr); | ||
| 104 | |||
| 105 | /* pulls the entire 802.15.4 header off of the skb, including the security | ||
| 106 | * header, and performs pan id decompression | ||
| 107 | */ | ||
| 108 | int ieee802154_hdr_pull(struct sk_buff *skb, struct ieee802154_hdr *hdr); | ||
| 109 | |||
| 110 | /* parses the frame control, sequence number of address fields in a given skb | ||
| 111 | * and stores them into hdr, performing pan id decompression and length checks | ||
| 112 | * to be suitable for use in header_ops.parse | ||
| 113 | */ | ||
| 114 | int ieee802154_hdr_peek_addrs(const struct sk_buff *skb, | ||
| 115 | struct ieee802154_hdr *hdr); | ||
| 116 | |||
| 117 | static inline int ieee802154_hdr_length(struct sk_buff *skb) | ||
| 118 | { | ||
| 119 | struct ieee802154_hdr hdr; | ||
| 120 | int len = ieee802154_hdr_pull(skb, &hdr); | ||
| 121 | |||
| 122 | if (len > 0) | ||
| 123 | skb_push(skb, len); | ||
| 124 | |||
| 125 | return len; | ||
| 126 | } | ||
| 127 | |||
| 128 | static inline bool ieee802154_addr_equal(const struct ieee802154_addr *a1, | ||
| 129 | const struct ieee802154_addr *a2) | ||
| 130 | { | ||
| 131 | if (a1->pan_id != a2->pan_id || a1->mode != a2->mode) | ||
| 132 | return false; | ||
| 133 | |||
| 134 | if ((a1->mode == IEEE802154_ADDR_LONG && | ||
| 135 | a1->extended_addr != a2->extended_addr) || | ||
| 136 | (a1->mode == IEEE802154_ADDR_SHORT && | ||
| 137 | a1->short_addr != a2->short_addr)) | ||
| 138 | return false; | ||
| 139 | |||
| 140 | return true; | ||
| 141 | } | ||
| 142 | |||
| 143 | static inline __le64 ieee802154_devaddr_from_raw(const void *raw) | ||
| 144 | { | ||
| 145 | u64 temp; | ||
| 146 | |||
| 147 | memcpy(&temp, raw, IEEE802154_ADDR_LEN); | ||
| 148 | return (__force __le64)swab64(temp); | ||
| 149 | } | ||
| 150 | |||
| 151 | static inline void ieee802154_devaddr_to_raw(void *raw, __le64 addr) | ||
| 152 | { | ||
| 153 | u64 temp = swab64((__force u64)addr); | ||
| 154 | |||
| 155 | memcpy(raw, &temp, IEEE802154_ADDR_LEN); | ||
| 156 | } | ||
| 157 | |||
| 158 | static inline void ieee802154_addr_from_sa(struct ieee802154_addr *a, | ||
| 159 | const struct ieee802154_addr_sa *sa) | ||
| 160 | { | ||
| 161 | a->mode = sa->addr_type; | ||
| 162 | a->pan_id = cpu_to_le16(sa->pan_id); | ||
| 163 | |||
| 164 | switch (a->mode) { | ||
| 165 | case IEEE802154_ADDR_SHORT: | ||
| 166 | a->short_addr = cpu_to_le16(sa->short_addr); | ||
| 167 | break; | ||
| 168 | case IEEE802154_ADDR_LONG: | ||
| 169 | a->extended_addr = ieee802154_devaddr_from_raw(sa->hwaddr); | ||
| 170 | break; | ||
| 171 | } | ||
| 172 | } | ||
| 173 | |||
| 174 | static inline void ieee802154_addr_to_sa(struct ieee802154_addr_sa *sa, | ||
| 175 | const struct ieee802154_addr *a) | ||
| 176 | { | ||
| 177 | sa->addr_type = a->mode; | ||
| 178 | sa->pan_id = le16_to_cpu(a->pan_id); | ||
| 179 | |||
| 180 | switch (a->mode) { | ||
| 181 | case IEEE802154_ADDR_SHORT: | ||
| 182 | sa->short_addr = le16_to_cpu(a->short_addr); | ||
| 183 | break; | ||
| 184 | case IEEE802154_ADDR_LONG: | ||
| 185 | ieee802154_devaddr_to_raw(sa->hwaddr, a->extended_addr); | ||
| 186 | break; | ||
| 187 | } | ||
| 188 | } | ||
| 31 | 189 | ||
| 32 | /* | 190 | /* |
| 33 | * A control block of skb passed between the ARPHRD_IEEE802154 device | 191 | * A control block of skb passed between the ARPHRD_IEEE802154 device |
| @@ -35,10 +193,10 @@ | |||
| 35 | */ | 193 | */ |
| 36 | struct ieee802154_mac_cb { | 194 | struct ieee802154_mac_cb { |
| 37 | u8 lqi; | 195 | u8 lqi; |
| 38 | struct ieee802154_addr sa; | ||
| 39 | struct ieee802154_addr da; | ||
| 40 | u8 flags; | 196 | u8 flags; |
| 41 | u8 seq; | 197 | u8 seq; |
| 198 | struct ieee802154_addr source; | ||
| 199 | struct ieee802154_addr dest; | ||
| 42 | }; | 200 | }; |
| 43 | 201 | ||
| 44 | static inline struct ieee802154_mac_cb *mac_cb(struct sk_buff *skb) | 202 | static inline struct ieee802154_mac_cb *mac_cb(struct sk_buff *skb) |
| @@ -50,23 +208,17 @@ static inline struct ieee802154_mac_cb *mac_cb(struct sk_buff *skb) | |||
| 50 | 208 | ||
| 51 | #define MAC_CB_FLAG_ACKREQ (1 << 3) | 209 | #define MAC_CB_FLAG_ACKREQ (1 << 3) |
| 52 | #define MAC_CB_FLAG_SECEN (1 << 4) | 210 | #define MAC_CB_FLAG_SECEN (1 << 4) |
| 53 | #define MAC_CB_FLAG_INTRAPAN (1 << 5) | ||
| 54 | 211 | ||
| 55 | static inline int mac_cb_is_ackreq(struct sk_buff *skb) | 212 | static inline bool mac_cb_is_ackreq(struct sk_buff *skb) |
| 56 | { | 213 | { |
| 57 | return mac_cb(skb)->flags & MAC_CB_FLAG_ACKREQ; | 214 | return mac_cb(skb)->flags & MAC_CB_FLAG_ACKREQ; |
| 58 | } | 215 | } |
| 59 | 216 | ||
| 60 | static inline int mac_cb_is_secen(struct sk_buff *skb) | 217 | static inline bool mac_cb_is_secen(struct sk_buff *skb) |
| 61 | { | 218 | { |
| 62 | return mac_cb(skb)->flags & MAC_CB_FLAG_SECEN; | 219 | return mac_cb(skb)->flags & MAC_CB_FLAG_SECEN; |
| 63 | } | 220 | } |
| 64 | 221 | ||
| 65 | static inline int mac_cb_is_intrapan(struct sk_buff *skb) | ||
| 66 | { | ||
| 67 | return mac_cb(skb)->flags & MAC_CB_FLAG_INTRAPAN; | ||
| 68 | } | ||
| 69 | |||
| 70 | static inline int mac_cb_type(struct sk_buff *skb) | 222 | static inline int mac_cb_type(struct sk_buff *skb) |
| 71 | { | 223 | { |
| 72 | return mac_cb(skb)->flags & MAC_CB_FLAG_TYPEMASK; | 224 | return mac_cb(skb)->flags & MAC_CB_FLAG_TYPEMASK; |
| @@ -77,6 +229,18 @@ static inline int mac_cb_type(struct sk_buff *skb) | |||
| 77 | #define IEEE802154_MAC_SCAN_PASSIVE 2 | 229 | #define IEEE802154_MAC_SCAN_PASSIVE 2 |
| 78 | #define IEEE802154_MAC_SCAN_ORPHAN 3 | 230 | #define IEEE802154_MAC_SCAN_ORPHAN 3 |
| 79 | 231 | ||
| 232 | struct ieee802154_mac_params { | ||
| 233 | s8 transmit_power; | ||
| 234 | u8 min_be; | ||
| 235 | u8 max_be; | ||
| 236 | u8 csma_retries; | ||
| 237 | s8 frame_retries; | ||
| 238 | |||
| 239 | bool lbt; | ||
| 240 | u8 cca_mode; | ||
| 241 | s32 cca_ed_level; | ||
| 242 | }; | ||
| 243 | |||
| 80 | struct wpan_phy; | 244 | struct wpan_phy; |
| 81 | /* | 245 | /* |
| 82 | * This should be located at net_device->ml_priv | 246 | * This should be located at net_device->ml_priv |
| @@ -92,7 +256,7 @@ struct ieee802154_mlme_ops { | |||
| 92 | u8 channel, u8 page, u8 cap); | 256 | u8 channel, u8 page, u8 cap); |
| 93 | int (*assoc_resp)(struct net_device *dev, | 257 | int (*assoc_resp)(struct net_device *dev, |
| 94 | struct ieee802154_addr *addr, | 258 | struct ieee802154_addr *addr, |
| 95 | u16 short_addr, u8 status); | 259 | __le16 short_addr, u8 status); |
| 96 | int (*disassoc_req)(struct net_device *dev, | 260 | int (*disassoc_req)(struct net_device *dev, |
| 97 | struct ieee802154_addr *addr, | 261 | struct ieee802154_addr *addr, |
| 98 | u8 reason); | 262 | u8 reason); |
| @@ -103,6 +267,11 @@ struct ieee802154_mlme_ops { | |||
| 103 | int (*scan_req)(struct net_device *dev, | 267 | int (*scan_req)(struct net_device *dev, |
| 104 | u8 type, u32 channels, u8 page, u8 duration); | 268 | u8 type, u32 channels, u8 page, u8 duration); |
| 105 | 269 | ||
| 270 | int (*set_mac_params)(struct net_device *dev, | ||
| 271 | const struct ieee802154_mac_params *params); | ||
| 272 | void (*get_mac_params)(struct net_device *dev, | ||
| 273 | struct ieee802154_mac_params *params); | ||
| 274 | |||
| 106 | /* The fields below are required. */ | 275 | /* The fields below are required. */ |
| 107 | 276 | ||
| 108 | struct wpan_phy *(*get_phy)(const struct net_device *dev); | 277 | struct wpan_phy *(*get_phy)(const struct net_device *dev); |
| @@ -111,8 +280,8 @@ struct ieee802154_mlme_ops { | |||
| 111 | * FIXME: these should become the part of PIB/MIB interface. | 280 | * FIXME: these should become the part of PIB/MIB interface. |
| 112 | * However we still don't have IB interface of any kind | 281 | * However we still don't have IB interface of any kind |
| 113 | */ | 282 | */ |
| 114 | u16 (*get_pan_id)(const struct net_device *dev); | 283 | __le16 (*get_pan_id)(const struct net_device *dev); |
| 115 | u16 (*get_short_addr)(const struct net_device *dev); | 284 | __le16 (*get_short_addr)(const struct net_device *dev); |
| 116 | u8 (*get_dsn)(const struct net_device *dev); | 285 | u8 (*get_dsn)(const struct net_device *dev); |
| 117 | }; | 286 | }; |
| 118 | 287 | ||
diff --git a/include/net/ip.h b/include/net/ip.h index 23be0fd37937..25064c28e059 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
| @@ -187,6 +187,7 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr, | |||
| 187 | #define NET_INC_STATS(net, field) SNMP_INC_STATS((net)->mib.net_statistics, field) | 187 | #define NET_INC_STATS(net, field) SNMP_INC_STATS((net)->mib.net_statistics, field) |
| 188 | #define NET_INC_STATS_BH(net, field) SNMP_INC_STATS_BH((net)->mib.net_statistics, field) | 188 | #define NET_INC_STATS_BH(net, field) SNMP_INC_STATS_BH((net)->mib.net_statistics, field) |
| 189 | #define NET_INC_STATS_USER(net, field) SNMP_INC_STATS_USER((net)->mib.net_statistics, field) | 189 | #define NET_INC_STATS_USER(net, field) SNMP_INC_STATS_USER((net)->mib.net_statistics, field) |
| 190 | #define NET_ADD_STATS(net, field, adnd) SNMP_ADD_STATS((net)->mib.net_statistics, field, adnd) | ||
| 190 | #define NET_ADD_STATS_BH(net, field, adnd) SNMP_ADD_STATS_BH((net)->mib.net_statistics, field, adnd) | 191 | #define NET_ADD_STATS_BH(net, field, adnd) SNMP_ADD_STATS_BH((net)->mib.net_statistics, field, adnd) |
| 191 | #define NET_ADD_STATS_USER(net, field, adnd) SNMP_ADD_STATS_USER((net)->mib.net_statistics, field, adnd) | 192 | #define NET_ADD_STATS_USER(net, field, adnd) SNMP_ADD_STATS_USER((net)->mib.net_statistics, field, adnd) |
| 192 | 193 | ||
| @@ -266,7 +267,8 @@ int ip_dont_fragment(struct sock *sk, struct dst_entry *dst) | |||
| 266 | 267 | ||
| 267 | static inline bool ip_sk_accept_pmtu(const struct sock *sk) | 268 | static inline bool ip_sk_accept_pmtu(const struct sock *sk) |
| 268 | { | 269 | { |
| 269 | return inet_sk(sk)->pmtudisc != IP_PMTUDISC_INTERFACE; | 270 | return inet_sk(sk)->pmtudisc != IP_PMTUDISC_INTERFACE && |
| 271 | inet_sk(sk)->pmtudisc != IP_PMTUDISC_OMIT; | ||
| 270 | } | 272 | } |
| 271 | 273 | ||
| 272 | static inline bool ip_sk_use_pmtu(const struct sock *sk) | 274 | static inline bool ip_sk_use_pmtu(const struct sock *sk) |
| @@ -274,6 +276,12 @@ static inline bool ip_sk_use_pmtu(const struct sock *sk) | |||
| 274 | return inet_sk(sk)->pmtudisc < IP_PMTUDISC_PROBE; | 276 | return inet_sk(sk)->pmtudisc < IP_PMTUDISC_PROBE; |
| 275 | } | 277 | } |
| 276 | 278 | ||
| 279 | static inline bool ip_sk_local_df(const struct sock *sk) | ||
| 280 | { | ||
| 281 | return inet_sk(sk)->pmtudisc < IP_PMTUDISC_DO || | ||
| 282 | inet_sk(sk)->pmtudisc == IP_PMTUDISC_OMIT; | ||
| 283 | } | ||
| 284 | |||
| 277 | static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst, | 285 | static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst, |
| 278 | bool forwarding) | 286 | bool forwarding) |
| 279 | { | 287 | { |
| @@ -489,7 +497,8 @@ int ip_options_rcv_srr(struct sk_buff *skb); | |||
| 489 | 497 | ||
| 490 | void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb); | 498 | void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb); |
| 491 | void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb); | 499 | void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb); |
| 492 | int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc); | 500 | int ip_cmsg_send(struct net *net, struct msghdr *msg, |
| 501 | struct ipcm_cookie *ipc, bool allow_ipv6); | ||
| 493 | int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval, | 502 | int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval, |
| 494 | unsigned int optlen); | 503 | unsigned int optlen); |
| 495 | int ip_getsockopt(struct sock *sk, int level, int optname, char __user *optval, | 504 | int ip_getsockopt(struct sock *sk, int level, int optname, char __user *optval, |
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index aca0c2709fd6..9bcb220bd4ad 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h | |||
| @@ -284,7 +284,8 @@ struct fib6_node *fib6_locate(struct fib6_node *root, | |||
| 284 | void fib6_clean_all(struct net *net, int (*func)(struct rt6_info *, void *arg), | 284 | void fib6_clean_all(struct net *net, int (*func)(struct rt6_info *, void *arg), |
| 285 | void *arg); | 285 | void *arg); |
| 286 | 286 | ||
| 287 | int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nl_info *info); | 287 | int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nl_info *info, |
| 288 | struct nlattr *mx, int mx_len); | ||
| 288 | 289 | ||
| 289 | int fib6_del(struct rt6_info *rt, struct nl_info *info); | 290 | int fib6_del(struct rt6_info *rt, struct nl_info *info); |
| 290 | 291 | ||
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 017badb1aec7..3c3bb184eb8f 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h | |||
| @@ -51,6 +51,11 @@ static inline unsigned int rt6_flags2srcprefs(int flags) | |||
| 51 | return (flags >> 3) & 7; | 51 | return (flags >> 3) & 7; |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | static inline bool rt6_need_strict(const struct in6_addr *daddr) | ||
| 55 | { | ||
| 56 | return ipv6_addr_type(daddr) & | ||
| 57 | (IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL | IPV6_ADDR_LOOPBACK); | ||
| 58 | } | ||
| 54 | 59 | ||
| 55 | void ip6_route_input(struct sk_buff *skb); | 60 | void ip6_route_input(struct sk_buff *skb); |
| 56 | 61 | ||
| @@ -171,7 +176,14 @@ static inline int ip6_skb_dst_mtu(struct sk_buff *skb) | |||
| 171 | 176 | ||
| 172 | static inline bool ip6_sk_accept_pmtu(const struct sock *sk) | 177 | static inline bool ip6_sk_accept_pmtu(const struct sock *sk) |
| 173 | { | 178 | { |
| 174 | return inet6_sk(sk)->pmtudisc != IPV6_PMTUDISC_INTERFACE; | 179 | return inet6_sk(sk)->pmtudisc != IPV6_PMTUDISC_INTERFACE && |
| 180 | inet6_sk(sk)->pmtudisc != IPV6_PMTUDISC_OMIT; | ||
| 181 | } | ||
| 182 | |||
| 183 | static inline bool ip6_sk_local_df(const struct sock *sk) | ||
| 184 | { | ||
| 185 | return inet6_sk(sk)->pmtudisc < IPV6_PMTUDISC_DO || | ||
| 186 | inet6_sk(sk)->pmtudisc == IPV6_PMTUDISC_OMIT; | ||
| 175 | } | 187 | } |
| 176 | 188 | ||
| 177 | static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt) | 189 | static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt) |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 703b1f1456fc..8248e3909fdf 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
| @@ -66,10 +66,6 @@ | |||
| 66 | * | 66 | * |
| 67 | * Secondly, when the hardware handles fragmentation, the frame handed to | 67 | * Secondly, when the hardware handles fragmentation, the frame handed to |
| 68 | * the driver from mac80211 is the MSDU, not the MPDU. | 68 | * the driver from mac80211 is the MSDU, not the MPDU. |
| 69 | * | ||
| 70 | * Finally, for received frames, the driver is able to indicate that it has | ||
| 71 | * filled a radiotap header and put that in front of the frame; if it does | ||
| 72 | * not do so then mac80211 may add this under certain circumstances. | ||
| 73 | */ | 69 | */ |
| 74 | 70 | ||
| 75 | /** | 71 | /** |
| @@ -701,11 +697,11 @@ struct ieee80211_tx_info { | |||
| 701 | } control; | 697 | } control; |
| 702 | struct { | 698 | struct { |
| 703 | struct ieee80211_tx_rate rates[IEEE80211_TX_MAX_RATES]; | 699 | struct ieee80211_tx_rate rates[IEEE80211_TX_MAX_RATES]; |
| 704 | int ack_signal; | 700 | s32 ack_signal; |
| 705 | u8 ampdu_ack_len; | 701 | u8 ampdu_ack_len; |
| 706 | u8 ampdu_len; | 702 | u8 ampdu_len; |
| 707 | u8 antenna; | 703 | u8 antenna; |
| 708 | /* 21 bytes free */ | 704 | void *status_driver_data[21 / sizeof(void *)]; |
| 709 | } status; | 705 | } status; |
| 710 | struct { | 706 | struct { |
| 711 | struct ieee80211_tx_rate driver_rates[ | 707 | struct ieee80211_tx_rate driver_rates[ |
| @@ -808,9 +804,6 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info) | |||
| 808 | * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index | 804 | * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index |
| 809 | * @RX_FLAG_VHT: VHT MCS was used and rate_index is MCS index | 805 | * @RX_FLAG_VHT: VHT MCS was used and rate_index is MCS index |
| 810 | * @RX_FLAG_40MHZ: HT40 (40 MHz) was used | 806 | * @RX_FLAG_40MHZ: HT40 (40 MHz) was used |
| 811 | * @RX_FLAG_80MHZ: 80 MHz was used | ||
| 812 | * @RX_FLAG_80P80MHZ: 80+80 MHz was used | ||
| 813 | * @RX_FLAG_160MHZ: 160 MHz was used | ||
| 814 | * @RX_FLAG_SHORT_GI: Short guard interval was used | 807 | * @RX_FLAG_SHORT_GI: Short guard interval was used |
| 815 | * @RX_FLAG_NO_SIGNAL_VAL: The signal strength value is not present. | 808 | * @RX_FLAG_NO_SIGNAL_VAL: The signal strength value is not present. |
| 816 | * Valid only for data frames (mainly A-MPDU) | 809 | * Valid only for data frames (mainly A-MPDU) |
| @@ -830,6 +823,7 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info) | |||
| 830 | * on this subframe | 823 | * on this subframe |
| 831 | * @RX_FLAG_AMPDU_DELIM_CRC_KNOWN: The delimiter CRC field is known (the CRC | 824 | * @RX_FLAG_AMPDU_DELIM_CRC_KNOWN: The delimiter CRC field is known (the CRC |
| 832 | * is stored in the @ampdu_delimiter_crc field) | 825 | * is stored in the @ampdu_delimiter_crc field) |
| 826 | * @RX_FLAG_LDPC: LDPC was used | ||
| 833 | * @RX_FLAG_STBC_MASK: STBC 2 bit bitmask. 1 - Nss=1, 2 - Nss=2, 3 - Nss=3 | 827 | * @RX_FLAG_STBC_MASK: STBC 2 bit bitmask. 1 - Nss=1, 2 - Nss=2, 3 - Nss=3 |
| 834 | * @RX_FLAG_10MHZ: 10 MHz (half channel) was used | 828 | * @RX_FLAG_10MHZ: 10 MHz (half channel) was used |
| 835 | * @RX_FLAG_5MHZ: 5 MHz (quarter channel) was used | 829 | * @RX_FLAG_5MHZ: 5 MHz (quarter channel) was used |
| @@ -866,9 +860,7 @@ enum mac80211_rx_flags { | |||
| 866 | RX_FLAG_AMPDU_DELIM_CRC_KNOWN = BIT(20), | 860 | RX_FLAG_AMPDU_DELIM_CRC_KNOWN = BIT(20), |
| 867 | RX_FLAG_MACTIME_END = BIT(21), | 861 | RX_FLAG_MACTIME_END = BIT(21), |
| 868 | RX_FLAG_VHT = BIT(22), | 862 | RX_FLAG_VHT = BIT(22), |
| 869 | RX_FLAG_80MHZ = BIT(23), | 863 | RX_FLAG_LDPC = BIT(23), |
| 870 | RX_FLAG_80P80MHZ = BIT(24), | ||
| 871 | RX_FLAG_160MHZ = BIT(25), | ||
| 872 | RX_FLAG_STBC_MASK = BIT(26) | BIT(27), | 864 | RX_FLAG_STBC_MASK = BIT(26) | BIT(27), |
| 873 | RX_FLAG_10MHZ = BIT(28), | 865 | RX_FLAG_10MHZ = BIT(28), |
| 874 | RX_FLAG_5MHZ = BIT(29), | 866 | RX_FLAG_5MHZ = BIT(29), |
| @@ -878,6 +870,23 @@ enum mac80211_rx_flags { | |||
| 878 | #define RX_FLAG_STBC_SHIFT 26 | 870 | #define RX_FLAG_STBC_SHIFT 26 |
| 879 | 871 | ||
| 880 | /** | 872 | /** |
| 873 | * enum mac80211_rx_vht_flags - receive VHT flags | ||
| 874 | * | ||
| 875 | * These flags are used with the @vht_flag member of | ||
| 876 | * &struct ieee80211_rx_status. | ||
| 877 | * @RX_VHT_FLAG_80MHZ: 80 MHz was used | ||
| 878 | * @RX_VHT_FLAG_80P80MHZ: 80+80 MHz was used | ||
| 879 | * @RX_VHT_FLAG_160MHZ: 160 MHz was used | ||
| 880 | * @RX_VHT_FLAG_BF: packet was beamformed | ||
| 881 | */ | ||
| 882 | enum mac80211_rx_vht_flags { | ||
| 883 | RX_VHT_FLAG_80MHZ = BIT(0), | ||
| 884 | RX_VHT_FLAG_80P80MHZ = BIT(1), | ||
| 885 | RX_VHT_FLAG_160MHZ = BIT(2), | ||
| 886 | RX_VHT_FLAG_BF = BIT(3), | ||
| 887 | }; | ||
| 888 | |||
| 889 | /** | ||
| 881 | * struct ieee80211_rx_status - receive status | 890 | * struct ieee80211_rx_status - receive status |
| 882 | * | 891 | * |
| 883 | * The low-level driver should provide this information (the subset | 892 | * The low-level driver should provide this information (the subset |
| @@ -902,26 +911,19 @@ enum mac80211_rx_flags { | |||
| 902 | * HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT) | 911 | * HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT) |
| 903 | * @vht_nss: number of streams (VHT only) | 912 | * @vht_nss: number of streams (VHT only) |
| 904 | * @flag: %RX_FLAG_* | 913 | * @flag: %RX_FLAG_* |
| 914 | * @vht_flag: %RX_VHT_FLAG_* | ||
| 905 | * @rx_flags: internal RX flags for mac80211 | 915 | * @rx_flags: internal RX flags for mac80211 |
| 906 | * @ampdu_reference: A-MPDU reference number, must be a different value for | 916 | * @ampdu_reference: A-MPDU reference number, must be a different value for |
| 907 | * each A-MPDU but the same for each subframe within one A-MPDU | 917 | * each A-MPDU but the same for each subframe within one A-MPDU |
| 908 | * @ampdu_delimiter_crc: A-MPDU delimiter CRC | 918 | * @ampdu_delimiter_crc: A-MPDU delimiter CRC |
| 909 | * @vendor_radiotap_bitmap: radiotap vendor namespace presence bitmap | ||
| 910 | * @vendor_radiotap_len: radiotap vendor namespace length | ||
| 911 | * @vendor_radiotap_align: radiotap vendor namespace alignment. Note | ||
| 912 | * that the actual data must be at the start of the SKB data | ||
| 913 | * already. | ||
| 914 | * @vendor_radiotap_oui: radiotap vendor namespace OUI | ||
| 915 | * @vendor_radiotap_subns: radiotap vendor sub namespace | ||
| 916 | */ | 919 | */ |
| 917 | struct ieee80211_rx_status { | 920 | struct ieee80211_rx_status { |
| 918 | u64 mactime; | 921 | u64 mactime; |
| 919 | u32 device_timestamp; | 922 | u32 device_timestamp; |
| 920 | u32 ampdu_reference; | 923 | u32 ampdu_reference; |
| 921 | u32 flag; | 924 | u32 flag; |
| 922 | u32 vendor_radiotap_bitmap; | ||
| 923 | u16 vendor_radiotap_len; | ||
| 924 | u16 freq; | 925 | u16 freq; |
| 926 | u8 vht_flag; | ||
| 925 | u8 rate_idx; | 927 | u8 rate_idx; |
| 926 | u8 vht_nss; | 928 | u8 vht_nss; |
| 927 | u8 rx_flags; | 929 | u8 rx_flags; |
| @@ -931,9 +933,6 @@ struct ieee80211_rx_status { | |||
| 931 | u8 chains; | 933 | u8 chains; |
| 932 | s8 chain_signal[IEEE80211_MAX_CHAINS]; | 934 | s8 chain_signal[IEEE80211_MAX_CHAINS]; |
| 933 | u8 ampdu_delimiter_crc; | 935 | u8 ampdu_delimiter_crc; |
| 934 | u8 vendor_radiotap_align; | ||
| 935 | u8 vendor_radiotap_oui[3]; | ||
| 936 | u8 vendor_radiotap_subns; | ||
| 937 | }; | 936 | }; |
| 938 | 937 | ||
| 939 | /** | 938 | /** |
| @@ -1506,8 +1505,6 @@ struct ieee80211_tx_control { | |||
| 1506 | * @IEEE80211_HW_CONNECTION_MONITOR: | 1505 | * @IEEE80211_HW_CONNECTION_MONITOR: |
| 1507 | * The hardware performs its own connection monitoring, including | 1506 | * The hardware performs its own connection monitoring, including |
| 1508 | * periodic keep-alives to the AP and probing the AP on beacon loss. | 1507 | * periodic keep-alives to the AP and probing the AP on beacon loss. |
| 1509 | * When this flag is set, signaling beacon-loss will cause an immediate | ||
| 1510 | * change to disassociated state. | ||
| 1511 | * | 1508 | * |
| 1512 | * @IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC: | 1509 | * @IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC: |
| 1513 | * This device needs to get data from beacon before association (i.e. | 1510 | * This device needs to get data from beacon before association (i.e. |
| @@ -1643,10 +1640,6 @@ enum ieee80211_hw_flags { | |||
| 1643 | * the hw can report back. | 1640 | * the hw can report back. |
| 1644 | * @max_rate_tries: maximum number of tries for each stage | 1641 | * @max_rate_tries: maximum number of tries for each stage |
| 1645 | * | 1642 | * |
| 1646 | * @napi_weight: weight used for NAPI polling. You must specify an | ||
| 1647 | * appropriate value here if a napi_poll operation is provided | ||
| 1648 | * by your driver. | ||
| 1649 | * | ||
| 1650 | * @max_rx_aggregation_subframes: maximum buffer size (number of | 1643 | * @max_rx_aggregation_subframes: maximum buffer size (number of |
| 1651 | * sub-frames) to be used for A-MPDU block ack receiver | 1644 | * sub-frames) to be used for A-MPDU block ack receiver |
| 1652 | * aggregation. | 1645 | * aggregation. |
| @@ -1700,7 +1693,6 @@ struct ieee80211_hw { | |||
| 1700 | int vif_data_size; | 1693 | int vif_data_size; |
| 1701 | int sta_data_size; | 1694 | int sta_data_size; |
| 1702 | int chanctx_data_size; | 1695 | int chanctx_data_size; |
| 1703 | int napi_weight; | ||
| 1704 | u16 queues; | 1696 | u16 queues; |
| 1705 | u16 max_listen_interval; | 1697 | u16 max_listen_interval; |
| 1706 | s8 max_signal; | 1698 | s8 max_signal; |
| @@ -2470,6 +2462,7 @@ enum ieee80211_roc_type { | |||
| 2470 | * This process will continue until sched_scan_stop is called. | 2462 | * This process will continue until sched_scan_stop is called. |
| 2471 | * | 2463 | * |
| 2472 | * @sched_scan_stop: Tell the hardware to stop an ongoing scheduled scan. | 2464 | * @sched_scan_stop: Tell the hardware to stop an ongoing scheduled scan. |
| 2465 | * In this case, ieee80211_sched_scan_stopped() must not be called. | ||
| 2473 | * | 2466 | * |
| 2474 | * @sw_scan_start: Notifier function that is called just before a software scan | 2467 | * @sw_scan_start: Notifier function that is called just before a software scan |
| 2475 | * is started. Can be NULL, if the driver doesn't need this notification. | 2468 | * is started. Can be NULL, if the driver doesn't need this notification. |
| @@ -2623,8 +2616,6 @@ enum ieee80211_roc_type { | |||
| 2623 | * callback. They must then call ieee80211_chswitch_done() to indicate | 2616 | * callback. They must then call ieee80211_chswitch_done() to indicate |
| 2624 | * completion of the channel switch. | 2617 | * completion of the channel switch. |
| 2625 | * | 2618 | * |
| 2626 | * @napi_poll: Poll Rx queue for incoming data frames. | ||
| 2627 | * | ||
| 2628 | * @set_antenna: Set antenna configuration (tx_ant, rx_ant) on the device. | 2619 | * @set_antenna: Set antenna configuration (tx_ant, rx_ant) on the device. |
| 2629 | * Parameters are bitmaps of allowed antennas to use for TX/RX. Drivers may | 2620 | * Parameters are bitmaps of allowed antennas to use for TX/RX. Drivers may |
| 2630 | * reject TX/RX mask combinations they cannot support by returning -EINVAL | 2621 | * reject TX/RX mask combinations they cannot support by returning -EINVAL |
| @@ -2750,11 +2741,13 @@ enum ieee80211_roc_type { | |||
| 2750 | * @channel_switch_beacon: Starts a channel switch to a new channel. | 2741 | * @channel_switch_beacon: Starts a channel switch to a new channel. |
| 2751 | * Beacons are modified to include CSA or ECSA IEs before calling this | 2742 | * Beacons are modified to include CSA or ECSA IEs before calling this |
| 2752 | * function. The corresponding count fields in these IEs must be | 2743 | * function. The corresponding count fields in these IEs must be |
| 2753 | * decremented, and when they reach zero the driver must call | 2744 | * decremented, and when they reach 1 the driver must call |
| 2754 | * ieee80211_csa_finish(). Drivers which use ieee80211_beacon_get() | 2745 | * ieee80211_csa_finish(). Drivers which use ieee80211_beacon_get() |
| 2755 | * get the csa counter decremented by mac80211, but must check if it is | 2746 | * get the csa counter decremented by mac80211, but must check if it is |
| 2756 | * zero using ieee80211_csa_is_complete() after the beacon has been | 2747 | * 1 using ieee80211_csa_is_complete() after the beacon has been |
| 2757 | * transmitted and then call ieee80211_csa_finish(). | 2748 | * transmitted and then call ieee80211_csa_finish(). |
| 2749 | * If the CSA count starts as zero or 1, this function will not be called, | ||
| 2750 | * since there won't be any time to beacon before the switch anyway. | ||
| 2758 | * | 2751 | * |
| 2759 | * @join_ibss: Join an IBSS (on an IBSS interface); this is called after all | 2752 | * @join_ibss: Join an IBSS (on an IBSS interface); this is called after all |
| 2760 | * information in bss_conf is set up and the beacon can be retrieved. A | 2753 | * information in bss_conf is set up and the beacon can be retrieved. A |
| @@ -2817,7 +2810,7 @@ struct ieee80211_ops { | |||
| 2817 | struct ieee80211_vif *vif, | 2810 | struct ieee80211_vif *vif, |
| 2818 | struct cfg80211_sched_scan_request *req, | 2811 | struct cfg80211_sched_scan_request *req, |
| 2819 | struct ieee80211_sched_scan_ies *ies); | 2812 | struct ieee80211_sched_scan_ies *ies); |
| 2820 | void (*sched_scan_stop)(struct ieee80211_hw *hw, | 2813 | int (*sched_scan_stop)(struct ieee80211_hw *hw, |
| 2821 | struct ieee80211_vif *vif); | 2814 | struct ieee80211_vif *vif); |
| 2822 | void (*sw_scan_start)(struct ieee80211_hw *hw); | 2815 | void (*sw_scan_start)(struct ieee80211_hw *hw); |
| 2823 | void (*sw_scan_complete)(struct ieee80211_hw *hw); | 2816 | void (*sw_scan_complete)(struct ieee80211_hw *hw); |
| @@ -2881,7 +2874,6 @@ struct ieee80211_ops { | |||
| 2881 | void (*flush)(struct ieee80211_hw *hw, u32 queues, bool drop); | 2874 | void (*flush)(struct ieee80211_hw *hw, u32 queues, bool drop); |
| 2882 | void (*channel_switch)(struct ieee80211_hw *hw, | 2875 | void (*channel_switch)(struct ieee80211_hw *hw, |
| 2883 | struct ieee80211_channel_switch *ch_switch); | 2876 | struct ieee80211_channel_switch *ch_switch); |
| 2884 | int (*napi_poll)(struct ieee80211_hw *hw, int budget); | ||
| 2885 | int (*set_antenna)(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant); | 2877 | int (*set_antenna)(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant); |
| 2886 | int (*get_antenna)(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant); | 2878 | int (*get_antenna)(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant); |
| 2887 | 2879 | ||
| @@ -3163,21 +3155,21 @@ void ieee80211_free_hw(struct ieee80211_hw *hw); | |||
| 3163 | */ | 3155 | */ |
| 3164 | void ieee80211_restart_hw(struct ieee80211_hw *hw); | 3156 | void ieee80211_restart_hw(struct ieee80211_hw *hw); |
| 3165 | 3157 | ||
| 3166 | /** ieee80211_napi_schedule - schedule NAPI poll | 3158 | /** |
| 3167 | * | 3159 | * ieee80211_napi_add - initialize mac80211 NAPI context |
| 3168 | * Use this function to schedule NAPI polling on a device. | 3160 | * @hw: the hardware to initialize the NAPI context on |
| 3169 | * | 3161 | * @napi: the NAPI context to initialize |
| 3170 | * @hw: the hardware to start polling | 3162 | * @napi_dev: dummy NAPI netdevice, here to not waste the space if the |
| 3171 | */ | 3163 | * driver doesn't use NAPI |
| 3172 | void ieee80211_napi_schedule(struct ieee80211_hw *hw); | 3164 | * @poll: poll function |
| 3173 | 3165 | * @weight: default weight | |
| 3174 | /** ieee80211_napi_complete - complete NAPI polling | ||
| 3175 | * | ||
| 3176 | * Use this function to finish NAPI polling on a device. | ||
| 3177 | * | 3166 | * |
| 3178 | * @hw: the hardware to stop polling | 3167 | * See also netif_napi_add(). |
| 3179 | */ | 3168 | */ |
| 3180 | void ieee80211_napi_complete(struct ieee80211_hw *hw); | 3169 | void ieee80211_napi_add(struct ieee80211_hw *hw, struct napi_struct *napi, |
| 3170 | struct net_device *napi_dev, | ||
| 3171 | int (*poll)(struct napi_struct *, int), | ||
| 3172 | int weight); | ||
| 3181 | 3173 | ||
| 3182 | /** | 3174 | /** |
| 3183 | * ieee80211_rx - receive frame | 3175 | * ieee80211_rx - receive frame |
| @@ -3452,13 +3444,13 @@ static inline struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, | |||
| 3452 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. | 3444 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. |
| 3453 | * | 3445 | * |
| 3454 | * After a channel switch announcement was scheduled and the counter in this | 3446 | * After a channel switch announcement was scheduled and the counter in this |
| 3455 | * announcement hit zero, this function must be called by the driver to | 3447 | * announcement hits 1, this function must be called by the driver to |
| 3456 | * notify mac80211 that the channel can be changed. | 3448 | * notify mac80211 that the channel can be changed. |
| 3457 | */ | 3449 | */ |
| 3458 | void ieee80211_csa_finish(struct ieee80211_vif *vif); | 3450 | void ieee80211_csa_finish(struct ieee80211_vif *vif); |
| 3459 | 3451 | ||
| 3460 | /** | 3452 | /** |
| 3461 | * ieee80211_csa_is_complete - find out if counters reached zero | 3453 | * ieee80211_csa_is_complete - find out if counters reached 1 |
| 3462 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. | 3454 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. |
| 3463 | * | 3455 | * |
| 3464 | * This function returns whether the channel switch counters reached zero. | 3456 | * This function returns whether the channel switch counters reached zero. |
| @@ -4451,7 +4443,6 @@ struct ieee80211_tx_rate_control { | |||
| 4451 | }; | 4443 | }; |
| 4452 | 4444 | ||
| 4453 | struct rate_control_ops { | 4445 | struct rate_control_ops { |
| 4454 | struct module *module; | ||
| 4455 | const char *name; | 4446 | const char *name; |
| 4456 | void *(*alloc)(struct ieee80211_hw *hw, struct dentry *debugfsdir); | 4447 | void *(*alloc)(struct ieee80211_hw *hw, struct dentry *debugfsdir); |
| 4457 | void (*free)(void *priv); | 4448 | void (*free)(void *priv); |
| @@ -4553,8 +4544,8 @@ int rate_control_set_rates(struct ieee80211_hw *hw, | |||
| 4553 | struct ieee80211_sta *pubsta, | 4544 | struct ieee80211_sta *pubsta, |
| 4554 | struct ieee80211_sta_rates *rates); | 4545 | struct ieee80211_sta_rates *rates); |
| 4555 | 4546 | ||
| 4556 | int ieee80211_rate_control_register(struct rate_control_ops *ops); | 4547 | int ieee80211_rate_control_register(const struct rate_control_ops *ops); |
| 4557 | void ieee80211_rate_control_unregister(struct rate_control_ops *ops); | 4548 | void ieee80211_rate_control_unregister(const struct rate_control_ops *ops); |
| 4558 | 4549 | ||
| 4559 | static inline bool | 4550 | static inline bool |
| 4560 | conf_is_ht20(struct ieee80211_conf *conf) | 4551 | conf_is_ht20(struct ieee80211_conf *conf) |
diff --git a/include/net/mac802154.h b/include/net/mac802154.h index 807d6b7a943f..a591053cae63 100644 --- a/include/net/mac802154.h +++ b/include/net/mac802154.h | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #define NET_MAC802154_H | 20 | #define NET_MAC802154_H |
| 21 | 21 | ||
| 22 | #include <net/af_ieee802154.h> | 22 | #include <net/af_ieee802154.h> |
| 23 | #include <linux/skbuff.h> | ||
| 23 | 24 | ||
| 24 | /* General MAC frame format: | 25 | /* General MAC frame format: |
| 25 | * 2 bytes: Frame Control | 26 | * 2 bytes: Frame Control |
| @@ -50,7 +51,7 @@ struct ieee802154_hw_addr_filt { | |||
| 50 | * devices across independent networks. | 51 | * devices across independent networks. |
| 51 | */ | 52 | */ |
| 52 | __le16 short_addr; | 53 | __le16 short_addr; |
| 53 | u8 ieee_addr[IEEE802154_ADDR_LEN]; | 54 | __le64 ieee_addr; |
| 54 | u8 pan_coord; | 55 | u8 pan_coord; |
| 55 | }; | 56 | }; |
| 56 | 57 | ||
| @@ -113,6 +114,32 @@ struct ieee802154_dev { | |||
| 113 | * Set radio for listening on specific address. | 114 | * Set radio for listening on specific address. |
| 114 | * Set the device for listening on specified address. | 115 | * Set the device for listening on specified address. |
| 115 | * Returns either zero, or negative errno. | 116 | * Returns either zero, or negative errno. |
| 117 | * | ||
| 118 | * set_txpower: | ||
| 119 | * Set radio transmit power in dB. Called with pib_lock held. | ||
| 120 | * Returns either zero, or negative errno. | ||
| 121 | * | ||
| 122 | * set_lbt | ||
| 123 | * Enables or disables listen before talk on the device. Called with | ||
| 124 | * pib_lock held. | ||
| 125 | * Returns either zero, or negative errno. | ||
| 126 | * | ||
| 127 | * set_cca_mode | ||
| 128 | * Sets the CCA mode used by the device. Called with pib_lock held. | ||
| 129 | * Returns either zero, or negative errno. | ||
| 130 | * | ||
| 131 | * set_cca_ed_level | ||
| 132 | * Sets the CCA energy detection threshold in dBm. Called with pib_lock | ||
| 133 | * held. | ||
| 134 | * Returns either zero, or negative errno. | ||
| 135 | * | ||
| 136 | * set_csma_params | ||
| 137 | * Sets the CSMA parameter set for the PHY. Called with pib_lock held. | ||
| 138 | * Returns either zero, or negative errno. | ||
| 139 | * | ||
| 140 | * set_frame_retries | ||
| 141 | * Sets the retransmission attempt limit. Called with pib_lock held. | ||
| 142 | * Returns either zero, or negative errno. | ||
| 116 | */ | 143 | */ |
| 117 | struct ieee802154_ops { | 144 | struct ieee802154_ops { |
| 118 | struct module *owner; | 145 | struct module *owner; |
| @@ -127,8 +154,16 @@ struct ieee802154_ops { | |||
| 127 | int (*set_hw_addr_filt)(struct ieee802154_dev *dev, | 154 | int (*set_hw_addr_filt)(struct ieee802154_dev *dev, |
| 128 | struct ieee802154_hw_addr_filt *filt, | 155 | struct ieee802154_hw_addr_filt *filt, |
| 129 | unsigned long changed); | 156 | unsigned long changed); |
| 130 | int (*ieee_addr)(struct ieee802154_dev *dev, | 157 | int (*ieee_addr)(struct ieee802154_dev *dev, __le64 addr); |
| 131 | u8 addr[IEEE802154_ADDR_LEN]); | 158 | int (*set_txpower)(struct ieee802154_dev *dev, int db); |
| 159 | int (*set_lbt)(struct ieee802154_dev *dev, bool on); | ||
| 160 | int (*set_cca_mode)(struct ieee802154_dev *dev, u8 mode); | ||
| 161 | int (*set_cca_ed_level)(struct ieee802154_dev *dev, | ||
| 162 | s32 level); | ||
| 163 | int (*set_csma_params)(struct ieee802154_dev *dev, | ||
| 164 | u8 min_be, u8 max_be, u8 retries); | ||
| 165 | int (*set_frame_retries)(struct ieee802154_dev *dev, | ||
| 166 | s8 retries); | ||
| 132 | }; | 167 | }; |
| 133 | 168 | ||
| 134 | /* Basic interface to register ieee802154 device */ | 169 | /* Basic interface to register ieee802154 device */ |
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 991dcd94cbbf..79387f73f875 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <net/netns/packet.h> | 15 | #include <net/netns/packet.h> |
| 16 | #include <net/netns/ipv4.h> | 16 | #include <net/netns/ipv4.h> |
| 17 | #include <net/netns/ipv6.h> | 17 | #include <net/netns/ipv6.h> |
| 18 | #include <net/netns/ieee802154_6lowpan.h> | ||
| 18 | #include <net/netns/sctp.h> | 19 | #include <net/netns/sctp.h> |
| 19 | #include <net/netns/dccp.h> | 20 | #include <net/netns/dccp.h> |
| 20 | #include <net/netns/netfilter.h> | 21 | #include <net/netns/netfilter.h> |
| @@ -90,6 +91,9 @@ struct net { | |||
| 90 | #if IS_ENABLED(CONFIG_IPV6) | 91 | #if IS_ENABLED(CONFIG_IPV6) |
| 91 | struct netns_ipv6 ipv6; | 92 | struct netns_ipv6 ipv6; |
| 92 | #endif | 93 | #endif |
| 94 | #if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN) | ||
| 95 | struct netns_ieee802154_lowpan ieee802154_lowpan; | ||
| 96 | #endif | ||
| 93 | #if defined(CONFIG_IP_SCTP) || defined(CONFIG_IP_SCTP_MODULE) | 97 | #if defined(CONFIG_IP_SCTP) || defined(CONFIG_IP_SCTP_MODULE) |
| 94 | struct netns_sctp sctp; | 98 | struct netns_sctp sctp; |
| 95 | #endif | 99 | #endif |
diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index b2ac6246b7e0..37252f71a380 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h | |||
| @@ -73,10 +73,17 @@ struct nf_conn_help { | |||
| 73 | 73 | ||
| 74 | struct nf_conn { | 74 | struct nf_conn { |
| 75 | /* Usage count in here is 1 for hash table/destruct timer, 1 per skb, | 75 | /* Usage count in here is 1 for hash table/destruct timer, 1 per skb, |
| 76 | plus 1 for any connection(s) we are `master' for */ | 76 | * plus 1 for any connection(s) we are `master' for |
| 77 | * | ||
| 78 | * Hint, SKB address this struct and refcnt via skb->nfct and | ||
| 79 | * helpers nf_conntrack_get() and nf_conntrack_put(). | ||
| 80 | * Helper nf_ct_put() equals nf_conntrack_put() by dec refcnt, | ||
| 81 | * beware nf_ct_get() is different and don't inc refcnt. | ||
| 82 | */ | ||
| 77 | struct nf_conntrack ct_general; | 83 | struct nf_conntrack ct_general; |
| 78 | 84 | ||
| 79 | spinlock_t lock; | 85 | spinlock_t lock; |
| 86 | u16 cpu; | ||
| 80 | 87 | ||
| 81 | /* XXX should I move this to the tail ? - Y.K */ | 88 | /* XXX should I move this to the tail ? - Y.K */ |
| 82 | /* These are my tuples; original and reply */ | 89 | /* These are my tuples; original and reply */ |
diff --git a/include/net/netfilter/nf_conntrack_core.h b/include/net/netfilter/nf_conntrack_core.h index 15308b8eb5b5..cc0c18827602 100644 --- a/include/net/netfilter/nf_conntrack_core.h +++ b/include/net/netfilter/nf_conntrack_core.h | |||
| @@ -77,6 +77,13 @@ print_tuple(struct seq_file *s, const struct nf_conntrack_tuple *tuple, | |||
| 77 | const struct nf_conntrack_l3proto *l3proto, | 77 | const struct nf_conntrack_l3proto *l3proto, |
| 78 | const struct nf_conntrack_l4proto *proto); | 78 | const struct nf_conntrack_l4proto *proto); |
| 79 | 79 | ||
| 80 | extern spinlock_t nf_conntrack_lock ; | 80 | #ifdef CONFIG_LOCKDEP |
| 81 | # define CONNTRACK_LOCKS 8 | ||
| 82 | #else | ||
| 83 | # define CONNTRACK_LOCKS 1024 | ||
| 84 | #endif | ||
| 85 | extern spinlock_t nf_conntrack_locks[CONNTRACK_LOCKS]; | ||
| 86 | |||
| 87 | extern spinlock_t nf_conntrack_expect_lock; | ||
| 81 | 88 | ||
| 82 | #endif /* _NF_CONNTRACK_CORE_H */ | 89 | #endif /* _NF_CONNTRACK_CORE_H */ |
diff --git a/include/net/netfilter/nf_conntrack_labels.h b/include/net/netfilter/nf_conntrack_labels.h index c985695283b3..dec6336bf850 100644 --- a/include/net/netfilter/nf_conntrack_labels.h +++ b/include/net/netfilter/nf_conntrack_labels.h | |||
| @@ -7,6 +7,8 @@ | |||
| 7 | 7 | ||
| 8 | #include <uapi/linux/netfilter/xt_connlabel.h> | 8 | #include <uapi/linux/netfilter/xt_connlabel.h> |
| 9 | 9 | ||
| 10 | #define NF_CT_LABELS_MAX_SIZE ((XT_CONNLABEL_MAXBIT + 1) / BITS_PER_BYTE) | ||
| 11 | |||
| 10 | struct nf_conn_labels { | 12 | struct nf_conn_labels { |
| 11 | u8 words; | 13 | u8 words; |
| 12 | unsigned long bits[]; | 14 | unsigned long bits[]; |
| @@ -29,7 +31,7 @@ static inline struct nf_conn_labels *nf_ct_labels_ext_add(struct nf_conn *ct) | |||
| 29 | u8 words; | 31 | u8 words; |
| 30 | 32 | ||
| 31 | words = ACCESS_ONCE(net->ct.label_words); | 33 | words = ACCESS_ONCE(net->ct.label_words); |
| 32 | if (words == 0 || WARN_ON_ONCE(words > 8)) | 34 | if (words == 0) |
| 33 | return NULL; | 35 | return NULL; |
| 34 | 36 | ||
| 35 | cl_ext = nf_ct_ext_add_length(ct, NF_CT_EXT_LABELS, | 37 | cl_ext = nf_ct_ext_add_length(ct, NF_CT_EXT_LABELS, |
diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h index e7e14ffe0f6a..e6bc14d8fa9a 100644 --- a/include/net/netfilter/nf_tables.h +++ b/include/net/netfilter/nf_tables.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/list.h> | 4 | #include <linux/list.h> |
| 5 | #include <linux/netfilter.h> | 5 | #include <linux/netfilter.h> |
| 6 | #include <linux/netfilter/nfnetlink.h> | ||
| 6 | #include <linux/netfilter/x_tables.h> | 7 | #include <linux/netfilter/x_tables.h> |
| 7 | #include <linux/netfilter/nf_tables.h> | 8 | #include <linux/netfilter/nf_tables.h> |
| 8 | #include <net/netlink.h> | 9 | #include <net/netlink.h> |
| @@ -288,7 +289,8 @@ struct nft_expr_ops { | |||
| 288 | int (*init)(const struct nft_ctx *ctx, | 289 | int (*init)(const struct nft_ctx *ctx, |
| 289 | const struct nft_expr *expr, | 290 | const struct nft_expr *expr, |
| 290 | const struct nlattr * const tb[]); | 291 | const struct nlattr * const tb[]); |
| 291 | void (*destroy)(const struct nft_expr *expr); | 292 | void (*destroy)(const struct nft_ctx *ctx, |
| 293 | const struct nft_expr *expr); | ||
| 292 | int (*dump)(struct sk_buff *skb, | 294 | int (*dump)(struct sk_buff *skb, |
| 293 | const struct nft_expr *expr); | 295 | const struct nft_expr *expr); |
| 294 | int (*validate)(const struct nft_ctx *ctx, | 296 | int (*validate)(const struct nft_ctx *ctx, |
| @@ -325,13 +327,15 @@ static inline void *nft_expr_priv(const struct nft_expr *expr) | |||
| 325 | * @handle: rule handle | 327 | * @handle: rule handle |
| 326 | * @genmask: generation mask | 328 | * @genmask: generation mask |
| 327 | * @dlen: length of expression data | 329 | * @dlen: length of expression data |
| 330 | * @ulen: length of user data (used for comments) | ||
| 328 | * @data: expression data | 331 | * @data: expression data |
| 329 | */ | 332 | */ |
| 330 | struct nft_rule { | 333 | struct nft_rule { |
| 331 | struct list_head list; | 334 | struct list_head list; |
| 332 | u64 handle:46, | 335 | u64 handle:42, |
| 333 | genmask:2, | 336 | genmask:2, |
| 334 | dlen:16; | 337 | dlen:12, |
| 338 | ulen:8; | ||
| 335 | unsigned char data[] | 339 | unsigned char data[] |
| 336 | __attribute__((aligned(__alignof__(struct nft_expr)))); | 340 | __attribute__((aligned(__alignof__(struct nft_expr)))); |
| 337 | }; | 341 | }; |
| @@ -340,19 +344,13 @@ struct nft_rule { | |||
| 340 | * struct nft_rule_trans - nf_tables rule update in transaction | 344 | * struct nft_rule_trans - nf_tables rule update in transaction |
| 341 | * | 345 | * |
| 342 | * @list: used internally | 346 | * @list: used internally |
| 347 | * @ctx: rule context | ||
| 343 | * @rule: rule that needs to be updated | 348 | * @rule: rule that needs to be updated |
| 344 | * @chain: chain that this rule belongs to | ||
| 345 | * @table: table for which this chain applies | ||
| 346 | * @nlh: netlink header of the message that contain this update | ||
| 347 | * @family: family expressesed as AF_* | ||
| 348 | */ | 349 | */ |
| 349 | struct nft_rule_trans { | 350 | struct nft_rule_trans { |
| 350 | struct list_head list; | 351 | struct list_head list; |
| 352 | struct nft_ctx ctx; | ||
| 351 | struct nft_rule *rule; | 353 | struct nft_rule *rule; |
| 352 | const struct nft_chain *chain; | ||
| 353 | const struct nft_table *table; | ||
| 354 | const struct nlmsghdr *nlh; | ||
| 355 | u8 family; | ||
| 356 | }; | 354 | }; |
| 357 | 355 | ||
| 358 | static inline struct nft_expr *nft_expr_first(const struct nft_rule *rule) | 356 | static inline struct nft_expr *nft_expr_first(const struct nft_rule *rule) |
| @@ -370,6 +368,11 @@ static inline struct nft_expr *nft_expr_last(const struct nft_rule *rule) | |||
| 370 | return (struct nft_expr *)&rule->data[rule->dlen]; | 368 | return (struct nft_expr *)&rule->data[rule->dlen]; |
| 371 | } | 369 | } |
| 372 | 370 | ||
| 371 | static inline void *nft_userdata(const struct nft_rule *rule) | ||
| 372 | { | ||
| 373 | return (void *)&rule->data[rule->dlen]; | ||
| 374 | } | ||
| 375 | |||
| 373 | /* | 376 | /* |
| 374 | * The last pointer isn't really necessary, but the compiler isn't able to | 377 | * The last pointer isn't really necessary, but the compiler isn't able to |
| 375 | * determine that the result of nft_expr_last() is always the same since it | 378 | * determine that the result of nft_expr_last() is always the same since it |
| @@ -521,6 +524,9 @@ void nft_unregister_chain_type(const struct nf_chain_type *); | |||
| 521 | int nft_register_expr(struct nft_expr_type *); | 524 | int nft_register_expr(struct nft_expr_type *); |
| 522 | void nft_unregister_expr(struct nft_expr_type *); | 525 | void nft_unregister_expr(struct nft_expr_type *); |
| 523 | 526 | ||
| 527 | #define nft_dereference(p) \ | ||
| 528 | nfnl_dereference(p, NFNL_SUBSYS_NFTABLES) | ||
| 529 | |||
| 524 | #define MODULE_ALIAS_NFT_FAMILY(family) \ | 530 | #define MODULE_ALIAS_NFT_FAMILY(family) \ |
| 525 | MODULE_ALIAS("nft-afinfo-" __stringify(family)) | 531 | MODULE_ALIAS("nft-afinfo-" __stringify(family)) |
| 526 | 532 | ||
diff --git a/include/net/netns/conntrack.h b/include/net/netns/conntrack.h index fbcc7fa536dc..773cce308bc6 100644 --- a/include/net/netns/conntrack.h +++ b/include/net/netns/conntrack.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include <linux/list_nulls.h> | 5 | #include <linux/list_nulls.h> |
| 6 | #include <linux/atomic.h> | 6 | #include <linux/atomic.h> |
| 7 | #include <linux/netfilter/nf_conntrack_tcp.h> | 7 | #include <linux/netfilter/nf_conntrack_tcp.h> |
| 8 | #include <linux/seqlock.h> | ||
| 8 | 9 | ||
| 9 | struct ctl_table_header; | 10 | struct ctl_table_header; |
| 10 | struct nf_conntrack_ecache; | 11 | struct nf_conntrack_ecache; |
| @@ -62,6 +63,13 @@ struct nf_ip_net { | |||
| 62 | #endif | 63 | #endif |
| 63 | }; | 64 | }; |
| 64 | 65 | ||
| 66 | struct ct_pcpu { | ||
| 67 | spinlock_t lock; | ||
| 68 | struct hlist_nulls_head unconfirmed; | ||
| 69 | struct hlist_nulls_head dying; | ||
| 70 | struct hlist_nulls_head tmpl; | ||
| 71 | }; | ||
| 72 | |||
| 65 | struct netns_ct { | 73 | struct netns_ct { |
| 66 | atomic_t count; | 74 | atomic_t count; |
| 67 | unsigned int expect_count; | 75 | unsigned int expect_count; |
| @@ -83,12 +91,11 @@ struct netns_ct { | |||
| 83 | int sysctl_checksum; | 91 | int sysctl_checksum; |
| 84 | 92 | ||
| 85 | unsigned int htable_size; | 93 | unsigned int htable_size; |
| 94 | seqcount_t generation; | ||
| 86 | struct kmem_cache *nf_conntrack_cachep; | 95 | struct kmem_cache *nf_conntrack_cachep; |
| 87 | struct hlist_nulls_head *hash; | 96 | struct hlist_nulls_head *hash; |
| 88 | struct hlist_head *expect_hash; | 97 | struct hlist_head *expect_hash; |
| 89 | struct hlist_nulls_head unconfirmed; | 98 | struct ct_pcpu __percpu *pcpu_lists; |
| 90 | struct hlist_nulls_head dying; | ||
| 91 | struct hlist_nulls_head tmpl; | ||
| 92 | struct ip_conntrack_stat __percpu *stat; | 99 | struct ip_conntrack_stat __percpu *stat; |
| 93 | struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb; | 100 | struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb; |
| 94 | struct nf_exp_event_notifier __rcu *nf_expect_event_cb; | 101 | struct nf_exp_event_notifier __rcu *nf_expect_event_cb; |
diff --git a/include/net/netns/ieee802154_6lowpan.h b/include/net/netns/ieee802154_6lowpan.h new file mode 100644 index 000000000000..079030c853d8 --- /dev/null +++ b/include/net/netns/ieee802154_6lowpan.h | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | /* | ||
| 2 | * ieee802154 6lowpan in net namespaces | ||
| 3 | */ | ||
| 4 | |||
| 5 | #include <net/inet_frag.h> | ||
| 6 | |||
| 7 | #ifndef __NETNS_IEEE802154_6LOWPAN_H__ | ||
| 8 | #define __NETNS_IEEE802154_6LOWPAN_H__ | ||
| 9 | |||
| 10 | struct netns_sysctl_lowpan { | ||
| 11 | #ifdef CONFIG_SYSCTL | ||
| 12 | struct ctl_table_header *frags_hdr; | ||
| 13 | #endif | ||
| 14 | }; | ||
| 15 | |||
| 16 | struct netns_ieee802154_lowpan { | ||
| 17 | struct netns_sysctl_lowpan sysctl; | ||
| 18 | struct netns_frags frags; | ||
| 19 | u16 max_dsize; | ||
| 20 | }; | ||
| 21 | |||
| 22 | #endif | ||
diff --git a/include/net/netns/xfrm.h b/include/net/netns/xfrm.h index 1006a265beb3..3492434baf88 100644 --- a/include/net/netns/xfrm.h +++ b/include/net/netns/xfrm.h | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include <linux/workqueue.h> | 6 | #include <linux/workqueue.h> |
| 7 | #include <linux/xfrm.h> | 7 | #include <linux/xfrm.h> |
| 8 | #include <net/dst_ops.h> | 8 | #include <net/dst_ops.h> |
| 9 | #include <net/flowcache.h> | ||
| 9 | 10 | ||
| 10 | struct ctl_table_header; | 11 | struct ctl_table_header; |
| 11 | 12 | ||
| @@ -58,9 +59,17 @@ struct netns_xfrm { | |||
| 58 | struct dst_ops xfrm6_dst_ops; | 59 | struct dst_ops xfrm6_dst_ops; |
| 59 | #endif | 60 | #endif |
| 60 | spinlock_t xfrm_state_lock; | 61 | spinlock_t xfrm_state_lock; |
| 61 | spinlock_t xfrm_policy_sk_bundle_lock; | ||
| 62 | rwlock_t xfrm_policy_lock; | 62 | rwlock_t xfrm_policy_lock; |
| 63 | struct mutex xfrm_cfg_mutex; | 63 | struct mutex xfrm_cfg_mutex; |
| 64 | |||
| 65 | /* flow cache part */ | ||
| 66 | struct flow_cache flow_cache_global; | ||
| 67 | atomic_t flow_cache_genid; | ||
| 68 | struct list_head flow_cache_gc_list; | ||
| 69 | spinlock_t flow_cache_gc_lock; | ||
| 70 | struct work_struct flow_cache_gc_work; | ||
| 71 | struct work_struct flow_cache_flush_work; | ||
| 72 | struct mutex flow_flush_sem; | ||
| 64 | }; | 73 | }; |
| 65 | 74 | ||
| 66 | #endif | 75 | #endif |
diff --git a/include/net/nfc/digital.h b/include/net/nfc/digital.h index 81af21e9bcd4..7655cfe27c34 100644 --- a/include/net/nfc/digital.h +++ b/include/net/nfc/digital.h | |||
| @@ -35,6 +35,7 @@ enum { | |||
| 35 | NFC_DIGITAL_RF_TECH_106A = 0, | 35 | NFC_DIGITAL_RF_TECH_106A = 0, |
| 36 | NFC_DIGITAL_RF_TECH_212F, | 36 | NFC_DIGITAL_RF_TECH_212F, |
| 37 | NFC_DIGITAL_RF_TECH_424F, | 37 | NFC_DIGITAL_RF_TECH_424F, |
| 38 | NFC_DIGITAL_RF_TECH_ISO15693, | ||
| 38 | 39 | ||
| 39 | NFC_DIGITAL_RF_TECH_LAST, | 40 | NFC_DIGITAL_RF_TECH_LAST, |
| 40 | }; | 41 | }; |
| @@ -50,6 +51,7 @@ enum { | |||
| 50 | 51 | ||
| 51 | NFC_DIGITAL_FRAMING_NFCA_T1T, | 52 | NFC_DIGITAL_FRAMING_NFCA_T1T, |
| 52 | NFC_DIGITAL_FRAMING_NFCA_T2T, | 53 | NFC_DIGITAL_FRAMING_NFCA_T2T, |
| 54 | NFC_DIGITAL_FRAMING_NFCA_T4T, | ||
| 53 | NFC_DIGITAL_FRAMING_NFCA_NFC_DEP, | 55 | NFC_DIGITAL_FRAMING_NFCA_NFC_DEP, |
| 54 | 56 | ||
| 55 | NFC_DIGITAL_FRAMING_NFCF, | 57 | NFC_DIGITAL_FRAMING_NFCF, |
| @@ -57,6 +59,9 @@ enum { | |||
| 57 | NFC_DIGITAL_FRAMING_NFCF_NFC_DEP, | 59 | NFC_DIGITAL_FRAMING_NFCF_NFC_DEP, |
| 58 | NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED, | 60 | NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED, |
| 59 | 61 | ||
| 62 | NFC_DIGITAL_FRAMING_ISO15693_INVENTORY, | ||
| 63 | NFC_DIGITAL_FRAMING_ISO15693_T5T, | ||
| 64 | |||
| 60 | NFC_DIGITAL_FRAMING_LAST, | 65 | NFC_DIGITAL_FRAMING_LAST, |
| 61 | }; | 66 | }; |
| 62 | 67 | ||
| @@ -204,6 +209,8 @@ struct nfc_digital_dev { | |||
| 204 | u8 curr_rf_tech; | 209 | u8 curr_rf_tech; |
| 205 | u8 curr_nfc_dep_pni; | 210 | u8 curr_nfc_dep_pni; |
| 206 | 211 | ||
| 212 | u16 target_fsc; | ||
| 213 | |||
| 207 | int (*skb_check_crc)(struct sk_buff *skb); | 214 | int (*skb_check_crc)(struct sk_buff *skb); |
| 208 | void (*skb_add_crc)(struct sk_buff *skb); | 215 | void (*skb_add_crc)(struct sk_buff *skb); |
| 209 | }; | 216 | }; |
diff --git a/include/net/nfc/nfc.h b/include/net/nfc/nfc.h index e80894bca1d0..2e8b40c16274 100644 --- a/include/net/nfc/nfc.h +++ b/include/net/nfc/nfc.h | |||
| @@ -111,6 +111,9 @@ struct nfc_target { | |||
| 111 | u8 sensf_res[NFC_SENSF_RES_MAXSIZE]; | 111 | u8 sensf_res[NFC_SENSF_RES_MAXSIZE]; |
| 112 | u8 hci_reader_gate; | 112 | u8 hci_reader_gate; |
| 113 | u8 logical_idx; | 113 | u8 logical_idx; |
| 114 | u8 is_iso15693; | ||
| 115 | u8 iso15693_dsfid; | ||
| 116 | u8 iso15693_uid[NFC_ISO15693_UID_MAXSIZE]; | ||
| 114 | }; | 117 | }; |
| 115 | 118 | ||
| 116 | /** | 119 | /** |
diff --git a/include/net/nl802154.h b/include/net/nl802154.h index 99d2ba1c7e03..b23548e04098 100644 --- a/include/net/nl802154.h +++ b/include/net/nl802154.h | |||
| @@ -52,7 +52,7 @@ int ieee802154_nl_assoc_indic(struct net_device *dev, | |||
| 52 | * Note: This is in section 7.3.2 of the IEEE 802.15.4 document. | 52 | * Note: This is in section 7.3.2 of the IEEE 802.15.4 document. |
| 53 | */ | 53 | */ |
| 54 | int ieee802154_nl_assoc_confirm(struct net_device *dev, | 54 | int ieee802154_nl_assoc_confirm(struct net_device *dev, |
| 55 | u16 short_addr, u8 status); | 55 | __le16 short_addr, u8 status); |
| 56 | 56 | ||
| 57 | /** | 57 | /** |
| 58 | * ieee802154_nl_disassoc_indic - Notify userland of disassociation. | 58 | * ieee802154_nl_disassoc_indic - Notify userland of disassociation. |
| @@ -111,8 +111,8 @@ int ieee802154_nl_scan_confirm(struct net_device *dev, | |||
| 111 | * Note: This API cannot indicate a beacon frame for a coordinator | 111 | * Note: This API cannot indicate a beacon frame for a coordinator |
| 112 | * operating in long addressing mode. | 112 | * operating in long addressing mode. |
| 113 | */ | 113 | */ |
| 114 | int ieee802154_nl_beacon_indic(struct net_device *dev, u16 panid, | 114 | int ieee802154_nl_beacon_indic(struct net_device *dev, __le16 panid, |
| 115 | u16 coord_addr); | 115 | __le16 coord_addr); |
| 116 | 116 | ||
| 117 | /** | 117 | /** |
| 118 | * ieee802154_nl_start_confirm - Notify userland of completion of start. | 118 | * ieee802154_nl_start_confirm - Notify userland of completion of start. |
diff --git a/include/net/regulatory.h b/include/net/regulatory.h index b07cdc9fa454..75fc1f5a948d 100644 --- a/include/net/regulatory.h +++ b/include/net/regulatory.h | |||
| @@ -155,6 +155,7 @@ struct ieee80211_reg_rule { | |||
| 155 | struct ieee80211_freq_range freq_range; | 155 | struct ieee80211_freq_range freq_range; |
| 156 | struct ieee80211_power_rule power_rule; | 156 | struct ieee80211_power_rule power_rule; |
| 157 | u32 flags; | 157 | u32 flags; |
| 158 | u32 dfs_cac_ms; | ||
| 158 | }; | 159 | }; |
| 159 | 160 | ||
| 160 | struct ieee80211_regdomain { | 161 | struct ieee80211_regdomain { |
| @@ -172,14 +173,18 @@ struct ieee80211_regdomain { | |||
| 172 | #define DBM_TO_MBM(gain) ((gain) * 100) | 173 | #define DBM_TO_MBM(gain) ((gain) * 100) |
| 173 | #define MBM_TO_DBM(gain) ((gain) / 100) | 174 | #define MBM_TO_DBM(gain) ((gain) / 100) |
| 174 | 175 | ||
| 175 | #define REG_RULE(start, end, bw, gain, eirp, reg_flags) \ | 176 | #define REG_RULE_EXT(start, end, bw, gain, eirp, dfs_cac, reg_flags) \ |
| 176 | { \ | 177 | { \ |
| 177 | .freq_range.start_freq_khz = MHZ_TO_KHZ(start), \ | 178 | .freq_range.start_freq_khz = MHZ_TO_KHZ(start), \ |
| 178 | .freq_range.end_freq_khz = MHZ_TO_KHZ(end), \ | 179 | .freq_range.end_freq_khz = MHZ_TO_KHZ(end), \ |
| 179 | .freq_range.max_bandwidth_khz = MHZ_TO_KHZ(bw), \ | 180 | .freq_range.max_bandwidth_khz = MHZ_TO_KHZ(bw), \ |
| 180 | .power_rule.max_antenna_gain = DBI_TO_MBI(gain),\ | 181 | .power_rule.max_antenna_gain = DBI_TO_MBI(gain), \ |
| 181 | .power_rule.max_eirp = DBM_TO_MBM(eirp), \ | 182 | .power_rule.max_eirp = DBM_TO_MBM(eirp), \ |
| 182 | .flags = reg_flags, \ | 183 | .flags = reg_flags, \ |
| 184 | .dfs_cac_ms = dfs_cac, \ | ||
| 183 | } | 185 | } |
| 184 | 186 | ||
| 187 | #define REG_RULE(start, end, bw, gain, eirp, reg_flags) \ | ||
| 188 | REG_RULE_EXT(start, end, bw, gain, eirp, 0, reg_flags) | ||
| 189 | |||
| 185 | #endif | 190 | #endif |
diff --git a/include/net/route.h b/include/net/route.h index 9d1f423d5944..b17cf28f996e 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
| @@ -191,7 +191,6 @@ unsigned int inet_dev_addr_type(struct net *net, const struct net_device *dev, | |||
| 191 | void ip_rt_multicast_event(struct in_device *); | 191 | void ip_rt_multicast_event(struct in_device *); |
| 192 | int ip_rt_ioctl(struct net *, unsigned int cmd, void __user *arg); | 192 | int ip_rt_ioctl(struct net *, unsigned int cmd, void __user *arg); |
| 193 | void ip_rt_get_source(u8 *src, struct sk_buff *skb, struct rtable *rt); | 193 | void ip_rt_get_source(u8 *src, struct sk_buff *skb, struct rtable *rt); |
| 194 | int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb); | ||
| 195 | 194 | ||
| 196 | struct in_ifaddr; | 195 | struct in_ifaddr; |
| 197 | void fib_add_ifaddr(struct in_ifaddr *); | 196 | void fib_add_ifaddr(struct in_ifaddr *); |
diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index 661e45d38051..72240e5ac2c4 100644 --- a/include/net/rtnetlink.h +++ b/include/net/rtnetlink.h | |||
| @@ -140,7 +140,7 @@ struct net_device *rtnl_create_link(struct net *net, char *ifname, | |||
| 140 | struct nlattr *tb[]); | 140 | struct nlattr *tb[]); |
| 141 | int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm); | 141 | int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm); |
| 142 | 142 | ||
| 143 | extern const struct nla_policy ifla_policy[IFLA_MAX+1]; | 143 | int rtnl_nla_parse_ifla(struct nlattr **tb, const struct nlattr *head, int len); |
| 144 | 144 | ||
| 145 | #define MODULE_ALIAS_RTNL_LINK(kind) MODULE_ALIAS("rtnl-link-" kind) | 145 | #define MODULE_ALIAS_RTNL_LINK(kind) MODULE_ALIAS("rtnl-link-" kind) |
| 146 | 146 | ||
diff --git a/include/net/sock.h b/include/net/sock.h index b9586a137cad..06a5668f05c9 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -862,9 +862,9 @@ static inline void sock_rps_save_rxhash(struct sock *sk, | |||
| 862 | const struct sk_buff *skb) | 862 | const struct sk_buff *skb) |
| 863 | { | 863 | { |
| 864 | #ifdef CONFIG_RPS | 864 | #ifdef CONFIG_RPS |
| 865 | if (unlikely(sk->sk_rxhash != skb->rxhash)) { | 865 | if (unlikely(sk->sk_rxhash != skb->hash)) { |
| 866 | sock_rps_reset_flow(sk); | 866 | sock_rps_reset_flow(sk); |
| 867 | sk->sk_rxhash = skb->rxhash; | 867 | sk->sk_rxhash = skb->hash; |
| 868 | } | 868 | } |
| 869 | #endif | 869 | #endif |
| 870 | } | 870 | } |
| @@ -1621,33 +1621,6 @@ void sk_common_release(struct sock *sk); | |||
| 1621 | /* Initialise core socket variables */ | 1621 | /* Initialise core socket variables */ |
| 1622 | void sock_init_data(struct socket *sock, struct sock *sk); | 1622 | void sock_init_data(struct socket *sock, struct sock *sk); |
| 1623 | 1623 | ||
| 1624 | void sk_filter_release_rcu(struct rcu_head *rcu); | ||
| 1625 | |||
| 1626 | /** | ||
| 1627 | * sk_filter_release - release a socket filter | ||
| 1628 | * @fp: filter to remove | ||
| 1629 | * | ||
| 1630 | * Remove a filter from a socket and release its resources. | ||
| 1631 | */ | ||
| 1632 | |||
| 1633 | static inline void sk_filter_release(struct sk_filter *fp) | ||
| 1634 | { | ||
| 1635 | if (atomic_dec_and_test(&fp->refcnt)) | ||
| 1636 | call_rcu(&fp->rcu, sk_filter_release_rcu); | ||
| 1637 | } | ||
| 1638 | |||
| 1639 | static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp) | ||
| 1640 | { | ||
| 1641 | atomic_sub(sk_filter_size(fp->len), &sk->sk_omem_alloc); | ||
| 1642 | sk_filter_release(fp); | ||
| 1643 | } | ||
| 1644 | |||
| 1645 | static inline void sk_filter_charge(struct sock *sk, struct sk_filter *fp) | ||
| 1646 | { | ||
| 1647 | atomic_inc(&fp->refcnt); | ||
| 1648 | atomic_add(sk_filter_size(fp->len), &sk->sk_omem_alloc); | ||
| 1649 | } | ||
| 1650 | |||
| 1651 | /* | 1624 | /* |
| 1652 | * Socket reference counting postulates. | 1625 | * Socket reference counting postulates. |
| 1653 | * | 1626 | * |
| @@ -2256,8 +2229,12 @@ void sock_net_set(struct sock *sk, struct net *net) | |||
| 2256 | */ | 2229 | */ |
| 2257 | static inline void sk_change_net(struct sock *sk, struct net *net) | 2230 | static inline void sk_change_net(struct sock *sk, struct net *net) |
| 2258 | { | 2231 | { |
| 2259 | put_net(sock_net(sk)); | 2232 | struct net *current_net = sock_net(sk); |
| 2260 | sock_net_set(sk, hold_net(net)); | 2233 | |
| 2234 | if (!net_eq(current_net, net)) { | ||
| 2235 | put_net(current_net); | ||
| 2236 | sock_net_set(sk, hold_net(net)); | ||
| 2237 | } | ||
| 2261 | } | 2238 | } |
| 2262 | 2239 | ||
| 2263 | static inline struct sock *skb_steal_sock(struct sk_buff *skb) | 2240 | static inline struct sock *skb_steal_sock(struct sk_buff *skb) |
diff --git a/include/net/tc_act/tc_csum.h b/include/net/tc_act/tc_csum.h index 9e8710be7a04..fa8f5fac65e9 100644 --- a/include/net/tc_act/tc_csum.h +++ b/include/net/tc_act/tc_csum.h | |||
| @@ -9,7 +9,7 @@ struct tcf_csum { | |||
| 9 | 9 | ||
| 10 | u32 update_flags; | 10 | u32 update_flags; |
| 11 | }; | 11 | }; |
| 12 | #define to_tcf_csum(pc) \ | 12 | #define to_tcf_csum(a) \ |
| 13 | container_of(pc,struct tcf_csum,common) | 13 | container_of(a->priv,struct tcf_csum,common) |
| 14 | 14 | ||
| 15 | #endif /* __NET_TC_CSUM_H */ | 15 | #endif /* __NET_TC_CSUM_H */ |
diff --git a/include/net/tc_act/tc_defact.h b/include/net/tc_act/tc_defact.h index 65f024b80958..9763dcbb9bc3 100644 --- a/include/net/tc_act/tc_defact.h +++ b/include/net/tc_act/tc_defact.h | |||
| @@ -8,7 +8,7 @@ struct tcf_defact { | |||
| 8 | u32 tcfd_datalen; | 8 | u32 tcfd_datalen; |
| 9 | void *tcfd_defdata; | 9 | void *tcfd_defdata; |
| 10 | }; | 10 | }; |
| 11 | #define to_defact(pc) \ | 11 | #define to_defact(a) \ |
| 12 | container_of(pc, struct tcf_defact, common) | 12 | container_of(a->priv, struct tcf_defact, common) |
| 13 | 13 | ||
| 14 | #endif /* __NET_TC_DEF_H */ | 14 | #endif /* __NET_TC_DEF_H */ |
diff --git a/include/net/tc_act/tc_gact.h b/include/net/tc_act/tc_gact.h index 9e3f6767b80e..9fc9b578908a 100644 --- a/include/net/tc_act/tc_gact.h +++ b/include/net/tc_act/tc_gact.h | |||
| @@ -11,7 +11,7 @@ struct tcf_gact { | |||
| 11 | int tcfg_paction; | 11 | int tcfg_paction; |
| 12 | #endif | 12 | #endif |
| 13 | }; | 13 | }; |
| 14 | #define to_gact(pc) \ | 14 | #define to_gact(a) \ |
| 15 | container_of(pc, struct tcf_gact, common) | 15 | container_of(a->priv, struct tcf_gact, common) |
| 16 | 16 | ||
| 17 | #endif /* __NET_TC_GACT_H */ | 17 | #endif /* __NET_TC_GACT_H */ |
diff --git a/include/net/tc_act/tc_ipt.h b/include/net/tc_act/tc_ipt.h index f7d25dfcc4b7..c0f4193f432c 100644 --- a/include/net/tc_act/tc_ipt.h +++ b/include/net/tc_act/tc_ipt.h | |||
| @@ -11,7 +11,7 @@ struct tcf_ipt { | |||
| 11 | char *tcfi_tname; | 11 | char *tcfi_tname; |
| 12 | struct xt_entry_target *tcfi_t; | 12 | struct xt_entry_target *tcfi_t; |
| 13 | }; | 13 | }; |
| 14 | #define to_ipt(pc) \ | 14 | #define to_ipt(a) \ |
| 15 | container_of(pc, struct tcf_ipt, common) | 15 | container_of(a->priv, struct tcf_ipt, common) |
| 16 | 16 | ||
| 17 | #endif /* __NET_TC_IPT_H */ | 17 | #endif /* __NET_TC_IPT_H */ |
diff --git a/include/net/tc_act/tc_mirred.h b/include/net/tc_act/tc_mirred.h index cfe2943690ff..4dd77a1c106b 100644 --- a/include/net/tc_act/tc_mirred.h +++ b/include/net/tc_act/tc_mirred.h | |||
| @@ -11,7 +11,7 @@ struct tcf_mirred { | |||
| 11 | struct net_device *tcfm_dev; | 11 | struct net_device *tcfm_dev; |
| 12 | struct list_head tcfm_list; | 12 | struct list_head tcfm_list; |
| 13 | }; | 13 | }; |
| 14 | #define to_mirred(pc) \ | 14 | #define to_mirred(a) \ |
| 15 | container_of(pc, struct tcf_mirred, common) | 15 | container_of(a->priv, struct tcf_mirred, common) |
| 16 | 16 | ||
| 17 | #endif /* __NET_TC_MIR_H */ | 17 | #endif /* __NET_TC_MIR_H */ |
diff --git a/include/net/tc_act/tc_nat.h b/include/net/tc_act/tc_nat.h index 4a691f34d703..63d8e9ca9d99 100644 --- a/include/net/tc_act/tc_nat.h +++ b/include/net/tc_act/tc_nat.h | |||
| @@ -13,9 +13,9 @@ struct tcf_nat { | |||
| 13 | u32 flags; | 13 | u32 flags; |
| 14 | }; | 14 | }; |
| 15 | 15 | ||
| 16 | static inline struct tcf_nat *to_tcf_nat(struct tcf_common *pc) | 16 | static inline struct tcf_nat *to_tcf_nat(struct tc_action *a) |
| 17 | { | 17 | { |
| 18 | return container_of(pc, struct tcf_nat, common); | 18 | return container_of(a->priv, struct tcf_nat, common); |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | #endif /* __NET_TC_NAT_H */ | 21 | #endif /* __NET_TC_NAT_H */ |
diff --git a/include/net/tc_act/tc_pedit.h b/include/net/tc_act/tc_pedit.h index e6f6e15956f5..5b80998879c7 100644 --- a/include/net/tc_act/tc_pedit.h +++ b/include/net/tc_act/tc_pedit.h | |||
| @@ -9,7 +9,7 @@ struct tcf_pedit { | |||
| 9 | unsigned char tcfp_flags; | 9 | unsigned char tcfp_flags; |
| 10 | struct tc_pedit_key *tcfp_keys; | 10 | struct tc_pedit_key *tcfp_keys; |
| 11 | }; | 11 | }; |
| 12 | #define to_pedit(pc) \ | 12 | #define to_pedit(a) \ |
| 13 | container_of(pc, struct tcf_pedit, common) | 13 | container_of(a->priv, struct tcf_pedit, common) |
| 14 | 14 | ||
| 15 | #endif /* __NET_TC_PED_H */ | 15 | #endif /* __NET_TC_PED_H */ |
diff --git a/include/net/tc_act/tc_skbedit.h b/include/net/tc_act/tc_skbedit.h index dd5d86fab030..0df9a0db4a8e 100644 --- a/include/net/tc_act/tc_skbedit.h +++ b/include/net/tc_act/tc_skbedit.h | |||
| @@ -29,7 +29,7 @@ struct tcf_skbedit { | |||
| 29 | u16 queue_mapping; | 29 | u16 queue_mapping; |
| 30 | /* XXX: 16-bit pad here? */ | 30 | /* XXX: 16-bit pad here? */ |
| 31 | }; | 31 | }; |
| 32 | #define to_skbedit(pc) \ | 32 | #define to_skbedit(a) \ |
| 33 | container_of(pc, struct tcf_skbedit, common) | 33 | container_of(a->priv, struct tcf_skbedit, common) |
| 34 | 34 | ||
| 35 | #endif /* __NET_TC_SKBEDIT_H */ | 35 | #endif /* __NET_TC_SKBEDIT_H */ |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 743accec6c76..87d877408188 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <linux/crypto.h> | 31 | #include <linux/crypto.h> |
| 32 | #include <linux/cryptohash.h> | 32 | #include <linux/cryptohash.h> |
| 33 | #include <linux/kref.h> | 33 | #include <linux/kref.h> |
| 34 | #include <linux/ktime.h> | ||
| 34 | 35 | ||
| 35 | #include <net/inet_connection_sock.h> | 36 | #include <net/inet_connection_sock.h> |
| 36 | #include <net/inet_timewait_sock.h> | 37 | #include <net/inet_timewait_sock.h> |
| @@ -478,7 +479,6 @@ int __cookie_v4_check(const struct iphdr *iph, const struct tcphdr *th, | |||
| 478 | struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb, | 479 | struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb, |
| 479 | struct ip_options *opt); | 480 | struct ip_options *opt); |
| 480 | #ifdef CONFIG_SYN_COOKIES | 481 | #ifdef CONFIG_SYN_COOKIES |
| 481 | #include <linux/ktime.h> | ||
| 482 | 482 | ||
| 483 | /* Syncookies use a monotonic timer which increments every 60 seconds. | 483 | /* Syncookies use a monotonic timer which increments every 60 seconds. |
| 484 | * This counter is used both as a hash input and partially encoded into | 484 | * This counter is used both as a hash input and partially encoded into |
| @@ -620,7 +620,7 @@ static inline void tcp_bound_rto(const struct sock *sk) | |||
| 620 | 620 | ||
| 621 | static inline u32 __tcp_set_rto(const struct tcp_sock *tp) | 621 | static inline u32 __tcp_set_rto(const struct tcp_sock *tp) |
| 622 | { | 622 | { |
| 623 | return (tp->srtt >> 3) + tp->rttvar; | 623 | return usecs_to_jiffies((tp->srtt_us >> 3) + tp->rttvar_us); |
| 624 | } | 624 | } |
| 625 | 625 | ||
| 626 | static inline void __tcp_fast_path_on(struct tcp_sock *tp, u32 snd_wnd) | 626 | static inline void __tcp_fast_path_on(struct tcp_sock *tp, u32 snd_wnd) |
| @@ -657,6 +657,11 @@ static inline u32 tcp_rto_min(struct sock *sk) | |||
| 657 | return rto_min; | 657 | return rto_min; |
| 658 | } | 658 | } |
| 659 | 659 | ||
| 660 | static inline u32 tcp_rto_min_us(struct sock *sk) | ||
| 661 | { | ||
| 662 | return jiffies_to_usecs(tcp_rto_min(sk)); | ||
| 663 | } | ||
| 664 | |||
| 660 | /* Compute the actual receive window we are currently advertising. | 665 | /* Compute the actual receive window we are currently advertising. |
| 661 | * Rcv_nxt can be after the window if our peer push more data | 666 | * Rcv_nxt can be after the window if our peer push more data |
| 662 | * than the offered window. | 667 | * than the offered window. |
| @@ -779,7 +784,6 @@ enum tcp_ca_event { | |||
| 779 | #define TCP_CA_BUF_MAX (TCP_CA_NAME_MAX*TCP_CA_MAX) | 784 | #define TCP_CA_BUF_MAX (TCP_CA_NAME_MAX*TCP_CA_MAX) |
| 780 | 785 | ||
| 781 | #define TCP_CONG_NON_RESTRICTED 0x1 | 786 | #define TCP_CONG_NON_RESTRICTED 0x1 |
| 782 | #define TCP_CONG_RTT_STAMP 0x2 | ||
| 783 | 787 | ||
| 784 | struct tcp_congestion_ops { | 788 | struct tcp_congestion_ops { |
| 785 | struct list_head list; | 789 | struct list_head list; |
| @@ -792,8 +796,6 @@ struct tcp_congestion_ops { | |||
| 792 | 796 | ||
| 793 | /* return slow start threshold (required) */ | 797 | /* return slow start threshold (required) */ |
| 794 | u32 (*ssthresh)(struct sock *sk); | 798 | u32 (*ssthresh)(struct sock *sk); |
| 795 | /* lower bound for congestion window (optional) */ | ||
| 796 | u32 (*min_cwnd)(const struct sock *sk); | ||
| 797 | /* do new cwnd calculation (required) */ | 799 | /* do new cwnd calculation (required) */ |
| 798 | void (*cong_avoid)(struct sock *sk, u32 ack, u32 acked, u32 in_flight); | 800 | void (*cong_avoid)(struct sock *sk, u32 ack, u32 acked, u32 in_flight); |
| 799 | /* call before changing ca_state (optional) */ | 801 | /* call before changing ca_state (optional) */ |
| @@ -828,7 +830,6 @@ void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w); | |||
| 828 | extern struct tcp_congestion_ops tcp_init_congestion_ops; | 830 | extern struct tcp_congestion_ops tcp_init_congestion_ops; |
| 829 | u32 tcp_reno_ssthresh(struct sock *sk); | 831 | u32 tcp_reno_ssthresh(struct sock *sk); |
| 830 | void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked, u32 in_flight); | 832 | void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked, u32 in_flight); |
| 831 | u32 tcp_reno_min_cwnd(const struct sock *sk); | ||
| 832 | extern struct tcp_congestion_ops tcp_reno; | 833 | extern struct tcp_congestion_ops tcp_reno; |
| 833 | 834 | ||
| 834 | static inline void tcp_set_ca_state(struct sock *sk, const u8 ca_state) | 835 | static inline void tcp_set_ca_state(struct sock *sk, const u8 ca_state) |
diff --git a/include/net/wpan-phy.h b/include/net/wpan-phy.h index b52bda8d13b1..10ab0fc6d4f7 100644 --- a/include/net/wpan-phy.h +++ b/include/net/wpan-phy.h | |||
| @@ -37,15 +37,22 @@ struct wpan_phy { | |||
| 37 | struct mutex pib_lock; | 37 | struct mutex pib_lock; |
| 38 | 38 | ||
| 39 | /* | 39 | /* |
| 40 | * This is a PIB according to 802.15.4-2006. | 40 | * This is a PIB according to 802.15.4-2011. |
| 41 | * We do not provide timing-related variables, as they | 41 | * We do not provide timing-related variables, as they |
| 42 | * aren't used outside of driver | 42 | * aren't used outside of driver |
| 43 | */ | 43 | */ |
| 44 | u8 current_channel; | 44 | u8 current_channel; |
| 45 | u8 current_page; | 45 | u8 current_page; |
| 46 | u32 channels_supported[32]; | 46 | u32 channels_supported[32]; |
| 47 | u8 transmit_power; | 47 | s8 transmit_power; |
| 48 | u8 cca_mode; | 48 | u8 cca_mode; |
| 49 | u8 min_be; | ||
| 50 | u8 max_be; | ||
| 51 | u8 csma_retries; | ||
| 52 | s8 frame_retries; | ||
| 53 | |||
| 54 | bool lbt; | ||
| 55 | s32 cca_ed_level; | ||
| 49 | 56 | ||
| 50 | struct device dev; | 57 | struct device dev; |
| 51 | int idx; | 58 | int idx; |
| @@ -54,6 +61,14 @@ struct wpan_phy { | |||
| 54 | const char *name, int type); | 61 | const char *name, int type); |
| 55 | void (*del_iface)(struct wpan_phy *phy, struct net_device *dev); | 62 | void (*del_iface)(struct wpan_phy *phy, struct net_device *dev); |
| 56 | 63 | ||
| 64 | int (*set_txpower)(struct wpan_phy *phy, int db); | ||
| 65 | int (*set_lbt)(struct wpan_phy *phy, bool on); | ||
| 66 | int (*set_cca_mode)(struct wpan_phy *phy, u8 cca_mode); | ||
| 67 | int (*set_cca_ed_level)(struct wpan_phy *phy, int level); | ||
| 68 | int (*set_csma_params)(struct wpan_phy *phy, u8 min_be, u8 max_be, | ||
| 69 | u8 retries); | ||
| 70 | int (*set_frame_retries)(struct wpan_phy *phy, s8 retries); | ||
| 71 | |||
| 57 | char priv[0] __attribute__((__aligned__(NETDEV_ALIGN))); | 72 | char priv[0] __attribute__((__aligned__(NETDEV_ALIGN))); |
| 58 | }; | 73 | }; |
| 59 | 74 | ||
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index fb5654a8ca3c..32682ae47b3f 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
| @@ -118,11 +118,10 @@ | |||
| 118 | struct xfrm_state_walk { | 118 | struct xfrm_state_walk { |
| 119 | struct list_head all; | 119 | struct list_head all; |
| 120 | u8 state; | 120 | u8 state; |
| 121 | union { | 121 | u8 dying; |
| 122 | u8 dying; | 122 | u8 proto; |
| 123 | u8 proto; | ||
| 124 | }; | ||
| 125 | u32 seq; | 123 | u32 seq; |
| 124 | struct xfrm_address_filter *filter; | ||
| 126 | }; | 125 | }; |
| 127 | 126 | ||
| 128 | /* Full description of state of transformer. */ | 127 | /* Full description of state of transformer. */ |
| @@ -350,6 +349,16 @@ int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo); | |||
| 350 | struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned int family); | 349 | struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned int family); |
| 351 | void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo); | 350 | void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo); |
| 352 | 351 | ||
| 352 | struct xfrm_input_afinfo { | ||
| 353 | unsigned int family; | ||
| 354 | struct module *owner; | ||
| 355 | int (*callback)(struct sk_buff *skb, u8 protocol, | ||
| 356 | int err); | ||
| 357 | }; | ||
| 358 | |||
| 359 | int xfrm_input_register_afinfo(struct xfrm_input_afinfo *afinfo); | ||
| 360 | int xfrm_input_unregister_afinfo(struct xfrm_input_afinfo *afinfo); | ||
| 361 | |||
| 353 | void xfrm_state_delete_tunnel(struct xfrm_state *x); | 362 | void xfrm_state_delete_tunnel(struct xfrm_state *x); |
| 354 | 363 | ||
| 355 | struct xfrm_type { | 364 | struct xfrm_type { |
| @@ -594,21 +603,33 @@ struct xfrm_mgr { | |||
| 594 | const struct xfrm_migrate *m, | 603 | const struct xfrm_migrate *m, |
| 595 | int num_bundles, | 604 | int num_bundles, |
| 596 | const struct xfrm_kmaddress *k); | 605 | const struct xfrm_kmaddress *k); |
| 606 | bool (*is_alive)(const struct km_event *c); | ||
| 597 | }; | 607 | }; |
| 598 | 608 | ||
| 599 | int xfrm_register_km(struct xfrm_mgr *km); | 609 | int xfrm_register_km(struct xfrm_mgr *km); |
| 600 | int xfrm_unregister_km(struct xfrm_mgr *km); | 610 | int xfrm_unregister_km(struct xfrm_mgr *km); |
| 601 | 611 | ||
| 612 | struct xfrm_tunnel_skb_cb { | ||
| 613 | union { | ||
| 614 | struct inet_skb_parm h4; | ||
| 615 | struct inet6_skb_parm h6; | ||
| 616 | } header; | ||
| 617 | |||
| 618 | union { | ||
| 619 | struct ip_tunnel *ip4; | ||
| 620 | struct ip6_tnl *ip6; | ||
| 621 | } tunnel; | ||
| 622 | }; | ||
| 623 | |||
| 624 | #define XFRM_TUNNEL_SKB_CB(__skb) ((struct xfrm_tunnel_skb_cb *)&((__skb)->cb[0])) | ||
| 625 | |||
| 602 | /* | 626 | /* |
| 603 | * This structure is used for the duration where packets are being | 627 | * This structure is used for the duration where packets are being |
| 604 | * transformed by IPsec. As soon as the packet leaves IPsec the | 628 | * transformed by IPsec. As soon as the packet leaves IPsec the |
| 605 | * area beyond the generic IP part may be overwritten. | 629 | * area beyond the generic IP part may be overwritten. |
| 606 | */ | 630 | */ |
| 607 | struct xfrm_skb_cb { | 631 | struct xfrm_skb_cb { |
| 608 | union { | 632 | struct xfrm_tunnel_skb_cb header; |
| 609 | struct inet_skb_parm h4; | ||
| 610 | struct inet6_skb_parm h6; | ||
| 611 | } header; | ||
| 612 | 633 | ||
| 613 | /* Sequence number for replay protection. */ | 634 | /* Sequence number for replay protection. */ |
| 614 | union { | 635 | union { |
| @@ -630,10 +651,7 @@ struct xfrm_skb_cb { | |||
| 630 | * to transmit header information to the mode input/output functions. | 651 | * to transmit header information to the mode input/output functions. |
| 631 | */ | 652 | */ |
| 632 | struct xfrm_mode_skb_cb { | 653 | struct xfrm_mode_skb_cb { |
| 633 | union { | 654 | struct xfrm_tunnel_skb_cb header; |
| 634 | struct inet_skb_parm h4; | ||
| 635 | struct inet6_skb_parm h6; | ||
| 636 | } header; | ||
| 637 | 655 | ||
| 638 | /* Copied from header for IPv4, always set to zero and DF for IPv6. */ | 656 | /* Copied from header for IPv4, always set to zero and DF for IPv6. */ |
| 639 | __be16 id; | 657 | __be16 id; |
| @@ -665,10 +683,7 @@ struct xfrm_mode_skb_cb { | |||
| 665 | * related information. | 683 | * related information. |
| 666 | */ | 684 | */ |
| 667 | struct xfrm_spi_skb_cb { | 685 | struct xfrm_spi_skb_cb { |
| 668 | union { | 686 | struct xfrm_tunnel_skb_cb header; |
| 669 | struct inet_skb_parm h4; | ||
| 670 | struct inet6_skb_parm h6; | ||
| 671 | } header; | ||
| 672 | 687 | ||
| 673 | unsigned int daddroff; | 688 | unsigned int daddroff; |
| 674 | unsigned int family; | 689 | unsigned int family; |
| @@ -1347,18 +1362,34 @@ struct xfrm_algo_desc { | |||
| 1347 | struct sadb_alg desc; | 1362 | struct sadb_alg desc; |
| 1348 | }; | 1363 | }; |
| 1349 | 1364 | ||
| 1350 | /* XFRM tunnel handlers. */ | 1365 | /* XFRM protocol handlers. */ |
| 1351 | struct xfrm_tunnel { | 1366 | struct xfrm4_protocol { |
| 1352 | int (*handler)(struct sk_buff *skb); | 1367 | int (*handler)(struct sk_buff *skb); |
| 1368 | int (*input_handler)(struct sk_buff *skb, int nexthdr, __be32 spi, | ||
| 1369 | int encap_type); | ||
| 1370 | int (*cb_handler)(struct sk_buff *skb, int err); | ||
| 1353 | int (*err_handler)(struct sk_buff *skb, u32 info); | 1371 | int (*err_handler)(struct sk_buff *skb, u32 info); |
| 1354 | 1372 | ||
| 1355 | struct xfrm_tunnel __rcu *next; | 1373 | struct xfrm4_protocol __rcu *next; |
| 1374 | int priority; | ||
| 1375 | }; | ||
| 1376 | |||
| 1377 | struct xfrm6_protocol { | ||
| 1378 | int (*handler)(struct sk_buff *skb); | ||
| 1379 | int (*cb_handler)(struct sk_buff *skb, int err); | ||
| 1380 | int (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt, | ||
| 1381 | u8 type, u8 code, int offset, __be32 info); | ||
| 1382 | |||
| 1383 | struct xfrm6_protocol __rcu *next; | ||
| 1356 | int priority; | 1384 | int priority; |
| 1357 | }; | 1385 | }; |
| 1358 | 1386 | ||
| 1359 | struct xfrm_tunnel_notifier { | 1387 | /* XFRM tunnel handlers. */ |
| 1388 | struct xfrm_tunnel { | ||
| 1360 | int (*handler)(struct sk_buff *skb); | 1389 | int (*handler)(struct sk_buff *skb); |
| 1361 | struct xfrm_tunnel_notifier __rcu *next; | 1390 | int (*err_handler)(struct sk_buff *skb, u32 info); |
| 1391 | |||
| 1392 | struct xfrm_tunnel __rcu *next; | ||
| 1362 | int priority; | 1393 | int priority; |
| 1363 | }; | 1394 | }; |
| 1364 | 1395 | ||
| @@ -1375,11 +1406,14 @@ void xfrm4_init(void); | |||
| 1375 | int xfrm_state_init(struct net *net); | 1406 | int xfrm_state_init(struct net *net); |
| 1376 | void xfrm_state_fini(struct net *net); | 1407 | void xfrm_state_fini(struct net *net); |
| 1377 | void xfrm4_state_init(void); | 1408 | void xfrm4_state_init(void); |
| 1409 | void xfrm4_protocol_init(void); | ||
| 1378 | #ifdef CONFIG_XFRM | 1410 | #ifdef CONFIG_XFRM |
| 1379 | int xfrm6_init(void); | 1411 | int xfrm6_init(void); |
| 1380 | void xfrm6_fini(void); | 1412 | void xfrm6_fini(void); |
| 1381 | int xfrm6_state_init(void); | 1413 | int xfrm6_state_init(void); |
| 1382 | void xfrm6_state_fini(void); | 1414 | void xfrm6_state_fini(void); |
| 1415 | int xfrm6_protocol_init(void); | ||
| 1416 | void xfrm6_protocol_fini(void); | ||
| 1383 | #else | 1417 | #else |
| 1384 | static inline int xfrm6_init(void) | 1418 | static inline int xfrm6_init(void) |
| 1385 | { | 1419 | { |
| @@ -1405,7 +1439,8 @@ static inline void xfrm_sysctl_fini(struct net *net) | |||
| 1405 | } | 1439 | } |
| 1406 | #endif | 1440 | #endif |
| 1407 | 1441 | ||
| 1408 | void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto); | 1442 | void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto, |
| 1443 | struct xfrm_address_filter *filter); | ||
| 1409 | int xfrm_state_walk(struct net *net, struct xfrm_state_walk *walk, | 1444 | int xfrm_state_walk(struct net *net, struct xfrm_state_walk *walk, |
| 1410 | int (*func)(struct xfrm_state *, int, void*), void *); | 1445 | int (*func)(struct xfrm_state *, int, void*), void *); |
| 1411 | void xfrm_state_walk_done(struct xfrm_state_walk *walk, struct net *net); | 1446 | void xfrm_state_walk_done(struct xfrm_state_walk *walk, struct net *net); |
| @@ -1497,20 +1532,22 @@ int xfrm4_rcv(struct sk_buff *skb); | |||
| 1497 | 1532 | ||
| 1498 | static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi) | 1533 | static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi) |
| 1499 | { | 1534 | { |
| 1500 | return xfrm4_rcv_encap(skb, nexthdr, spi, 0); | 1535 | XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4 = NULL; |
| 1536 | XFRM_SPI_SKB_CB(skb)->family = AF_INET; | ||
| 1537 | XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct iphdr, daddr); | ||
| 1538 | return xfrm_input(skb, nexthdr, spi, 0); | ||
| 1501 | } | 1539 | } |
| 1502 | 1540 | ||
| 1503 | int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb); | 1541 | int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb); |
| 1504 | int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb); | 1542 | int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb); |
| 1505 | int xfrm4_output(struct sk_buff *skb); | 1543 | int xfrm4_output(struct sk_buff *skb); |
| 1506 | int xfrm4_output_finish(struct sk_buff *skb); | 1544 | int xfrm4_output_finish(struct sk_buff *skb); |
| 1545 | int xfrm4_rcv_cb(struct sk_buff *skb, u8 protocol, int err); | ||
| 1546 | int xfrm4_protocol_register(struct xfrm4_protocol *handler, unsigned char protocol); | ||
| 1547 | int xfrm4_protocol_deregister(struct xfrm4_protocol *handler, unsigned char protocol); | ||
| 1507 | int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family); | 1548 | int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family); |
| 1508 | int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family); | 1549 | int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family); |
| 1509 | void xfrm4_local_error(struct sk_buff *skb, u32 mtu); | 1550 | void xfrm4_local_error(struct sk_buff *skb, u32 mtu); |
| 1510 | int xfrm4_mode_tunnel_input_register(struct xfrm_tunnel_notifier *handler); | ||
| 1511 | int xfrm4_mode_tunnel_input_deregister(struct xfrm_tunnel_notifier *handler); | ||
| 1512 | int xfrm6_mode_tunnel_input_register(struct xfrm_tunnel_notifier *handler); | ||
| 1513 | int xfrm6_mode_tunnel_input_deregister(struct xfrm_tunnel_notifier *handler); | ||
| 1514 | int xfrm6_extract_header(struct sk_buff *skb); | 1551 | int xfrm6_extract_header(struct sk_buff *skb); |
| 1515 | int xfrm6_extract_input(struct xfrm_state *x, struct sk_buff *skb); | 1552 | int xfrm6_extract_input(struct xfrm_state *x, struct sk_buff *skb); |
| 1516 | int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi); | 1553 | int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi); |
| @@ -1519,6 +1556,9 @@ int xfrm6_rcv(struct sk_buff *skb); | |||
| 1519 | int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, | 1556 | int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, |
| 1520 | xfrm_address_t *saddr, u8 proto); | 1557 | xfrm_address_t *saddr, u8 proto); |
| 1521 | void xfrm6_local_error(struct sk_buff *skb, u32 mtu); | 1558 | void xfrm6_local_error(struct sk_buff *skb, u32 mtu); |
| 1559 | int xfrm6_rcv_cb(struct sk_buff *skb, u8 protocol, int err); | ||
| 1560 | int xfrm6_protocol_register(struct xfrm6_protocol *handler, unsigned char protocol); | ||
| 1561 | int xfrm6_protocol_deregister(struct xfrm6_protocol *handler, unsigned char protocol); | ||
| 1522 | int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family); | 1562 | int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family); |
| 1523 | int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family); | 1563 | int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family); |
| 1524 | __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr); | 1564 | __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr); |
| @@ -1646,6 +1686,20 @@ static inline int xfrm_aevent_is_on(struct net *net) | |||
| 1646 | rcu_read_unlock(); | 1686 | rcu_read_unlock(); |
| 1647 | return ret; | 1687 | return ret; |
| 1648 | } | 1688 | } |
| 1689 | |||
| 1690 | static inline int xfrm_acquire_is_on(struct net *net) | ||
| 1691 | { | ||
| 1692 | struct sock *nlsk; | ||
| 1693 | int ret = 0; | ||
| 1694 | |||
| 1695 | rcu_read_lock(); | ||
| 1696 | nlsk = rcu_dereference(net->xfrm.nlsk); | ||
| 1697 | if (nlsk) | ||
| 1698 | ret = netlink_has_listeners(nlsk, XFRMNLGRP_ACQUIRE); | ||
| 1699 | rcu_read_unlock(); | ||
| 1700 | |||
| 1701 | return ret; | ||
| 1702 | } | ||
| 1649 | #endif | 1703 | #endif |
| 1650 | 1704 | ||
| 1651 | static inline int aead_len(struct xfrm_algo_aead *alg) | 1705 | static inline int aead_len(struct xfrm_algo_aead *alg) |
| @@ -1748,4 +1802,24 @@ static inline int xfrm_mark_put(struct sk_buff *skb, const struct xfrm_mark *m) | |||
| 1748 | return ret; | 1802 | return ret; |
| 1749 | } | 1803 | } |
| 1750 | 1804 | ||
| 1805 | static inline int xfrm_tunnel_check(struct sk_buff *skb, struct xfrm_state *x, | ||
| 1806 | unsigned int family) | ||
| 1807 | { | ||
| 1808 | bool tunnel = false; | ||
| 1809 | |||
| 1810 | switch(family) { | ||
| 1811 | case AF_INET: | ||
| 1812 | if (XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4) | ||
| 1813 | tunnel = true; | ||
| 1814 | break; | ||
| 1815 | case AF_INET6: | ||
| 1816 | if (XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6) | ||
| 1817 | tunnel = true; | ||
| 1818 | break; | ||
| 1819 | } | ||
| 1820 | if (tunnel && !(x->outer_mode->flags & XFRM_MODE_FLAG_TUNNEL)) | ||
| 1821 | return -EINVAL; | ||
| 1822 | |||
| 1823 | return 0; | ||
| 1824 | } | ||
| 1751 | #endif /* _NET_XFRM_H */ | 1825 | #endif /* _NET_XFRM_H */ |
