diff options
Diffstat (limited to 'include')
109 files changed, 2259 insertions, 665 deletions
diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h index 6d26b40cbf5d..9916d0e4eff5 100644 --- a/include/clocksource/arm_arch_timer.h +++ b/include/clocksource/arm_arch_timer.h | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | #ifndef __CLKSOURCE_ARM_ARCH_TIMER_H | 16 | #ifndef __CLKSOURCE_ARM_ARCH_TIMER_H |
| 17 | #define __CLKSOURCE_ARM_ARCH_TIMER_H | 17 | #define __CLKSOURCE_ARM_ARCH_TIMER_H |
| 18 | 18 | ||
| 19 | #include <linux/clocksource.h> | 19 | #include <linux/timecounter.h> |
| 20 | #include <linux/types.h> | 20 | #include <linux/types.h> |
| 21 | 21 | ||
| 22 | #define ARCH_TIMER_CTRL_ENABLE (1 << 0) | 22 | #define ARCH_TIMER_CTRL_ENABLE (1 << 0) |
diff --git a/include/crypto/if_alg.h b/include/crypto/if_alg.h index cd62bf4289e9..88ea64e9a91c 100644 --- a/include/crypto/if_alg.h +++ b/include/crypto/if_alg.h | |||
| @@ -67,8 +67,7 @@ int af_alg_unregister_type(const struct af_alg_type *type); | |||
| 67 | int af_alg_release(struct socket *sock); | 67 | int af_alg_release(struct socket *sock); |
| 68 | int af_alg_accept(struct sock *sk, struct socket *newsock); | 68 | int af_alg_accept(struct sock *sk, struct socket *newsock); |
| 69 | 69 | ||
| 70 | int af_alg_make_sg(struct af_alg_sgl *sgl, void __user *addr, int len, | 70 | int af_alg_make_sg(struct af_alg_sgl *sgl, struct iov_iter *iter, int len); |
| 71 | int write); | ||
| 72 | void af_alg_free_sg(struct af_alg_sgl *sgl); | 71 | void af_alg_free_sg(struct af_alg_sgl *sgl); |
| 73 | 72 | ||
| 74 | int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con); | 73 | int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con); |
diff --git a/include/dt-bindings/clock/rk3288-cru.h b/include/dt-bindings/clock/rk3288-cru.h index f60ce72a2b2c..1c34c24efe08 100644 --- a/include/dt-bindings/clock/rk3288-cru.h +++ b/include/dt-bindings/clock/rk3288-cru.h | |||
| @@ -81,6 +81,9 @@ | |||
| 81 | #define SCLK_SDIO1_SAMPLE 120 | 81 | #define SCLK_SDIO1_SAMPLE 120 |
| 82 | #define SCLK_EMMC_SAMPLE 121 | 82 | #define SCLK_EMMC_SAMPLE 121 |
| 83 | 83 | ||
| 84 | #define SCLK_MAC 151 | ||
| 85 | #define SCLK_MACREF_OUT 152 | ||
| 86 | |||
| 84 | #define DCLK_VOP0 190 | 87 | #define DCLK_VOP0 190 |
| 85 | #define DCLK_VOP1 191 | 88 | #define DCLK_VOP1 191 |
| 86 | 89 | ||
diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h index eb1c6a47b67f..994739da827f 100644 --- a/include/linux/bcma/bcma.h +++ b/include/linux/bcma/bcma.h | |||
| @@ -318,6 +318,7 @@ struct bcma_bus { | |||
| 318 | const struct bcma_host_ops *ops; | 318 | const struct bcma_host_ops *ops; |
| 319 | 319 | ||
| 320 | enum bcma_hosttype hosttype; | 320 | enum bcma_hosttype hosttype; |
| 321 | bool host_is_pcie2; /* Used for BCMA_HOSTTYPE_PCI only */ | ||
| 321 | union { | 322 | union { |
| 322 | /* Pointer to the PCI bus (only for BCMA_HOSTTYPE_PCI) */ | 323 | /* Pointer to the PCI bus (only for BCMA_HOSTTYPE_PCI) */ |
| 323 | struct pci_dev *host_pci; | 324 | struct pci_dev *host_pci; |
diff --git a/include/linux/bcma/bcma_driver_pci.h b/include/linux/bcma/bcma_driver_pci.h index 0333e605ea0d..3f809ae372c4 100644 --- a/include/linux/bcma/bcma_driver_pci.h +++ b/include/linux/bcma/bcma_driver_pci.h | |||
| @@ -223,6 +223,7 @@ struct bcma_drv_pci_host { | |||
| 223 | 223 | ||
| 224 | struct bcma_drv_pci { | 224 | struct bcma_drv_pci { |
| 225 | struct bcma_device *core; | 225 | struct bcma_device *core; |
| 226 | u8 early_setup_done:1; | ||
| 226 | u8 setup_done:1; | 227 | u8 setup_done:1; |
| 227 | u8 hostmode:1; | 228 | u8 hostmode:1; |
| 228 | 229 | ||
| @@ -237,6 +238,7 @@ struct bcma_drv_pci { | |||
| 237 | #define pcicore_write16(pc, offset, val) bcma_write16((pc)->core, offset, val) | 238 | #define pcicore_write16(pc, offset, val) bcma_write16((pc)->core, offset, val) |
| 238 | #define pcicore_write32(pc, offset, val) bcma_write32((pc)->core, offset, val) | 239 | #define pcicore_write32(pc, offset, val) bcma_write32((pc)->core, offset, val) |
| 239 | 240 | ||
| 241 | extern void bcma_core_pci_early_init(struct bcma_drv_pci *pc); | ||
| 240 | extern void bcma_core_pci_init(struct bcma_drv_pci *pc); | 242 | extern void bcma_core_pci_init(struct bcma_drv_pci *pc); |
| 241 | extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, | 243 | extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, |
| 242 | struct bcma_device *core, bool enable); | 244 | struct bcma_device *core, bool enable); |
diff --git a/include/linux/bcma/bcma_regs.h b/include/linux/bcma/bcma_regs.h index e64ae7bf80a1..ebd5c1fcdea4 100644 --- a/include/linux/bcma/bcma_regs.h +++ b/include/linux/bcma/bcma_regs.h | |||
| @@ -64,6 +64,8 @@ | |||
| 64 | #define BCMA_PCI_GPIO_XTAL 0x40 /* PCI config space GPIO 14 for Xtal powerup */ | 64 | #define BCMA_PCI_GPIO_XTAL 0x40 /* PCI config space GPIO 14 for Xtal powerup */ |
| 65 | #define BCMA_PCI_GPIO_PLL 0x80 /* PCI config space GPIO 15 for PLL powerdown */ | 65 | #define BCMA_PCI_GPIO_PLL 0x80 /* PCI config space GPIO 15 for PLL powerdown */ |
| 66 | 66 | ||
| 67 | #define BCMA_PCIE2_BAR0_WIN2 0x70 | ||
| 68 | |||
| 67 | /* SiliconBackplane Address Map. | 69 | /* SiliconBackplane Address Map. |
| 68 | * All regions may not exist on all chips. | 70 | * All regions may not exist on all chips. |
| 69 | */ | 71 | */ |
diff --git a/include/linux/bcma/bcma_soc.h b/include/linux/bcma/bcma_soc.h index f24d245f8394..1b5fc0c3b1b5 100644 --- a/include/linux/bcma/bcma_soc.h +++ b/include/linux/bcma/bcma_soc.h | |||
| @@ -5,8 +5,6 @@ | |||
| 5 | 5 | ||
| 6 | struct bcma_soc { | 6 | struct bcma_soc { |
| 7 | struct bcma_bus bus; | 7 | struct bcma_bus bus; |
| 8 | struct bcma_device core_cc; | ||
| 9 | struct bcma_device core_mips; | ||
| 10 | }; | 8 | }; |
| 11 | 9 | ||
| 12 | int __init bcma_host_soc_register(struct bcma_soc *soc); | 10 | int __init bcma_host_soc_register(struct bcma_soc *soc); |
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index abcafaa20b86..9c78d15d33e4 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h | |||
| @@ -18,8 +18,6 @@ | |||
| 18 | #include <asm/div64.h> | 18 | #include <asm/div64.h> |
| 19 | #include <asm/io.h> | 19 | #include <asm/io.h> |
| 20 | 20 | ||
| 21 | /* clocksource cycle base type */ | ||
| 22 | typedef u64 cycle_t; | ||
| 23 | struct clocksource; | 21 | struct clocksource; |
| 24 | struct module; | 22 | struct module; |
| 25 | 23 | ||
| @@ -28,106 +26,6 @@ struct module; | |||
| 28 | #endif | 26 | #endif |
| 29 | 27 | ||
| 30 | /** | 28 | /** |
| 31 | * struct cyclecounter - hardware abstraction for a free running counter | ||
| 32 | * Provides completely state-free accessors to the underlying hardware. | ||
| 33 | * Depending on which hardware it reads, the cycle counter may wrap | ||
| 34 | * around quickly. Locking rules (if necessary) have to be defined | ||
| 35 | * by the implementor and user of specific instances of this API. | ||
| 36 | * | ||
| 37 | * @read: returns the current cycle value | ||
| 38 | * @mask: bitmask for two's complement | ||
| 39 | * subtraction of non 64 bit counters, | ||
| 40 | * see CLOCKSOURCE_MASK() helper macro | ||
| 41 | * @mult: cycle to nanosecond multiplier | ||
| 42 | * @shift: cycle to nanosecond divisor (power of two) | ||
| 43 | */ | ||
| 44 | struct cyclecounter { | ||
| 45 | cycle_t (*read)(const struct cyclecounter *cc); | ||
| 46 | cycle_t mask; | ||
| 47 | u32 mult; | ||
| 48 | u32 shift; | ||
| 49 | }; | ||
| 50 | |||
| 51 | /** | ||
| 52 | * struct timecounter - layer above a %struct cyclecounter which counts nanoseconds | ||
| 53 | * Contains the state needed by timecounter_read() to detect | ||
| 54 | * cycle counter wrap around. Initialize with | ||
| 55 | * timecounter_init(). Also used to convert cycle counts into the | ||
| 56 | * corresponding nanosecond counts with timecounter_cyc2time(). Users | ||
| 57 | * of this code are responsible for initializing the underlying | ||
| 58 | * cycle counter hardware, locking issues and reading the time | ||
| 59 | * more often than the cycle counter wraps around. The nanosecond | ||
| 60 | * counter will only wrap around after ~585 years. | ||
| 61 | * | ||
| 62 | * @cc: the cycle counter used by this instance | ||
| 63 | * @cycle_last: most recent cycle counter value seen by | ||
| 64 | * timecounter_read() | ||
| 65 | * @nsec: continuously increasing count | ||
| 66 | */ | ||
| 67 | struct timecounter { | ||
| 68 | const struct cyclecounter *cc; | ||
| 69 | cycle_t cycle_last; | ||
| 70 | u64 nsec; | ||
| 71 | }; | ||
| 72 | |||
| 73 | /** | ||
| 74 | * cyclecounter_cyc2ns - converts cycle counter cycles to nanoseconds | ||
| 75 | * @cc: Pointer to cycle counter. | ||
| 76 | * @cycles: Cycles | ||
| 77 | * | ||
| 78 | * XXX - This could use some mult_lxl_ll() asm optimization. Same code | ||
| 79 | * as in cyc2ns, but with unsigned result. | ||
| 80 | */ | ||
| 81 | static inline u64 cyclecounter_cyc2ns(const struct cyclecounter *cc, | ||
| 82 | cycle_t cycles) | ||
| 83 | { | ||
| 84 | u64 ret = (u64)cycles; | ||
| 85 | ret = (ret * cc->mult) >> cc->shift; | ||
| 86 | return ret; | ||
| 87 | } | ||
| 88 | |||
| 89 | /** | ||
| 90 | * timecounter_init - initialize a time counter | ||
| 91 | * @tc: Pointer to time counter which is to be initialized/reset | ||
| 92 | * @cc: A cycle counter, ready to be used. | ||
| 93 | * @start_tstamp: Arbitrary initial time stamp. | ||
| 94 | * | ||
| 95 | * After this call the current cycle register (roughly) corresponds to | ||
| 96 | * the initial time stamp. Every call to timecounter_read() increments | ||
| 97 | * the time stamp counter by the number of elapsed nanoseconds. | ||
| 98 | */ | ||
| 99 | extern void timecounter_init(struct timecounter *tc, | ||
| 100 | const struct cyclecounter *cc, | ||
| 101 | u64 start_tstamp); | ||
| 102 | |||
| 103 | /** | ||
| 104 | * timecounter_read - return nanoseconds elapsed since timecounter_init() | ||
| 105 | * plus the initial time stamp | ||
| 106 | * @tc: Pointer to time counter. | ||
| 107 | * | ||
| 108 | * In other words, keeps track of time since the same epoch as | ||
| 109 | * the function which generated the initial time stamp. | ||
| 110 | */ | ||
| 111 | extern u64 timecounter_read(struct timecounter *tc); | ||
| 112 | |||
| 113 | /** | ||
| 114 | * timecounter_cyc2time - convert a cycle counter to same | ||
| 115 | * time base as values returned by | ||
| 116 | * timecounter_read() | ||
| 117 | * @tc: Pointer to time counter. | ||
| 118 | * @cycle_tstamp: a value returned by tc->cc->read() | ||
| 119 | * | ||
| 120 | * Cycle counts that are converted correctly as long as they | ||
| 121 | * fall into the interval [-1/2 max cycle count, +1/2 max cycle count], | ||
| 122 | * with "max cycle count" == cs->mask+1. | ||
| 123 | * | ||
| 124 | * This allows conversion of cycle counter values which were generated | ||
| 125 | * in the past. | ||
| 126 | */ | ||
| 127 | extern u64 timecounter_cyc2time(struct timecounter *tc, | ||
| 128 | cycle_t cycle_tstamp); | ||
| 129 | |||
| 130 | /** | ||
| 131 | * struct clocksource - hardware abstraction for a free running counter | 29 | * struct clocksource - hardware abstraction for a free running counter |
| 132 | * Provides mostly state-free accessors to the underlying hardware. | 30 | * Provides mostly state-free accessors to the underlying hardware. |
| 133 | * This is the structure used for system time. | 31 | * This is the structure used for system time. |
diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h index 41c891d05f04..1d869d185a0d 100644 --- a/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h | |||
| @@ -52,6 +52,10 @@ struct net_device *alloc_etherdev_mqs(int sizeof_priv, unsigned int txqs, | |||
| 52 | #define alloc_etherdev(sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1) | 52 | #define alloc_etherdev(sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1) |
| 53 | #define alloc_etherdev_mq(sizeof_priv, count) alloc_etherdev_mqs(sizeof_priv, count, count) | 53 | #define alloc_etherdev_mq(sizeof_priv, count) alloc_etherdev_mqs(sizeof_priv, count, count) |
| 54 | 54 | ||
| 55 | struct sk_buff **eth_gro_receive(struct sk_buff **head, | ||
| 56 | struct sk_buff *skb); | ||
| 57 | int eth_gro_complete(struct sk_buff *skb, int nhoff); | ||
| 58 | |||
| 55 | /* Reserved Ethernet Addresses per IEEE 802.1Q */ | 59 | /* Reserved Ethernet Addresses per IEEE 802.1Q */ |
| 56 | static const u8 eth_reserved_addr_base[ETH_ALEN] __aligned(2) = | 60 | static const u8 eth_reserved_addr_base[ETH_ALEN] __aligned(2) = |
| 57 | { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 }; | 61 | { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 }; |
diff --git a/include/linux/fec.h b/include/linux/fec.h index bcff455d1d53..1454a503622d 100644 --- a/include/linux/fec.h +++ b/include/linux/fec.h | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | struct fec_platform_data { | 19 | struct fec_platform_data { |
| 20 | phy_interface_t phy; | 20 | phy_interface_t phy; |
| 21 | unsigned char mac[ETH_ALEN]; | 21 | unsigned char mac[ETH_ALEN]; |
| 22 | void (*sleep_mode_enable)(int enabled); | ||
| 22 | }; | 23 | }; |
| 23 | 24 | ||
| 24 | #endif | 25 | #endif |
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 4f4eea8a6288..b9c7897dc566 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
| @@ -1017,6 +1017,15 @@ struct ieee80211_mmie { | |||
| 1017 | u8 mic[8]; | 1017 | u8 mic[8]; |
| 1018 | } __packed; | 1018 | } __packed; |
| 1019 | 1019 | ||
| 1020 | /* Management MIC information element (IEEE 802.11w) for GMAC and CMAC-256 */ | ||
| 1021 | struct ieee80211_mmie_16 { | ||
| 1022 | u8 element_id; | ||
| 1023 | u8 length; | ||
| 1024 | __le16 key_id; | ||
| 1025 | u8 sequence_number[6]; | ||
| 1026 | u8 mic[16]; | ||
| 1027 | } __packed; | ||
| 1028 | |||
| 1020 | struct ieee80211_vendor_ie { | 1029 | struct ieee80211_vendor_ie { |
| 1021 | u8 element_id; | 1030 | u8 element_id; |
| 1022 | u8 len; | 1031 | u8 len; |
| @@ -1994,9 +2003,15 @@ enum ieee80211_key_len { | |||
| 1994 | WLAN_KEY_LEN_WEP40 = 5, | 2003 | WLAN_KEY_LEN_WEP40 = 5, |
| 1995 | WLAN_KEY_LEN_WEP104 = 13, | 2004 | WLAN_KEY_LEN_WEP104 = 13, |
| 1996 | WLAN_KEY_LEN_CCMP = 16, | 2005 | WLAN_KEY_LEN_CCMP = 16, |
| 2006 | WLAN_KEY_LEN_CCMP_256 = 32, | ||
| 1997 | WLAN_KEY_LEN_TKIP = 32, | 2007 | WLAN_KEY_LEN_TKIP = 32, |
| 1998 | WLAN_KEY_LEN_AES_CMAC = 16, | 2008 | WLAN_KEY_LEN_AES_CMAC = 16, |
| 1999 | WLAN_KEY_LEN_SMS4 = 32, | 2009 | WLAN_KEY_LEN_SMS4 = 32, |
| 2010 | WLAN_KEY_LEN_GCMP = 16, | ||
| 2011 | WLAN_KEY_LEN_GCMP_256 = 32, | ||
| 2012 | WLAN_KEY_LEN_BIP_CMAC_256 = 32, | ||
| 2013 | WLAN_KEY_LEN_BIP_GMAC_128 = 16, | ||
| 2014 | WLAN_KEY_LEN_BIP_GMAC_256 = 32, | ||
| 2000 | }; | 2015 | }; |
| 2001 | 2016 | ||
| 2002 | #define IEEE80211_WEP_IV_LEN 4 | 2017 | #define IEEE80211_WEP_IV_LEN 4 |
| @@ -2004,9 +2019,16 @@ enum ieee80211_key_len { | |||
| 2004 | #define IEEE80211_CCMP_HDR_LEN 8 | 2019 | #define IEEE80211_CCMP_HDR_LEN 8 |
| 2005 | #define IEEE80211_CCMP_MIC_LEN 8 | 2020 | #define IEEE80211_CCMP_MIC_LEN 8 |
| 2006 | #define IEEE80211_CCMP_PN_LEN 6 | 2021 | #define IEEE80211_CCMP_PN_LEN 6 |
| 2022 | #define IEEE80211_CCMP_256_HDR_LEN 8 | ||
| 2023 | #define IEEE80211_CCMP_256_MIC_LEN 16 | ||
| 2024 | #define IEEE80211_CCMP_256_PN_LEN 6 | ||
| 2007 | #define IEEE80211_TKIP_IV_LEN 8 | 2025 | #define IEEE80211_TKIP_IV_LEN 8 |
| 2008 | #define IEEE80211_TKIP_ICV_LEN 4 | 2026 | #define IEEE80211_TKIP_ICV_LEN 4 |
| 2009 | #define IEEE80211_CMAC_PN_LEN 6 | 2027 | #define IEEE80211_CMAC_PN_LEN 6 |
| 2028 | #define IEEE80211_GMAC_PN_LEN 6 | ||
| 2029 | #define IEEE80211_GCMP_HDR_LEN 8 | ||
| 2030 | #define IEEE80211_GCMP_MIC_LEN 16 | ||
| 2031 | #define IEEE80211_GCMP_PN_LEN 6 | ||
| 2010 | 2032 | ||
| 2011 | /* Public action codes */ | 2033 | /* Public action codes */ |
| 2012 | enum ieee80211_pub_actioncode { | 2034 | enum ieee80211_pub_actioncode { |
| @@ -2230,6 +2252,11 @@ enum ieee80211_sa_query_action { | |||
| 2230 | #define WLAN_CIPHER_SUITE_WEP104 0x000FAC05 | 2252 | #define WLAN_CIPHER_SUITE_WEP104 0x000FAC05 |
| 2231 | #define WLAN_CIPHER_SUITE_AES_CMAC 0x000FAC06 | 2253 | #define WLAN_CIPHER_SUITE_AES_CMAC 0x000FAC06 |
| 2232 | #define WLAN_CIPHER_SUITE_GCMP 0x000FAC08 | 2254 | #define WLAN_CIPHER_SUITE_GCMP 0x000FAC08 |
| 2255 | #define WLAN_CIPHER_SUITE_GCMP_256 0x000FAC09 | ||
| 2256 | #define WLAN_CIPHER_SUITE_CCMP_256 0x000FAC0A | ||
| 2257 | #define WLAN_CIPHER_SUITE_BIP_GMAC_128 0x000FAC0B | ||
| 2258 | #define WLAN_CIPHER_SUITE_BIP_GMAC_256 0x000FAC0C | ||
| 2259 | #define WLAN_CIPHER_SUITE_BIP_CMAC_256 0x000FAC0D | ||
| 2233 | 2260 | ||
| 2234 | #define WLAN_CIPHER_SUITE_SMS4 0x00147201 | 2261 | #define WLAN_CIPHER_SUITE_SMS4 0x00147201 |
| 2235 | 2262 | ||
diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h index 0a8ce762a47f..a57bca2ea97e 100644 --- a/include/linux/if_bridge.h +++ b/include/linux/if_bridge.h | |||
| @@ -50,24 +50,6 @@ extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __use | |||
| 50 | typedef int br_should_route_hook_t(struct sk_buff *skb); | 50 | typedef int br_should_route_hook_t(struct sk_buff *skb); |
| 51 | extern br_should_route_hook_t __rcu *br_should_route_hook; | 51 | extern br_should_route_hook_t __rcu *br_should_route_hook; |
| 52 | 52 | ||
| 53 | #if IS_ENABLED(CONFIG_BRIDGE) | ||
| 54 | int br_fdb_external_learn_add(struct net_device *dev, | ||
| 55 | const unsigned char *addr, u16 vid); | ||
| 56 | int br_fdb_external_learn_del(struct net_device *dev, | ||
| 57 | const unsigned char *addr, u16 vid); | ||
| 58 | #else | ||
| 59 | static inline int br_fdb_external_learn_add(struct net_device *dev, | ||
| 60 | const unsigned char *addr, u16 vid) | ||
| 61 | { | ||
| 62 | return 0; | ||
| 63 | } | ||
| 64 | static inline int br_fdb_external_learn_del(struct net_device *dev, | ||
| 65 | const unsigned char *addr, u16 vid) | ||
| 66 | { | ||
| 67 | return 0; | ||
| 68 | } | ||
| 69 | #endif | ||
| 70 | |||
| 71 | #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING) | 53 | #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING) |
| 72 | int br_multicast_list_adjacent(struct net_device *dev, | 54 | int br_multicast_list_adjacent(struct net_device *dev, |
| 73 | struct list_head *br_ip_list); | 55 | struct list_head *br_ip_list); |
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 960e666c51e4..b11b28a30b9e 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
| @@ -78,9 +78,9 @@ static inline bool is_vlan_dev(struct net_device *dev) | |||
| 78 | return dev->priv_flags & IFF_802_1Q_VLAN; | 78 | return dev->priv_flags & IFF_802_1Q_VLAN; |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | #define vlan_tx_tag_present(__skb) ((__skb)->vlan_tci & VLAN_TAG_PRESENT) | 81 | #define skb_vlan_tag_present(__skb) ((__skb)->vlan_tci & VLAN_TAG_PRESENT) |
| 82 | #define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT) | 82 | #define skb_vlan_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT) |
| 83 | #define vlan_tx_tag_get_id(__skb) ((__skb)->vlan_tci & VLAN_VID_MASK) | 83 | #define skb_vlan_tag_get_id(__skb) ((__skb)->vlan_tci & VLAN_VID_MASK) |
| 84 | 84 | ||
| 85 | /** | 85 | /** |
| 86 | * struct vlan_pcpu_stats - VLAN percpu rx/tx stats | 86 | * struct vlan_pcpu_stats - VLAN percpu rx/tx stats |
| @@ -376,7 +376,7 @@ static inline struct sk_buff *vlan_insert_tag_set_proto(struct sk_buff *skb, | |||
| 376 | static inline struct sk_buff *__vlan_hwaccel_push_inside(struct sk_buff *skb) | 376 | static inline struct sk_buff *__vlan_hwaccel_push_inside(struct sk_buff *skb) |
| 377 | { | 377 | { |
| 378 | skb = vlan_insert_tag_set_proto(skb, skb->vlan_proto, | 378 | skb = vlan_insert_tag_set_proto(skb, skb->vlan_proto, |
| 379 | vlan_tx_tag_get(skb)); | 379 | skb_vlan_tag_get(skb)); |
| 380 | if (likely(skb)) | 380 | if (likely(skb)) |
| 381 | skb->vlan_tci = 0; | 381 | skb->vlan_tci = 0; |
| 382 | return skb; | 382 | return skb; |
| @@ -393,7 +393,7 @@ static inline struct sk_buff *__vlan_hwaccel_push_inside(struct sk_buff *skb) | |||
| 393 | */ | 393 | */ |
| 394 | static inline struct sk_buff *vlan_hwaccel_push_inside(struct sk_buff *skb) | 394 | static inline struct sk_buff *vlan_hwaccel_push_inside(struct sk_buff *skb) |
| 395 | { | 395 | { |
| 396 | if (vlan_tx_tag_present(skb)) | 396 | if (skb_vlan_tag_present(skb)) |
| 397 | skb = __vlan_hwaccel_push_inside(skb); | 397 | skb = __vlan_hwaccel_push_inside(skb); |
| 398 | return skb; | 398 | return skb; |
| 399 | } | 399 | } |
| @@ -442,8 +442,8 @@ static inline int __vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) | |||
| 442 | static inline int __vlan_hwaccel_get_tag(const struct sk_buff *skb, | 442 | static inline int __vlan_hwaccel_get_tag(const struct sk_buff *skb, |
| 443 | u16 *vlan_tci) | 443 | u16 *vlan_tci) |
| 444 | { | 444 | { |
| 445 | if (vlan_tx_tag_present(skb)) { | 445 | if (skb_vlan_tag_present(skb)) { |
| 446 | *vlan_tci = vlan_tx_tag_get(skb); | 446 | *vlan_tci = skb_vlan_tag_get(skb); |
| 447 | return 0; | 447 | return 0; |
| 448 | } else { | 448 | } else { |
| 449 | *vlan_tci = 0; | 449 | *vlan_tci = 0; |
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index c694e7baa621..4d5169f5d7d1 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
| @@ -52,6 +52,7 @@ struct ipv6_devconf { | |||
| 52 | __s32 force_tllao; | 52 | __s32 force_tllao; |
| 53 | __s32 ndisc_notify; | 53 | __s32 ndisc_notify; |
| 54 | __s32 suppress_frag_ndisc; | 54 | __s32 suppress_frag_ndisc; |
| 55 | __s32 accept_ra_mtu; | ||
| 55 | void *sysctl; | 56 | void *sysctl; |
| 56 | }; | 57 | }; |
| 57 | 58 | ||
| @@ -124,6 +125,12 @@ struct ipv6_mc_socklist; | |||
| 124 | struct ipv6_ac_socklist; | 125 | struct ipv6_ac_socklist; |
| 125 | struct ipv6_fl_socklist; | 126 | struct ipv6_fl_socklist; |
| 126 | 127 | ||
| 128 | struct inet6_cork { | ||
| 129 | struct ipv6_txoptions *opt; | ||
| 130 | u8 hop_limit; | ||
| 131 | u8 tclass; | ||
| 132 | }; | ||
| 133 | |||
| 127 | /** | 134 | /** |
| 128 | * struct ipv6_pinfo - ipv6 private area | 135 | * struct ipv6_pinfo - ipv6 private area |
| 129 | * | 136 | * |
| @@ -216,11 +223,7 @@ struct ipv6_pinfo { | |||
| 216 | struct ipv6_txoptions *opt; | 223 | struct ipv6_txoptions *opt; |
| 217 | struct sk_buff *pktoptions; | 224 | struct sk_buff *pktoptions; |
| 218 | struct sk_buff *rxpmtu; | 225 | struct sk_buff *rxpmtu; |
| 219 | struct { | 226 | struct inet6_cork cork; |
| 220 | struct ipv6_txoptions *opt; | ||
| 221 | u8 hop_limit; | ||
| 222 | u8 tclass; | ||
| 223 | } cork; | ||
| 224 | }; | 227 | }; |
| 225 | 228 | ||
| 226 | /* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */ | 229 | /* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */ |
diff --git a/include/linux/list_nulls.h b/include/linux/list_nulls.h index 5d10ae364b5e..f266661d2666 100644 --- a/include/linux/list_nulls.h +++ b/include/linux/list_nulls.h | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | #ifndef _LINUX_LIST_NULLS_H | 1 | #ifndef _LINUX_LIST_NULLS_H |
| 2 | #define _LINUX_LIST_NULLS_H | 2 | #define _LINUX_LIST_NULLS_H |
| 3 | 3 | ||
| 4 | #include <linux/poison.h> | ||
| 5 | #include <linux/const.h> | ||
| 6 | |||
| 4 | /* | 7 | /* |
| 5 | * Special version of lists, where end of list is not a NULL pointer, | 8 | * Special version of lists, where end of list is not a NULL pointer, |
| 6 | * but a 'nulls' marker, which can have many different values. | 9 | * but a 'nulls' marker, which can have many different values. |
| @@ -21,8 +24,9 @@ struct hlist_nulls_head { | |||
| 21 | struct hlist_nulls_node { | 24 | struct hlist_nulls_node { |
| 22 | struct hlist_nulls_node *next, **pprev; | 25 | struct hlist_nulls_node *next, **pprev; |
| 23 | }; | 26 | }; |
| 27 | #define NULLS_MARKER(value) (1UL | (((long)value) << 1)) | ||
| 24 | #define INIT_HLIST_NULLS_HEAD(ptr, nulls) \ | 28 | #define INIT_HLIST_NULLS_HEAD(ptr, nulls) \ |
| 25 | ((ptr)->first = (struct hlist_nulls_node *) (1UL | (((long)nulls) << 1))) | 29 | ((ptr)->first = (struct hlist_nulls_node *) NULLS_MARKER(nulls)) |
| 26 | 30 | ||
| 27 | #define hlist_nulls_entry(ptr, type, member) container_of(ptr,type,member) | 31 | #define hlist_nulls_entry(ptr, type, member) container_of(ptr,type,member) |
| 28 | /** | 32 | /** |
diff --git a/include/linux/mlx4/cmd.h b/include/linux/mlx4/cmd.h index 64d25941b329..7b6d4e9ff603 100644 --- a/include/linux/mlx4/cmd.h +++ b/include/linux/mlx4/cmd.h | |||
| @@ -71,6 +71,7 @@ enum { | |||
| 71 | 71 | ||
| 72 | /*master notify fw on finish for slave's flr*/ | 72 | /*master notify fw on finish for slave's flr*/ |
| 73 | MLX4_CMD_INFORM_FLR_DONE = 0x5b, | 73 | MLX4_CMD_INFORM_FLR_DONE = 0x5b, |
| 74 | MLX4_CMD_VIRT_PORT_MAP = 0x5c, | ||
| 74 | MLX4_CMD_GET_OP_REQ = 0x59, | 75 | MLX4_CMD_GET_OP_REQ = 0x59, |
| 75 | 76 | ||
| 76 | /* TPT commands */ | 77 | /* TPT commands */ |
| @@ -165,9 +166,15 @@ enum { | |||
| 165 | }; | 166 | }; |
| 166 | 167 | ||
| 167 | enum { | 168 | enum { |
| 168 | MLX4_CMD_TIME_CLASS_A = 10000, | 169 | MLX4_CMD_TIME_CLASS_A = 60000, |
| 169 | MLX4_CMD_TIME_CLASS_B = 10000, | 170 | MLX4_CMD_TIME_CLASS_B = 60000, |
| 170 | MLX4_CMD_TIME_CLASS_C = 10000, | 171 | MLX4_CMD_TIME_CLASS_C = 60000, |
| 172 | }; | ||
| 173 | |||
| 174 | enum { | ||
| 175 | /* virtual to physical port mapping opcode modifiers */ | ||
| 176 | MLX4_GET_PORT_VIRT2PHY = 0x0, | ||
| 177 | MLX4_SET_PORT_VIRT2PHY = 0x1, | ||
| 171 | }; | 178 | }; |
| 172 | 179 | ||
| 173 | enum { | 180 | enum { |
| @@ -279,6 +286,8 @@ int mlx4_get_vf_config(struct mlx4_dev *dev, int port, int vf, struct ifla_vf_in | |||
| 279 | int mlx4_set_vf_link_state(struct mlx4_dev *dev, int port, int vf, int link_state); | 286 | int mlx4_set_vf_link_state(struct mlx4_dev *dev, int port, int vf, int link_state); |
| 280 | int mlx4_config_dev_retrieval(struct mlx4_dev *dev, | 287 | int mlx4_config_dev_retrieval(struct mlx4_dev *dev, |
| 281 | struct mlx4_config_dev_params *params); | 288 | struct mlx4_config_dev_params *params); |
| 289 | void mlx4_cmd_wake_completions(struct mlx4_dev *dev); | ||
| 290 | void mlx4_report_internal_err_comm_event(struct mlx4_dev *dev); | ||
| 282 | /* | 291 | /* |
| 283 | * mlx4_get_slave_default_vlan - | 292 | * mlx4_get_slave_default_vlan - |
| 284 | * return true if VST ( default vlan) | 293 | * return true if VST ( default vlan) |
| @@ -288,5 +297,6 @@ bool mlx4_get_slave_default_vlan(struct mlx4_dev *dev, int port, int slave, | |||
| 288 | u16 *vlan, u8 *qos); | 297 | u16 *vlan, u8 *qos); |
| 289 | 298 | ||
| 290 | #define MLX4_COMM_GET_IF_REV(cmd_chan_ver) (u8)((cmd_chan_ver) >> 8) | 299 | #define MLX4_COMM_GET_IF_REV(cmd_chan_ver) (u8)((cmd_chan_ver) >> 8) |
| 300 | #define COMM_CHAN_EVENT_INTERNAL_ERR (1 << 17) | ||
| 291 | 301 | ||
| 292 | #endif /* MLX4_CMD_H */ | 302 | #endif /* MLX4_CMD_H */ |
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 5f3a9aa7225d..e4ebff7e9d02 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
| @@ -42,7 +42,7 @@ | |||
| 42 | 42 | ||
| 43 | #include <linux/atomic.h> | 43 | #include <linux/atomic.h> |
| 44 | 44 | ||
| 45 | #include <linux/clocksource.h> | 45 | #include <linux/timecounter.h> |
| 46 | 46 | ||
| 47 | #define MAX_MSIX_P_PORT 17 | 47 | #define MAX_MSIX_P_PORT 17 |
| 48 | #define MAX_MSIX 64 | 48 | #define MAX_MSIX 64 |
| @@ -70,6 +70,7 @@ enum { | |||
| 70 | MLX4_FLAG_SLAVE = 1 << 3, | 70 | MLX4_FLAG_SLAVE = 1 << 3, |
| 71 | MLX4_FLAG_SRIOV = 1 << 4, | 71 | MLX4_FLAG_SRIOV = 1 << 4, |
| 72 | MLX4_FLAG_OLD_REG_MAC = 1 << 6, | 72 | MLX4_FLAG_OLD_REG_MAC = 1 << 6, |
| 73 | MLX4_FLAG_BONDED = 1 << 7 | ||
| 73 | }; | 74 | }; |
| 74 | 75 | ||
| 75 | enum { | 76 | enum { |
| @@ -200,7 +201,9 @@ enum { | |||
| 200 | MLX4_DEV_CAP_FLAG2_CONFIG_DEV = 1LL << 16, | 201 | MLX4_DEV_CAP_FLAG2_CONFIG_DEV = 1LL << 16, |
| 201 | MLX4_DEV_CAP_FLAG2_SYS_EQS = 1LL << 17, | 202 | MLX4_DEV_CAP_FLAG2_SYS_EQS = 1LL << 17, |
| 202 | MLX4_DEV_CAP_FLAG2_80_VFS = 1LL << 18, | 203 | MLX4_DEV_CAP_FLAG2_80_VFS = 1LL << 18, |
| 203 | MLX4_DEV_CAP_FLAG2_FS_A0 = 1LL << 19 | 204 | MLX4_DEV_CAP_FLAG2_FS_A0 = 1LL << 19, |
| 205 | MLX4_DEV_CAP_FLAG2_RECOVERABLE_ERROR_EVENT = 1LL << 20, | ||
| 206 | MLX4_DEV_CAP_FLAG2_PORT_REMAP = 1LL << 21 | ||
| 204 | }; | 207 | }; |
| 205 | 208 | ||
| 206 | enum { | 209 | enum { |
| @@ -208,6 +211,10 @@ enum { | |||
| 208 | MLX4_QUERY_FUNC_FLAGS_A0_RES_QP = 1LL << 1 | 211 | MLX4_QUERY_FUNC_FLAGS_A0_RES_QP = 1LL << 1 |
| 209 | }; | 212 | }; |
| 210 | 213 | ||
| 214 | enum { | ||
| 215 | MLX4_VF_CAP_FLAG_RESET = 1 << 0 | ||
| 216 | }; | ||
| 217 | |||
| 211 | /* bit enums for an 8-bit flags field indicating special use | 218 | /* bit enums for an 8-bit flags field indicating special use |
| 212 | * QPs which require special handling in qp_reserve_range. | 219 | * QPs which require special handling in qp_reserve_range. |
| 213 | * Currently, this only includes QPs used by the ETH interface, | 220 | * Currently, this only includes QPs used by the ETH interface, |
| @@ -248,9 +255,14 @@ enum { | |||
| 248 | MLX4_BMME_FLAG_TYPE_2_WIN = 1 << 9, | 255 | MLX4_BMME_FLAG_TYPE_2_WIN = 1 << 9, |
| 249 | MLX4_BMME_FLAG_RESERVED_LKEY = 1 << 10, | 256 | MLX4_BMME_FLAG_RESERVED_LKEY = 1 << 10, |
| 250 | MLX4_BMME_FLAG_FAST_REG_WR = 1 << 11, | 257 | MLX4_BMME_FLAG_FAST_REG_WR = 1 << 11, |
| 258 | MLX4_BMME_FLAG_PORT_REMAP = 1 << 24, | ||
| 251 | MLX4_BMME_FLAG_VSD_INIT2RTR = 1 << 28, | 259 | MLX4_BMME_FLAG_VSD_INIT2RTR = 1 << 28, |
| 252 | }; | 260 | }; |
| 253 | 261 | ||
| 262 | enum { | ||
| 263 | MLX4_FLAG_PORT_REMAP = MLX4_BMME_FLAG_PORT_REMAP | ||
| 264 | }; | ||
| 265 | |||
| 254 | enum mlx4_event { | 266 | enum mlx4_event { |
| 255 | MLX4_EVENT_TYPE_COMP = 0x00, | 267 | MLX4_EVENT_TYPE_COMP = 0x00, |
| 256 | MLX4_EVENT_TYPE_PATH_MIG = 0x01, | 268 | MLX4_EVENT_TYPE_PATH_MIG = 0x01, |
| @@ -276,6 +288,7 @@ enum mlx4_event { | |||
| 276 | MLX4_EVENT_TYPE_FATAL_WARNING = 0x1b, | 288 | MLX4_EVENT_TYPE_FATAL_WARNING = 0x1b, |
| 277 | MLX4_EVENT_TYPE_FLR_EVENT = 0x1c, | 289 | MLX4_EVENT_TYPE_FLR_EVENT = 0x1c, |
| 278 | MLX4_EVENT_TYPE_PORT_MNG_CHG_EVENT = 0x1d, | 290 | MLX4_EVENT_TYPE_PORT_MNG_CHG_EVENT = 0x1d, |
| 291 | MLX4_EVENT_TYPE_RECOVERABLE_ERROR_EVENT = 0x3e, | ||
| 279 | MLX4_EVENT_TYPE_NONE = 0xff, | 292 | MLX4_EVENT_TYPE_NONE = 0xff, |
| 280 | }; | 293 | }; |
| 281 | 294 | ||
| @@ -285,6 +298,11 @@ enum { | |||
| 285 | }; | 298 | }; |
| 286 | 299 | ||
| 287 | enum { | 300 | enum { |
| 301 | MLX4_RECOVERABLE_ERROR_EVENT_SUBTYPE_BAD_CABLE = 1, | ||
| 302 | MLX4_RECOVERABLE_ERROR_EVENT_SUBTYPE_UNSUPPORTED_CABLE = 2, | ||
| 303 | }; | ||
| 304 | |||
| 305 | enum { | ||
| 288 | MLX4_FATAL_WARNING_SUBTYPE_WARMING = 0, | 306 | MLX4_FATAL_WARNING_SUBTYPE_WARMING = 0, |
| 289 | }; | 307 | }; |
| 290 | 308 | ||
| @@ -411,6 +429,16 @@ enum { | |||
| 411 | MLX4_EQ_PORT_INFO_MSTR_SM_SL_CHANGE_MASK = 1 << 4, | 429 | MLX4_EQ_PORT_INFO_MSTR_SM_SL_CHANGE_MASK = 1 << 4, |
| 412 | }; | 430 | }; |
| 413 | 431 | ||
| 432 | enum { | ||
| 433 | MLX4_DEVICE_STATE_UP = 1 << 0, | ||
| 434 | MLX4_DEVICE_STATE_INTERNAL_ERROR = 1 << 1, | ||
| 435 | }; | ||
| 436 | |||
| 437 | enum { | ||
| 438 | MLX4_INTERFACE_STATE_UP = 1 << 0, | ||
| 439 | MLX4_INTERFACE_STATE_DELETION = 1 << 1, | ||
| 440 | }; | ||
| 441 | |||
| 414 | #define MSTR_SM_CHANGE_MASK (MLX4_EQ_PORT_INFO_MSTR_SM_SL_CHANGE_MASK | \ | 442 | #define MSTR_SM_CHANGE_MASK (MLX4_EQ_PORT_INFO_MSTR_SM_SL_CHANGE_MASK | \ |
| 415 | MLX4_EQ_PORT_INFO_MSTR_SM_LID_CHANGE_MASK) | 443 | MLX4_EQ_PORT_INFO_MSTR_SM_LID_CHANGE_MASK) |
| 416 | 444 | ||
| @@ -535,6 +563,7 @@ struct mlx4_caps { | |||
| 535 | u8 alloc_res_qp_mask; | 563 | u8 alloc_res_qp_mask; |
| 536 | u32 dmfs_high_rate_qpn_base; | 564 | u32 dmfs_high_rate_qpn_base; |
| 537 | u32 dmfs_high_rate_qpn_range; | 565 | u32 dmfs_high_rate_qpn_range; |
| 566 | u32 vf_caps; | ||
| 538 | }; | 567 | }; |
| 539 | 568 | ||
| 540 | struct mlx4_buf_list { | 569 | struct mlx4_buf_list { |
| @@ -660,6 +689,8 @@ struct mlx4_cq { | |||
| 660 | void (*comp)(struct mlx4_cq *); | 689 | void (*comp)(struct mlx4_cq *); |
| 661 | void *priv; | 690 | void *priv; |
| 662 | } tasklet_ctx; | 691 | } tasklet_ctx; |
| 692 | int reset_notify_added; | ||
| 693 | struct list_head reset_notify; | ||
| 663 | }; | 694 | }; |
| 664 | 695 | ||
| 665 | struct mlx4_qp { | 696 | struct mlx4_qp { |
| @@ -744,8 +775,23 @@ struct mlx4_vf_dev { | |||
| 744 | u8 n_ports; | 775 | u8 n_ports; |
| 745 | }; | 776 | }; |
| 746 | 777 | ||
| 747 | struct mlx4_dev { | 778 | struct mlx4_dev_persistent { |
| 748 | struct pci_dev *pdev; | 779 | struct pci_dev *pdev; |
| 780 | struct mlx4_dev *dev; | ||
| 781 | int nvfs[MLX4_MAX_PORTS + 1]; | ||
| 782 | int num_vfs; | ||
| 783 | enum mlx4_port_type curr_port_type[MLX4_MAX_PORTS + 1]; | ||
| 784 | enum mlx4_port_type curr_port_poss_type[MLX4_MAX_PORTS + 1]; | ||
| 785 | struct work_struct catas_work; | ||
| 786 | struct workqueue_struct *catas_wq; | ||
| 787 | struct mutex device_state_mutex; /* protect HW state */ | ||
| 788 | u8 state; | ||
| 789 | struct mutex interface_state_mutex; /* protect SW state */ | ||
| 790 | u8 interface_state; | ||
| 791 | }; | ||
| 792 | |||
| 793 | struct mlx4_dev { | ||
| 794 | struct mlx4_dev_persistent *persist; | ||
| 749 | unsigned long flags; | 795 | unsigned long flags; |
| 750 | unsigned long num_slaves; | 796 | unsigned long num_slaves; |
| 751 | struct mlx4_caps caps; | 797 | struct mlx4_caps caps; |
| @@ -754,13 +800,11 @@ struct mlx4_dev { | |||
| 754 | struct radix_tree_root qp_table_tree; | 800 | struct radix_tree_root qp_table_tree; |
| 755 | u8 rev_id; | 801 | u8 rev_id; |
| 756 | char board_id[MLX4_BOARD_ID_LEN]; | 802 | char board_id[MLX4_BOARD_ID_LEN]; |
| 757 | int num_vfs; | ||
| 758 | int numa_node; | 803 | int numa_node; |
| 759 | int oper_log_mgm_entry_size; | 804 | int oper_log_mgm_entry_size; |
| 760 | u64 regid_promisc_array[MLX4_MAX_PORTS + 1]; | 805 | u64 regid_promisc_array[MLX4_MAX_PORTS + 1]; |
| 761 | u64 regid_allmulti_array[MLX4_MAX_PORTS + 1]; | 806 | u64 regid_allmulti_array[MLX4_MAX_PORTS + 1]; |
| 762 | struct mlx4_vf_dev *dev_vfs; | 807 | struct mlx4_vf_dev *dev_vfs; |
| 763 | int nvfs[MLX4_MAX_PORTS + 1]; | ||
| 764 | }; | 808 | }; |
| 765 | 809 | ||
| 766 | struct mlx4_eqe { | 810 | struct mlx4_eqe { |
| @@ -832,6 +876,11 @@ struct mlx4_eqe { | |||
| 832 | } __packed tbl_change_info; | 876 | } __packed tbl_change_info; |
| 833 | } params; | 877 | } params; |
| 834 | } __packed port_mgmt_change; | 878 | } __packed port_mgmt_change; |
| 879 | struct { | ||
| 880 | u8 reserved[3]; | ||
| 881 | u8 port; | ||
| 882 | u32 reserved1[5]; | ||
| 883 | } __packed bad_cable; | ||
| 835 | } event; | 884 | } event; |
| 836 | u8 slave_id; | 885 | u8 slave_id; |
| 837 | u8 reserved3[2]; | 886 | u8 reserved3[2]; |
| @@ -1338,6 +1387,8 @@ int mlx4_phys_to_slave_port(struct mlx4_dev *dev, int slave, int port); | |||
| 1338 | int mlx4_get_base_gid_ix(struct mlx4_dev *dev, int slave, int port); | 1387 | int mlx4_get_base_gid_ix(struct mlx4_dev *dev, int slave, int port); |
| 1339 | 1388 | ||
| 1340 | int mlx4_config_vxlan_port(struct mlx4_dev *dev, __be16 udp_port); | 1389 | int mlx4_config_vxlan_port(struct mlx4_dev *dev, __be16 udp_port); |
| 1390 | int mlx4_disable_rx_port_check(struct mlx4_dev *dev, bool dis); | ||
| 1391 | int mlx4_virt2phy_port_map(struct mlx4_dev *dev, u32 port1, u32 port2); | ||
| 1341 | int mlx4_vf_smi_enabled(struct mlx4_dev *dev, int slave, int port); | 1392 | int mlx4_vf_smi_enabled(struct mlx4_dev *dev, int slave, int port); |
| 1342 | int mlx4_vf_get_enable_smi_admin(struct mlx4_dev *dev, int slave, int port); | 1393 | int mlx4_vf_get_enable_smi_admin(struct mlx4_dev *dev, int slave, int port); |
| 1343 | int mlx4_vf_set_enable_smi_admin(struct mlx4_dev *dev, int slave, int port, | 1394 | int mlx4_vf_set_enable_smi_admin(struct mlx4_dev *dev, int slave, int port, |
diff --git a/include/linux/mlx4/driver.h b/include/linux/mlx4/driver.h index 022055c8fb26..9553a73d2049 100644 --- a/include/linux/mlx4/driver.h +++ b/include/linux/mlx4/driver.h | |||
| @@ -49,6 +49,10 @@ enum mlx4_dev_event { | |||
| 49 | MLX4_DEV_EVENT_SLAVE_SHUTDOWN, | 49 | MLX4_DEV_EVENT_SLAVE_SHUTDOWN, |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | enum { | ||
| 53 | MLX4_INTFF_BONDING = 1 << 0 | ||
| 54 | }; | ||
| 55 | |||
| 52 | struct mlx4_interface { | 56 | struct mlx4_interface { |
| 53 | void * (*add) (struct mlx4_dev *dev); | 57 | void * (*add) (struct mlx4_dev *dev); |
| 54 | void (*remove)(struct mlx4_dev *dev, void *context); | 58 | void (*remove)(struct mlx4_dev *dev, void *context); |
| @@ -57,11 +61,26 @@ struct mlx4_interface { | |||
| 57 | void * (*get_dev)(struct mlx4_dev *dev, void *context, u8 port); | 61 | void * (*get_dev)(struct mlx4_dev *dev, void *context, u8 port); |
| 58 | struct list_head list; | 62 | struct list_head list; |
| 59 | enum mlx4_protocol protocol; | 63 | enum mlx4_protocol protocol; |
| 64 | int flags; | ||
| 60 | }; | 65 | }; |
| 61 | 66 | ||
| 62 | int mlx4_register_interface(struct mlx4_interface *intf); | 67 | int mlx4_register_interface(struct mlx4_interface *intf); |
| 63 | void mlx4_unregister_interface(struct mlx4_interface *intf); | 68 | void mlx4_unregister_interface(struct mlx4_interface *intf); |
| 64 | 69 | ||
| 70 | int mlx4_bond(struct mlx4_dev *dev); | ||
| 71 | int mlx4_unbond(struct mlx4_dev *dev); | ||
| 72 | static inline int mlx4_is_bonded(struct mlx4_dev *dev) | ||
| 73 | { | ||
| 74 | return !!(dev->flags & MLX4_FLAG_BONDED); | ||
| 75 | } | ||
| 76 | |||
| 77 | struct mlx4_port_map { | ||
| 78 | u8 port1; | ||
| 79 | u8 port2; | ||
| 80 | }; | ||
| 81 | |||
| 82 | int mlx4_port_map_set(struct mlx4_dev *dev, struct mlx4_port_map *v2p); | ||
| 83 | |||
| 65 | void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto, int port); | 84 | void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto, int port); |
| 66 | 85 | ||
| 67 | static inline u64 mlx4_mac_to_u64(u8 *addr) | 86 | static inline u64 mlx4_mac_to_u64(u8 *addr) |
diff --git a/include/linux/mlx4/qp.h b/include/linux/mlx4/qp.h index 467ccdf94c98..2bbc62aa818a 100644 --- a/include/linux/mlx4/qp.h +++ b/include/linux/mlx4/qp.h | |||
| @@ -96,6 +96,7 @@ enum { | |||
| 96 | MLX4_QP_BIT_RRE = 1 << 15, | 96 | MLX4_QP_BIT_RRE = 1 << 15, |
| 97 | MLX4_QP_BIT_RWE = 1 << 14, | 97 | MLX4_QP_BIT_RWE = 1 << 14, |
| 98 | MLX4_QP_BIT_RAE = 1 << 13, | 98 | MLX4_QP_BIT_RAE = 1 << 13, |
| 99 | MLX4_QP_BIT_FPP = 1 << 3, | ||
| 99 | MLX4_QP_BIT_RIC = 1 << 4, | 100 | MLX4_QP_BIT_RIC = 1 << 4, |
| 100 | }; | 101 | }; |
| 101 | 102 | ||
diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h index 0f01fe065424..996807963716 100644 --- a/include/linux/mmc/sdio_ids.h +++ b/include/linux/mmc/sdio_ids.h | |||
| @@ -24,13 +24,15 @@ | |||
| 24 | * Vendors and devices. Sort key: vendor first, device next. | 24 | * Vendors and devices. Sort key: vendor first, device next. |
| 25 | */ | 25 | */ |
| 26 | #define SDIO_VENDOR_ID_BROADCOM 0x02d0 | 26 | #define SDIO_VENDOR_ID_BROADCOM 0x02d0 |
| 27 | #define SDIO_DEVICE_ID_BROADCOM_43143 43143 | 27 | #define SDIO_DEVICE_ID_BROADCOM_43143 0xa887 |
| 28 | #define SDIO_DEVICE_ID_BROADCOM_43241 0x4324 | 28 | #define SDIO_DEVICE_ID_BROADCOM_43241 0x4324 |
| 29 | #define SDIO_DEVICE_ID_BROADCOM_4329 0x4329 | 29 | #define SDIO_DEVICE_ID_BROADCOM_4329 0x4329 |
| 30 | #define SDIO_DEVICE_ID_BROADCOM_4330 0x4330 | 30 | #define SDIO_DEVICE_ID_BROADCOM_4330 0x4330 |
| 31 | #define SDIO_DEVICE_ID_BROADCOM_4334 0x4334 | 31 | #define SDIO_DEVICE_ID_BROADCOM_4334 0x4334 |
| 32 | #define SDIO_DEVICE_ID_BROADCOM_43340 0xa94c | ||
| 33 | #define SDIO_DEVICE_ID_BROADCOM_43341 0xa94d | ||
| 32 | #define SDIO_DEVICE_ID_BROADCOM_4335_4339 0x4335 | 34 | #define SDIO_DEVICE_ID_BROADCOM_4335_4339 0x4335 |
| 33 | #define SDIO_DEVICE_ID_BROADCOM_43362 43362 | 35 | #define SDIO_DEVICE_ID_BROADCOM_43362 0xa962 |
| 34 | #define SDIO_DEVICE_ID_BROADCOM_4354 0x4354 | 36 | #define SDIO_DEVICE_ID_BROADCOM_4354 0x4354 |
| 35 | 37 | ||
| 36 | #define SDIO_VENDOR_ID_INTEL 0x0089 | 38 | #define SDIO_VENDOR_ID_INTEL 0x0089 |
diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h index 8e30685affeb..7d59dc6ab789 100644 --- a/include/linux/netdev_features.h +++ b/include/linux/netdev_features.h | |||
| @@ -66,6 +66,7 @@ enum { | |||
| 66 | NETIF_F_HW_VLAN_STAG_FILTER_BIT,/* Receive filtering on VLAN STAGs */ | 66 | NETIF_F_HW_VLAN_STAG_FILTER_BIT,/* Receive filtering on VLAN STAGs */ |
| 67 | NETIF_F_HW_L2FW_DOFFLOAD_BIT, /* Allow L2 Forwarding in Hardware */ | 67 | NETIF_F_HW_L2FW_DOFFLOAD_BIT, /* Allow L2 Forwarding in Hardware */ |
| 68 | NETIF_F_BUSY_POLL_BIT, /* Busy poll */ | 68 | NETIF_F_BUSY_POLL_BIT, /* Busy poll */ |
| 69 | NETIF_F_HW_SWITCH_OFFLOAD_BIT, /* HW switch offload */ | ||
| 69 | 70 | ||
| 70 | /* | 71 | /* |
| 71 | * Add your fresh new feature above and remember to update | 72 | * Add your fresh new feature above and remember to update |
| @@ -124,6 +125,7 @@ enum { | |||
| 124 | #define NETIF_F_HW_VLAN_STAG_TX __NETIF_F(HW_VLAN_STAG_TX) | 125 | #define NETIF_F_HW_VLAN_STAG_TX __NETIF_F(HW_VLAN_STAG_TX) |
| 125 | #define NETIF_F_HW_L2FW_DOFFLOAD __NETIF_F(HW_L2FW_DOFFLOAD) | 126 | #define NETIF_F_HW_L2FW_DOFFLOAD __NETIF_F(HW_L2FW_DOFFLOAD) |
| 126 | #define NETIF_F_BUSY_POLL __NETIF_F(BUSY_POLL) | 127 | #define NETIF_F_BUSY_POLL __NETIF_F(BUSY_POLL) |
| 128 | #define NETIF_F_HW_SWITCH_OFFLOAD __NETIF_F(HW_SWITCH_OFFLOAD) | ||
| 127 | 129 | ||
| 128 | /* Features valid for ethtool to change */ | 130 | /* Features valid for ethtool to change */ |
| 129 | /* = all defined minus driver/device-class-related */ | 131 | /* = all defined minus driver/device-class-related */ |
| @@ -159,7 +161,9 @@ enum { | |||
| 159 | */ | 161 | */ |
| 160 | #define NETIF_F_ONE_FOR_ALL (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \ | 162 | #define NETIF_F_ONE_FOR_ALL (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \ |
| 161 | NETIF_F_SG | NETIF_F_HIGHDMA | \ | 163 | NETIF_F_SG | NETIF_F_HIGHDMA | \ |
| 162 | NETIF_F_FRAGLIST | NETIF_F_VLAN_CHALLENGED) | 164 | NETIF_F_FRAGLIST | NETIF_F_VLAN_CHALLENGED | \ |
| 165 | NETIF_F_HW_SWITCH_OFFLOAD) | ||
| 166 | |||
| 163 | /* | 167 | /* |
| 164 | * If one device doesn't support one of these features, then disable it | 168 | * If one device doesn't support one of these features, then disable it |
| 165 | * for all in netdev_increment_features. | 169 | * for all in netdev_increment_features. |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 52fd8e8694cf..d115256ed5a2 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | #include <linux/netdev_features.h> | 51 | #include <linux/netdev_features.h> |
| 52 | #include <linux/neighbour.h> | 52 | #include <linux/neighbour.h> |
| 53 | #include <uapi/linux/netdevice.h> | 53 | #include <uapi/linux/netdevice.h> |
| 54 | #include <uapi/linux/if_bonding.h> | ||
| 54 | 55 | ||
| 55 | struct netpoll_info; | 56 | struct netpoll_info; |
| 56 | struct device; | 57 | struct device; |
| @@ -643,39 +644,40 @@ struct rps_dev_flow_table { | |||
| 643 | /* | 644 | /* |
| 644 | * The rps_sock_flow_table contains mappings of flows to the last CPU | 645 | * The rps_sock_flow_table contains mappings of flows to the last CPU |
| 645 | * on which they were processed by the application (set in recvmsg). | 646 | * on which they were processed by the application (set in recvmsg). |
| 647 | * Each entry is a 32bit value. Upper part is the high order bits | ||
| 648 | * of flow hash, lower part is cpu number. | ||
| 649 | * rps_cpu_mask is used to partition the space, depending on number of | ||
| 650 | * possible cpus : rps_cpu_mask = roundup_pow_of_two(nr_cpu_ids) - 1 | ||
| 651 | * For example, if 64 cpus are possible, rps_cpu_mask = 0x3f, | ||
| 652 | * meaning we use 32-6=26 bits for the hash. | ||
| 646 | */ | 653 | */ |
| 647 | struct rps_sock_flow_table { | 654 | struct rps_sock_flow_table { |
| 648 | unsigned int mask; | 655 | u32 mask; |
| 649 | u16 ents[0]; | 656 | |
| 657 | u32 ents[0] ____cacheline_aligned_in_smp; | ||
| 650 | }; | 658 | }; |
| 651 | #define RPS_SOCK_FLOW_TABLE_SIZE(_num) (sizeof(struct rps_sock_flow_table) + \ | 659 | #define RPS_SOCK_FLOW_TABLE_SIZE(_num) (offsetof(struct rps_sock_flow_table, ents[_num])) |
| 652 | ((_num) * sizeof(u16))) | ||
| 653 | 660 | ||
| 654 | #define RPS_NO_CPU 0xffff | 661 | #define RPS_NO_CPU 0xffff |
| 655 | 662 | ||
| 663 | extern u32 rps_cpu_mask; | ||
| 664 | extern struct rps_sock_flow_table __rcu *rps_sock_flow_table; | ||
| 665 | |||
| 656 | static inline void rps_record_sock_flow(struct rps_sock_flow_table *table, | 666 | static inline void rps_record_sock_flow(struct rps_sock_flow_table *table, |
| 657 | u32 hash) | 667 | u32 hash) |
| 658 | { | 668 | { |
| 659 | if (table && hash) { | 669 | if (table && hash) { |
| 660 | unsigned int cpu, index = hash & table->mask; | 670 | unsigned int index = hash & table->mask; |
| 671 | u32 val = hash & ~rps_cpu_mask; | ||
| 661 | 672 | ||
| 662 | /* We only give a hint, preemption can change cpu under us */ | 673 | /* We only give a hint, preemption can change cpu under us */ |
| 663 | cpu = raw_smp_processor_id(); | 674 | val |= raw_smp_processor_id(); |
| 664 | 675 | ||
| 665 | if (table->ents[index] != cpu) | 676 | if (table->ents[index] != val) |
| 666 | table->ents[index] = cpu; | 677 | table->ents[index] = val; |
| 667 | } | 678 | } |
| 668 | } | 679 | } |
| 669 | 680 | ||
| 670 | static inline void rps_reset_sock_flow(struct rps_sock_flow_table *table, | ||
| 671 | u32 hash) | ||
| 672 | { | ||
| 673 | if (table && hash) | ||
| 674 | table->ents[hash & table->mask] = RPS_NO_CPU; | ||
| 675 | } | ||
| 676 | |||
| 677 | extern struct rps_sock_flow_table __rcu *rps_sock_flow_table; | ||
| 678 | |||
| 679 | #ifdef CONFIG_RFS_ACCEL | 681 | #ifdef CONFIG_RFS_ACCEL |
| 680 | bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index, u32 flow_id, | 682 | bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index, u32 flow_id, |
| 681 | u16 filter_id); | 683 | u16 filter_id); |
| @@ -1154,13 +1156,15 @@ struct net_device_ops { | |||
| 1154 | int idx); | 1156 | int idx); |
| 1155 | 1157 | ||
| 1156 | int (*ndo_bridge_setlink)(struct net_device *dev, | 1158 | int (*ndo_bridge_setlink)(struct net_device *dev, |
| 1157 | struct nlmsghdr *nlh); | 1159 | struct nlmsghdr *nlh, |
| 1160 | u16 flags); | ||
| 1158 | int (*ndo_bridge_getlink)(struct sk_buff *skb, | 1161 | int (*ndo_bridge_getlink)(struct sk_buff *skb, |
| 1159 | u32 pid, u32 seq, | 1162 | u32 pid, u32 seq, |
| 1160 | struct net_device *dev, | 1163 | struct net_device *dev, |
| 1161 | u32 filter_mask); | 1164 | u32 filter_mask); |
| 1162 | int (*ndo_bridge_dellink)(struct net_device *dev, | 1165 | int (*ndo_bridge_dellink)(struct net_device *dev, |
| 1163 | struct nlmsghdr *nlh); | 1166 | struct nlmsghdr *nlh, |
| 1167 | u16 flags); | ||
| 1164 | int (*ndo_change_carrier)(struct net_device *dev, | 1168 | int (*ndo_change_carrier)(struct net_device *dev, |
| 1165 | bool new_carrier); | 1169 | bool new_carrier); |
| 1166 | int (*ndo_get_phys_port_id)(struct net_device *dev, | 1170 | int (*ndo_get_phys_port_id)(struct net_device *dev, |
| @@ -1514,6 +1518,8 @@ struct net_device { | |||
| 1514 | struct list_head napi_list; | 1518 | struct list_head napi_list; |
| 1515 | struct list_head unreg_list; | 1519 | struct list_head unreg_list; |
| 1516 | struct list_head close_list; | 1520 | struct list_head close_list; |
| 1521 | struct list_head ptype_all; | ||
| 1522 | struct list_head ptype_specific; | ||
| 1517 | 1523 | ||
| 1518 | struct { | 1524 | struct { |
| 1519 | struct list_head upper; | 1525 | struct list_head upper; |
| @@ -1969,7 +1975,7 @@ struct offload_callbacks { | |||
| 1969 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, | 1975 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, |
| 1970 | netdev_features_t features); | 1976 | netdev_features_t features); |
| 1971 | struct sk_buff **(*gro_receive)(struct sk_buff **head, | 1977 | struct sk_buff **(*gro_receive)(struct sk_buff **head, |
| 1972 | struct sk_buff *skb); | 1978 | struct sk_buff *skb); |
| 1973 | int (*gro_complete)(struct sk_buff *skb, int nhoff); | 1979 | int (*gro_complete)(struct sk_buff *skb, int nhoff); |
| 1974 | }; | 1980 | }; |
| 1975 | 1981 | ||
| @@ -1979,10 +1985,21 @@ struct packet_offload { | |||
| 1979 | struct list_head list; | 1985 | struct list_head list; |
| 1980 | }; | 1986 | }; |
| 1981 | 1987 | ||
| 1988 | struct udp_offload; | ||
| 1989 | |||
| 1990 | struct udp_offload_callbacks { | ||
| 1991 | struct sk_buff **(*gro_receive)(struct sk_buff **head, | ||
| 1992 | struct sk_buff *skb, | ||
| 1993 | struct udp_offload *uoff); | ||
| 1994 | int (*gro_complete)(struct sk_buff *skb, | ||
| 1995 | int nhoff, | ||
| 1996 | struct udp_offload *uoff); | ||
| 1997 | }; | ||
| 1998 | |||
| 1982 | struct udp_offload { | 1999 | struct udp_offload { |
| 1983 | __be16 port; | 2000 | __be16 port; |
| 1984 | u8 ipproto; | 2001 | u8 ipproto; |
| 1985 | struct offload_callbacks callbacks; | 2002 | struct udp_offload_callbacks callbacks; |
| 1986 | }; | 2003 | }; |
| 1987 | 2004 | ||
| 1988 | /* often modified stats are per cpu, other are shared (netdev->stats) */ | 2005 | /* often modified stats are per cpu, other are shared (netdev->stats) */ |
| @@ -2041,6 +2058,7 @@ struct pcpu_sw_netstats { | |||
| 2041 | #define NETDEV_RESEND_IGMP 0x0016 | 2058 | #define NETDEV_RESEND_IGMP 0x0016 |
| 2042 | #define NETDEV_PRECHANGEMTU 0x0017 /* notify before mtu change happened */ | 2059 | #define NETDEV_PRECHANGEMTU 0x0017 /* notify before mtu change happened */ |
| 2043 | #define NETDEV_CHANGEINFODATA 0x0018 | 2060 | #define NETDEV_CHANGEINFODATA 0x0018 |
| 2061 | #define NETDEV_BONDING_INFO 0x0019 | ||
| 2044 | 2062 | ||
| 2045 | int register_netdevice_notifier(struct notifier_block *nb); | 2063 | int register_netdevice_notifier(struct notifier_block *nb); |
| 2046 | int unregister_netdevice_notifier(struct notifier_block *nb); | 2064 | int unregister_netdevice_notifier(struct notifier_block *nb); |
| @@ -2303,6 +2321,21 @@ do { \ | |||
| 2303 | compute_pseudo(skb, proto)); \ | 2321 | compute_pseudo(skb, proto)); \ |
| 2304 | } while (0) | 2322 | } while (0) |
| 2305 | 2323 | ||
| 2324 | static inline void skb_gro_remcsum_process(struct sk_buff *skb, void *ptr, | ||
| 2325 | int start, int offset) | ||
| 2326 | { | ||
| 2327 | __wsum delta; | ||
| 2328 | |||
| 2329 | BUG_ON(!NAPI_GRO_CB(skb)->csum_valid); | ||
| 2330 | |||
| 2331 | delta = remcsum_adjust(ptr, NAPI_GRO_CB(skb)->csum, start, offset); | ||
| 2332 | |||
| 2333 | /* Adjust skb->csum since we changed the packet */ | ||
| 2334 | skb->csum = csum_add(skb->csum, delta); | ||
| 2335 | NAPI_GRO_CB(skb)->csum = csum_add(NAPI_GRO_CB(skb)->csum, delta); | ||
| 2336 | } | ||
| 2337 | |||
| 2338 | |||
| 2306 | static inline int dev_hard_header(struct sk_buff *skb, struct net_device *dev, | 2339 | static inline int dev_hard_header(struct sk_buff *skb, struct net_device *dev, |
| 2307 | unsigned short type, | 2340 | unsigned short type, |
| 2308 | const void *daddr, const void *saddr, | 2341 | const void *daddr, const void *saddr, |
| @@ -3464,6 +3497,19 @@ struct sk_buff *__skb_gso_segment(struct sk_buff *skb, | |||
| 3464 | struct sk_buff *skb_mac_gso_segment(struct sk_buff *skb, | 3497 | struct sk_buff *skb_mac_gso_segment(struct sk_buff *skb, |
| 3465 | netdev_features_t features); | 3498 | netdev_features_t features); |
| 3466 | 3499 | ||
| 3500 | struct netdev_bonding_info { | ||
| 3501 | ifslave slave; | ||
| 3502 | ifbond master; | ||
| 3503 | }; | ||
| 3504 | |||
| 3505 | struct netdev_notifier_bonding_info { | ||
| 3506 | struct netdev_notifier_info info; /* must be first */ | ||
| 3507 | struct netdev_bonding_info bonding_info; | ||
| 3508 | }; | ||
| 3509 | |||
| 3510 | void netdev_bonding_info_change(struct net_device *dev, | ||
| 3511 | struct netdev_bonding_info *bonding_info); | ||
| 3512 | |||
| 3467 | static inline | 3513 | static inline |
| 3468 | struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features) | 3514 | struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features) |
| 3469 | { | 3515 | { |
diff --git a/include/linux/phy.h b/include/linux/phy.h index 22af8f8f5802..685809835b5c 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h | |||
| @@ -327,6 +327,8 @@ struct phy_c45_device_ids { | |||
| 327 | * c45_ids: 802.3-c45 Device Identifers if is_c45. | 327 | * c45_ids: 802.3-c45 Device Identifers if is_c45. |
| 328 | * is_c45: Set to true if this phy uses clause 45 addressing. | 328 | * is_c45: Set to true if this phy uses clause 45 addressing. |
| 329 | * is_internal: Set to true if this phy is internal to a MAC. | 329 | * is_internal: Set to true if this phy is internal to a MAC. |
| 330 | * has_fixups: Set to true if this phy has fixups/quirks. | ||
| 331 | * suspended: Set to true if this phy has been suspended successfully. | ||
| 330 | * state: state of the PHY for management purposes | 332 | * state: state of the PHY for management purposes |
| 331 | * dev_flags: Device-specific flags used by the PHY driver. | 333 | * dev_flags: Device-specific flags used by the PHY driver. |
| 332 | * addr: Bus address of PHY | 334 | * addr: Bus address of PHY |
| @@ -364,6 +366,7 @@ struct phy_device { | |||
| 364 | bool is_c45; | 366 | bool is_c45; |
| 365 | bool is_internal; | 367 | bool is_internal; |
| 366 | bool has_fixups; | 368 | bool has_fixups; |
| 369 | bool suspended; | ||
| 367 | 370 | ||
| 368 | enum phy_state state; | 371 | enum phy_state state; |
| 369 | 372 | ||
| @@ -565,6 +568,15 @@ struct phy_driver { | |||
| 565 | void (*write_mmd_indirect)(struct phy_device *dev, int ptrad, | 568 | void (*write_mmd_indirect)(struct phy_device *dev, int ptrad, |
| 566 | int devnum, int regnum, u32 val); | 569 | int devnum, int regnum, u32 val); |
| 567 | 570 | ||
| 571 | /* Get the size and type of the eeprom contained within a plug-in | ||
| 572 | * module */ | ||
| 573 | int (*module_info)(struct phy_device *dev, | ||
| 574 | struct ethtool_modinfo *modinfo); | ||
| 575 | |||
| 576 | /* Get the eeprom information from the plug-in module */ | ||
| 577 | int (*module_eeprom)(struct phy_device *dev, | ||
| 578 | struct ethtool_eeprom *ee, u8 *data); | ||
| 579 | |||
| 568 | struct device_driver driver; | 580 | struct device_driver driver; |
| 569 | }; | 581 | }; |
| 570 | #define to_phy_driver(d) container_of(d, struct phy_driver, driver) | 582 | #define to_phy_driver(d) container_of(d, struct phy_driver, driver) |
diff --git a/include/linux/platform_data/irda-sa11x0.h b/include/linux/platform_data/irda-sa11x0.h new file mode 100644 index 000000000000..38f77b5e56cf --- /dev/null +++ b/include/linux/platform_data/irda-sa11x0.h | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/include/asm/mach/irda.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2004 Russell King. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | #ifndef __ASM_ARM_MACH_IRDA_H | ||
| 11 | #define __ASM_ARM_MACH_IRDA_H | ||
| 12 | |||
| 13 | struct irda_platform_data { | ||
| 14 | int (*startup)(struct device *); | ||
| 15 | void (*shutdown)(struct device *); | ||
| 16 | int (*set_power)(struct device *, unsigned int state); | ||
| 17 | void (*set_speed)(struct device *, unsigned int speed); | ||
| 18 | }; | ||
| 19 | |||
| 20 | #endif | ||
diff --git a/include/linux/platform_data/st21nfca.h b/include/linux/platform_data/st21nfca.h index 5087fff96d86..cc2bdafb0c69 100644 --- a/include/linux/platform_data/st21nfca.h +++ b/include/linux/platform_data/st21nfca.h | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | struct st21nfca_nfc_platform_data { | 26 | struct st21nfca_nfc_platform_data { |
| 27 | unsigned int gpio_ena; | 27 | unsigned int gpio_ena; |
| 28 | unsigned int irq_polarity; | 28 | unsigned int irq_polarity; |
| 29 | bool is_ese_present; | ||
| 30 | bool is_uicc_present; | ||
| 29 | }; | 31 | }; |
| 30 | 32 | ||
| 31 | #endif /* _ST21NFCA_HCI_H_ */ | 33 | #endif /* _ST21NFCA_HCI_H_ */ |
diff --git a/include/linux/platform_data/st21nfcb.h b/include/linux/platform_data/st21nfcb.h index c3b432f5b63e..b023373d9874 100644 --- a/include/linux/platform_data/st21nfcb.h +++ b/include/linux/platform_data/st21nfcb.h | |||
| @@ -19,8 +19,6 @@ | |||
| 19 | #ifndef _ST21NFCB_NCI_H_ | 19 | #ifndef _ST21NFCB_NCI_H_ |
| 20 | #define _ST21NFCB_NCI_H_ | 20 | #define _ST21NFCB_NCI_H_ |
| 21 | 21 | ||
| 22 | #include <linux/i2c.h> | ||
| 23 | |||
| 24 | #define ST21NFCB_NCI_DRIVER_NAME "st21nfcb_nci" | 22 | #define ST21NFCB_NCI_DRIVER_NAME "st21nfcb_nci" |
| 25 | 23 | ||
| 26 | struct st21nfcb_nfc_platform_data { | 24 | struct st21nfcb_nfc_platform_data { |
| @@ -28,4 +26,4 @@ struct st21nfcb_nfc_platform_data { | |||
| 28 | unsigned int irq_polarity; | 26 | unsigned int irq_polarity; |
| 29 | }; | 27 | }; |
| 30 | 28 | ||
| 31 | #endif /* _ST21NFCA_HCI_H_ */ | 29 | #endif /* _ST21NFCB_NCI_H_ */ |
diff --git a/include/linux/rhashtable.h b/include/linux/rhashtable.h index b93fd89b2e5e..58851275fed9 100644 --- a/include/linux/rhashtable.h +++ b/include/linux/rhashtable.h | |||
| @@ -18,16 +18,45 @@ | |||
| 18 | #ifndef _LINUX_RHASHTABLE_H | 18 | #ifndef _LINUX_RHASHTABLE_H |
| 19 | #define _LINUX_RHASHTABLE_H | 19 | #define _LINUX_RHASHTABLE_H |
| 20 | 20 | ||
| 21 | #include <linux/rculist.h> | 21 | #include <linux/compiler.h> |
| 22 | #include <linux/list_nulls.h> | ||
| 23 | #include <linux/workqueue.h> | ||
| 24 | #include <linux/mutex.h> | ||
| 25 | |||
| 26 | /* | ||
| 27 | * The end of the chain is marked with a special nulls marks which has | ||
| 28 | * the following format: | ||
| 29 | * | ||
| 30 | * +-------+-----------------------------------------------------+-+ | ||
| 31 | * | Base | Hash |1| | ||
| 32 | * +-------+-----------------------------------------------------+-+ | ||
| 33 | * | ||
| 34 | * Base (4 bits) : Reserved to distinguish between multiple tables. | ||
| 35 | * Specified via &struct rhashtable_params.nulls_base. | ||
| 36 | * Hash (27 bits): Full hash (unmasked) of first element added to bucket | ||
| 37 | * 1 (1 bit) : Nulls marker (always set) | ||
| 38 | * | ||
| 39 | * The remaining bits of the next pointer remain unused for now. | ||
| 40 | */ | ||
| 41 | #define RHT_BASE_BITS 4 | ||
| 42 | #define RHT_HASH_BITS 27 | ||
| 43 | #define RHT_BASE_SHIFT RHT_HASH_BITS | ||
| 22 | 44 | ||
| 23 | struct rhash_head { | 45 | struct rhash_head { |
| 24 | struct rhash_head __rcu *next; | 46 | struct rhash_head __rcu *next; |
| 25 | }; | 47 | }; |
| 26 | 48 | ||
| 27 | #define INIT_HASH_HEAD(ptr) ((ptr)->next = NULL) | 49 | /** |
| 28 | 50 | * struct bucket_table - Table of hash buckets | |
| 51 | * @size: Number of hash buckets | ||
| 52 | * @locks_mask: Mask to apply before accessing locks[] | ||
| 53 | * @locks: Array of spinlocks protecting individual buckets | ||
| 54 | * @buckets: size * hash buckets | ||
| 55 | */ | ||
| 29 | struct bucket_table { | 56 | struct bucket_table { |
| 30 | size_t size; | 57 | size_t size; |
| 58 | unsigned int locks_mask; | ||
| 59 | spinlock_t *locks; | ||
| 31 | struct rhash_head __rcu *buckets[]; | 60 | struct rhash_head __rcu *buckets[]; |
| 32 | }; | 61 | }; |
| 33 | 62 | ||
| @@ -45,11 +74,16 @@ struct rhashtable; | |||
| 45 | * @hash_rnd: Seed to use while hashing | 74 | * @hash_rnd: Seed to use while hashing |
| 46 | * @max_shift: Maximum number of shifts while expanding | 75 | * @max_shift: Maximum number of shifts while expanding |
| 47 | * @min_shift: Minimum number of shifts while shrinking | 76 | * @min_shift: Minimum number of shifts while shrinking |
| 77 | * @nulls_base: Base value to generate nulls marker | ||
| 78 | * @locks_mul: Number of bucket locks to allocate per cpu (default: 128) | ||
| 48 | * @hashfn: Function to hash key | 79 | * @hashfn: Function to hash key |
| 49 | * @obj_hashfn: Function to hash object | 80 | * @obj_hashfn: Function to hash object |
| 50 | * @grow_decision: If defined, may return true if table should expand | 81 | * @grow_decision: If defined, may return true if table should expand |
| 51 | * @shrink_decision: If defined, may return true if table should shrink | 82 | * @shrink_decision: If defined, may return true if table should shrink |
| 52 | * @mutex_is_held: Must return true if protecting mutex is held | 83 | * |
| 84 | * Note: when implementing the grow and shrink decision function, min/max | ||
| 85 | * shift must be enforced, otherwise, resizing watermarks they set may be | ||
| 86 | * useless. | ||
| 53 | */ | 87 | */ |
| 54 | struct rhashtable_params { | 88 | struct rhashtable_params { |
| 55 | size_t nelem_hint; | 89 | size_t nelem_hint; |
| @@ -59,36 +93,95 @@ struct rhashtable_params { | |||
| 59 | u32 hash_rnd; | 93 | u32 hash_rnd; |
| 60 | size_t max_shift; | 94 | size_t max_shift; |
| 61 | size_t min_shift; | 95 | size_t min_shift; |
| 96 | u32 nulls_base; | ||
| 97 | size_t locks_mul; | ||
| 62 | rht_hashfn_t hashfn; | 98 | rht_hashfn_t hashfn; |
| 63 | rht_obj_hashfn_t obj_hashfn; | 99 | rht_obj_hashfn_t obj_hashfn; |
| 64 | bool (*grow_decision)(const struct rhashtable *ht, | 100 | bool (*grow_decision)(const struct rhashtable *ht, |
| 65 | size_t new_size); | 101 | size_t new_size); |
| 66 | bool (*shrink_decision)(const struct rhashtable *ht, | 102 | bool (*shrink_decision)(const struct rhashtable *ht, |
| 67 | size_t new_size); | 103 | size_t new_size); |
| 68 | #ifdef CONFIG_PROVE_LOCKING | ||
| 69 | int (*mutex_is_held)(void *parent); | ||
| 70 | void *parent; | ||
| 71 | #endif | ||
| 72 | }; | 104 | }; |
| 73 | 105 | ||
| 74 | /** | 106 | /** |
| 75 | * struct rhashtable - Hash table handle | 107 | * struct rhashtable - Hash table handle |
| 76 | * @tbl: Bucket table | 108 | * @tbl: Bucket table |
| 109 | * @future_tbl: Table under construction during expansion/shrinking | ||
| 77 | * @nelems: Number of elements in table | 110 | * @nelems: Number of elements in table |
| 78 | * @shift: Current size (1 << shift) | 111 | * @shift: Current size (1 << shift) |
| 79 | * @p: Configuration parameters | 112 | * @p: Configuration parameters |
| 113 | * @run_work: Deferred worker to expand/shrink asynchronously | ||
| 114 | * @mutex: Mutex to protect current/future table swapping | ||
| 115 | * @walkers: List of active walkers | ||
| 116 | * @being_destroyed: True if table is set up for destruction | ||
| 80 | */ | 117 | */ |
| 81 | struct rhashtable { | 118 | struct rhashtable { |
| 82 | struct bucket_table __rcu *tbl; | 119 | struct bucket_table __rcu *tbl; |
| 83 | size_t nelems; | 120 | struct bucket_table __rcu *future_tbl; |
| 84 | size_t shift; | 121 | atomic_t nelems; |
| 122 | atomic_t shift; | ||
| 85 | struct rhashtable_params p; | 123 | struct rhashtable_params p; |
| 124 | struct work_struct run_work; | ||
| 125 | struct mutex mutex; | ||
| 126 | struct list_head walkers; | ||
| 127 | bool being_destroyed; | ||
| 128 | }; | ||
| 129 | |||
| 130 | /** | ||
| 131 | * struct rhashtable_walker - Hash table walker | ||
| 132 | * @list: List entry on list of walkers | ||
| 133 | * @resize: Resize event occured | ||
| 134 | */ | ||
| 135 | struct rhashtable_walker { | ||
| 136 | struct list_head list; | ||
| 137 | bool resize; | ||
| 86 | }; | 138 | }; |
| 87 | 139 | ||
| 140 | /** | ||
| 141 | * struct rhashtable_iter - Hash table iterator, fits into netlink cb | ||
| 142 | * @ht: Table to iterate through | ||
| 143 | * @p: Current pointer | ||
| 144 | * @walker: Associated rhashtable walker | ||
| 145 | * @slot: Current slot | ||
| 146 | * @skip: Number of entries to skip in slot | ||
| 147 | */ | ||
| 148 | struct rhashtable_iter { | ||
| 149 | struct rhashtable *ht; | ||
| 150 | struct rhash_head *p; | ||
| 151 | struct rhashtable_walker *walker; | ||
| 152 | unsigned int slot; | ||
| 153 | unsigned int skip; | ||
| 154 | }; | ||
| 155 | |||
| 156 | static inline unsigned long rht_marker(const struct rhashtable *ht, u32 hash) | ||
| 157 | { | ||
| 158 | return NULLS_MARKER(ht->p.nulls_base + hash); | ||
| 159 | } | ||
| 160 | |||
| 161 | #define INIT_RHT_NULLS_HEAD(ptr, ht, hash) \ | ||
| 162 | ((ptr) = (typeof(ptr)) rht_marker(ht, hash)) | ||
| 163 | |||
| 164 | static inline bool rht_is_a_nulls(const struct rhash_head *ptr) | ||
| 165 | { | ||
| 166 | return ((unsigned long) ptr & 1); | ||
| 167 | } | ||
| 168 | |||
| 169 | static inline unsigned long rht_get_nulls_value(const struct rhash_head *ptr) | ||
| 170 | { | ||
| 171 | return ((unsigned long) ptr) >> 1; | ||
| 172 | } | ||
| 173 | |||
| 88 | #ifdef CONFIG_PROVE_LOCKING | 174 | #ifdef CONFIG_PROVE_LOCKING |
| 89 | int lockdep_rht_mutex_is_held(const struct rhashtable *ht); | 175 | int lockdep_rht_mutex_is_held(struct rhashtable *ht); |
| 176 | int lockdep_rht_bucket_is_held(const struct bucket_table *tbl, u32 hash); | ||
| 90 | #else | 177 | #else |
| 91 | static inline int lockdep_rht_mutex_is_held(const struct rhashtable *ht) | 178 | static inline int lockdep_rht_mutex_is_held(struct rhashtable *ht) |
| 179 | { | ||
| 180 | return 1; | ||
| 181 | } | ||
| 182 | |||
| 183 | static inline int lockdep_rht_bucket_is_held(const struct bucket_table *tbl, | ||
| 184 | u32 hash) | ||
| 92 | { | 185 | { |
| 93 | return 1; | 186 | return 1; |
| 94 | } | 187 | } |
| @@ -96,13 +189,8 @@ static inline int lockdep_rht_mutex_is_held(const struct rhashtable *ht) | |||
| 96 | 189 | ||
| 97 | int rhashtable_init(struct rhashtable *ht, struct rhashtable_params *params); | 190 | int rhashtable_init(struct rhashtable *ht, struct rhashtable_params *params); |
| 98 | 191 | ||
| 99 | u32 rhashtable_hashfn(const struct rhashtable *ht, const void *key, u32 len); | ||
| 100 | u32 rhashtable_obj_hashfn(const struct rhashtable *ht, void *ptr); | ||
| 101 | |||
| 102 | void rhashtable_insert(struct rhashtable *ht, struct rhash_head *node); | 192 | void rhashtable_insert(struct rhashtable *ht, struct rhash_head *node); |
| 103 | bool rhashtable_remove(struct rhashtable *ht, struct rhash_head *node); | 193 | bool rhashtable_remove(struct rhashtable *ht, struct rhash_head *node); |
| 104 | void rhashtable_remove_pprev(struct rhashtable *ht, struct rhash_head *obj, | ||
| 105 | struct rhash_head __rcu **pprev); | ||
| 106 | 194 | ||
| 107 | bool rht_grow_above_75(const struct rhashtable *ht, size_t new_size); | 195 | bool rht_grow_above_75(const struct rhashtable *ht, size_t new_size); |
| 108 | bool rht_shrink_below_30(const struct rhashtable *ht, size_t new_size); | 196 | bool rht_shrink_below_30(const struct rhashtable *ht, size_t new_size); |
| @@ -110,11 +198,23 @@ bool rht_shrink_below_30(const struct rhashtable *ht, size_t new_size); | |||
| 110 | int rhashtable_expand(struct rhashtable *ht); | 198 | int rhashtable_expand(struct rhashtable *ht); |
| 111 | int rhashtable_shrink(struct rhashtable *ht); | 199 | int rhashtable_shrink(struct rhashtable *ht); |
| 112 | 200 | ||
| 113 | void *rhashtable_lookup(const struct rhashtable *ht, const void *key); | 201 | void *rhashtable_lookup(struct rhashtable *ht, const void *key); |
| 114 | void *rhashtable_lookup_compare(const struct rhashtable *ht, u32 hash, | 202 | void *rhashtable_lookup_compare(struct rhashtable *ht, const void *key, |
| 115 | bool (*compare)(void *, void *), void *arg); | 203 | bool (*compare)(void *, void *), void *arg); |
| 116 | 204 | ||
| 117 | void rhashtable_destroy(const struct rhashtable *ht); | 205 | bool rhashtable_lookup_insert(struct rhashtable *ht, struct rhash_head *obj); |
| 206 | bool rhashtable_lookup_compare_insert(struct rhashtable *ht, | ||
| 207 | struct rhash_head *obj, | ||
| 208 | bool (*compare)(void *, void *), | ||
| 209 | void *arg); | ||
| 210 | |||
| 211 | int rhashtable_walk_init(struct rhashtable *ht, struct rhashtable_iter *iter); | ||
| 212 | void rhashtable_walk_exit(struct rhashtable_iter *iter); | ||
| 213 | int rhashtable_walk_start(struct rhashtable_iter *iter) __acquires(RCU); | ||
| 214 | void *rhashtable_walk_next(struct rhashtable_iter *iter); | ||
| 215 | void rhashtable_walk_stop(struct rhashtable_iter *iter) __releases(RCU); | ||
| 216 | |||
| 217 | void rhashtable_destroy(struct rhashtable *ht); | ||
| 118 | 218 | ||
| 119 | #define rht_dereference(p, ht) \ | 219 | #define rht_dereference(p, ht) \ |
| 120 | rcu_dereference_protected(p, lockdep_rht_mutex_is_held(ht)) | 220 | rcu_dereference_protected(p, lockdep_rht_mutex_is_held(ht)) |
| @@ -122,92 +222,146 @@ void rhashtable_destroy(const struct rhashtable *ht); | |||
| 122 | #define rht_dereference_rcu(p, ht) \ | 222 | #define rht_dereference_rcu(p, ht) \ |
| 123 | rcu_dereference_check(p, lockdep_rht_mutex_is_held(ht)) | 223 | rcu_dereference_check(p, lockdep_rht_mutex_is_held(ht)) |
| 124 | 224 | ||
| 125 | #define rht_entry(ptr, type, member) container_of(ptr, type, member) | 225 | #define rht_dereference_bucket(p, tbl, hash) \ |
| 126 | #define rht_entry_safe(ptr, type, member) \ | 226 | rcu_dereference_protected(p, lockdep_rht_bucket_is_held(tbl, hash)) |
| 127 | ({ \ | 227 | |
| 128 | typeof(ptr) __ptr = (ptr); \ | 228 | #define rht_dereference_bucket_rcu(p, tbl, hash) \ |
| 129 | __ptr ? rht_entry(__ptr, type, member) : NULL; \ | 229 | rcu_dereference_check(p, lockdep_rht_bucket_is_held(tbl, hash)) |
| 130 | }) | ||
| 131 | 230 | ||
| 132 | #define rht_next_entry_safe(pos, ht, member) \ | 231 | #define rht_entry(tpos, pos, member) \ |
| 133 | ({ \ | 232 | ({ tpos = container_of(pos, typeof(*tpos), member); 1; }) |
| 134 | pos ? rht_entry_safe(rht_dereference((pos)->member.next, ht), \ | 233 | |
| 135 | typeof(*(pos)), member) : NULL; \ | 234 | /** |
| 136 | }) | 235 | * rht_for_each_continue - continue iterating over hash chain |
| 236 | * @pos: the &struct rhash_head to use as a loop cursor. | ||
| 237 | * @head: the previous &struct rhash_head to continue from | ||
| 238 | * @tbl: the &struct bucket_table | ||
| 239 | * @hash: the hash value / bucket index | ||
| 240 | */ | ||
| 241 | #define rht_for_each_continue(pos, head, tbl, hash) \ | ||
| 242 | for (pos = rht_dereference_bucket(head, tbl, hash); \ | ||
| 243 | !rht_is_a_nulls(pos); \ | ||
| 244 | pos = rht_dereference_bucket((pos)->next, tbl, hash)) | ||
| 137 | 245 | ||
| 138 | /** | 246 | /** |
| 139 | * rht_for_each - iterate over hash chain | 247 | * rht_for_each - iterate over hash chain |
| 140 | * @pos: &struct rhash_head to use as a loop cursor. | 248 | * @pos: the &struct rhash_head to use as a loop cursor. |
| 141 | * @head: head of the hash chain (struct rhash_head *) | 249 | * @tbl: the &struct bucket_table |
| 142 | * @ht: pointer to your struct rhashtable | 250 | * @hash: the hash value / bucket index |
| 143 | */ | 251 | */ |
| 144 | #define rht_for_each(pos, head, ht) \ | 252 | #define rht_for_each(pos, tbl, hash) \ |
| 145 | for (pos = rht_dereference(head, ht); \ | 253 | rht_for_each_continue(pos, (tbl)->buckets[hash], tbl, hash) |
| 146 | pos; \ | 254 | |
| 147 | pos = rht_dereference((pos)->next, ht)) | 255 | /** |
| 256 | * rht_for_each_entry_continue - continue iterating over hash chain | ||
| 257 | * @tpos: the type * to use as a loop cursor. | ||
| 258 | * @pos: the &struct rhash_head to use as a loop cursor. | ||
| 259 | * @head: the previous &struct rhash_head to continue from | ||
| 260 | * @tbl: the &struct bucket_table | ||
| 261 | * @hash: the hash value / bucket index | ||
| 262 | * @member: name of the &struct rhash_head within the hashable struct. | ||
| 263 | */ | ||
| 264 | #define rht_for_each_entry_continue(tpos, pos, head, tbl, hash, member) \ | ||
| 265 | for (pos = rht_dereference_bucket(head, tbl, hash); \ | ||
| 266 | (!rht_is_a_nulls(pos)) && rht_entry(tpos, pos, member); \ | ||
| 267 | pos = rht_dereference_bucket((pos)->next, tbl, hash)) | ||
| 148 | 268 | ||
| 149 | /** | 269 | /** |
| 150 | * rht_for_each_entry - iterate over hash chain of given type | 270 | * rht_for_each_entry - iterate over hash chain of given type |
| 151 | * @pos: type * to use as a loop cursor. | 271 | * @tpos: the type * to use as a loop cursor. |
| 152 | * @head: head of the hash chain (struct rhash_head *) | 272 | * @pos: the &struct rhash_head to use as a loop cursor. |
| 153 | * @ht: pointer to your struct rhashtable | 273 | * @tbl: the &struct bucket_table |
| 154 | * @member: name of the rhash_head within the hashable struct. | 274 | * @hash: the hash value / bucket index |
| 275 | * @member: name of the &struct rhash_head within the hashable struct. | ||
| 155 | */ | 276 | */ |
| 156 | #define rht_for_each_entry(pos, head, ht, member) \ | 277 | #define rht_for_each_entry(tpos, pos, tbl, hash, member) \ |
| 157 | for (pos = rht_entry_safe(rht_dereference(head, ht), \ | 278 | rht_for_each_entry_continue(tpos, pos, (tbl)->buckets[hash], \ |
| 158 | typeof(*(pos)), member); \ | 279 | tbl, hash, member) |
| 159 | pos; \ | ||
| 160 | pos = rht_next_entry_safe(pos, ht, member)) | ||
| 161 | 280 | ||
| 162 | /** | 281 | /** |
| 163 | * rht_for_each_entry_safe - safely iterate over hash chain of given type | 282 | * rht_for_each_entry_safe - safely iterate over hash chain of given type |
| 164 | * @pos: type * to use as a loop cursor. | 283 | * @tpos: the type * to use as a loop cursor. |
| 165 | * @n: type * to use for temporary next object storage | 284 | * @pos: the &struct rhash_head to use as a loop cursor. |
| 166 | * @head: head of the hash chain (struct rhash_head *) | 285 | * @next: the &struct rhash_head to use as next in loop cursor. |
| 167 | * @ht: pointer to your struct rhashtable | 286 | * @tbl: the &struct bucket_table |
| 168 | * @member: name of the rhash_head within the hashable struct. | 287 | * @hash: the hash value / bucket index |
| 288 | * @member: name of the &struct rhash_head within the hashable struct. | ||
| 169 | * | 289 | * |
| 170 | * This hash chain list-traversal primitive allows for the looped code to | 290 | * This hash chain list-traversal primitive allows for the looped code to |
| 171 | * remove the loop cursor from the list. | 291 | * remove the loop cursor from the list. |
| 172 | */ | 292 | */ |
| 173 | #define rht_for_each_entry_safe(pos, n, head, ht, member) \ | 293 | #define rht_for_each_entry_safe(tpos, pos, next, tbl, hash, member) \ |
| 174 | for (pos = rht_entry_safe(rht_dereference(head, ht), \ | 294 | for (pos = rht_dereference_bucket((tbl)->buckets[hash], tbl, hash), \ |
| 175 | typeof(*(pos)), member), \ | 295 | next = !rht_is_a_nulls(pos) ? \ |
| 176 | n = rht_next_entry_safe(pos, ht, member); \ | 296 | rht_dereference_bucket(pos->next, tbl, hash) : NULL; \ |
| 177 | pos; \ | 297 | (!rht_is_a_nulls(pos)) && rht_entry(tpos, pos, member); \ |
| 178 | pos = n, \ | 298 | pos = next, \ |
| 179 | n = rht_next_entry_safe(pos, ht, member)) | 299 | next = !rht_is_a_nulls(pos) ? \ |
| 300 | rht_dereference_bucket(pos->next, tbl, hash) : NULL) | ||
| 301 | |||
| 302 | /** | ||
| 303 | * rht_for_each_rcu_continue - continue iterating over rcu hash chain | ||
| 304 | * @pos: the &struct rhash_head to use as a loop cursor. | ||
| 305 | * @head: the previous &struct rhash_head to continue from | ||
| 306 | * @tbl: the &struct bucket_table | ||
| 307 | * @hash: the hash value / bucket index | ||
| 308 | * | ||
| 309 | * This hash chain list-traversal primitive may safely run concurrently with | ||
| 310 | * the _rcu mutation primitives such as rhashtable_insert() as long as the | ||
| 311 | * traversal is guarded by rcu_read_lock(). | ||
| 312 | */ | ||
| 313 | #define rht_for_each_rcu_continue(pos, head, tbl, hash) \ | ||
| 314 | for (({barrier(); }), \ | ||
| 315 | pos = rht_dereference_bucket_rcu(head, tbl, hash); \ | ||
| 316 | !rht_is_a_nulls(pos); \ | ||
| 317 | pos = rcu_dereference_raw(pos->next)) | ||
| 180 | 318 | ||
| 181 | /** | 319 | /** |
| 182 | * rht_for_each_rcu - iterate over rcu hash chain | 320 | * rht_for_each_rcu - iterate over rcu hash chain |
| 183 | * @pos: &struct rhash_head to use as a loop cursor. | 321 | * @pos: the &struct rhash_head to use as a loop cursor. |
| 184 | * @head: head of the hash chain (struct rhash_head *) | 322 | * @tbl: the &struct bucket_table |
| 185 | * @ht: pointer to your struct rhashtable | 323 | * @hash: the hash value / bucket index |
| 324 | * | ||
| 325 | * This hash chain list-traversal primitive may safely run concurrently with | ||
| 326 | * the _rcu mutation primitives such as rhashtable_insert() as long as the | ||
| 327 | * traversal is guarded by rcu_read_lock(). | ||
| 328 | */ | ||
| 329 | #define rht_for_each_rcu(pos, tbl, hash) \ | ||
| 330 | rht_for_each_rcu_continue(pos, (tbl)->buckets[hash], tbl, hash) | ||
| 331 | |||
| 332 | /** | ||
| 333 | * rht_for_each_entry_rcu_continue - continue iterating over rcu hash chain | ||
| 334 | * @tpos: the type * to use as a loop cursor. | ||
| 335 | * @pos: the &struct rhash_head to use as a loop cursor. | ||
| 336 | * @head: the previous &struct rhash_head to continue from | ||
| 337 | * @tbl: the &struct bucket_table | ||
| 338 | * @hash: the hash value / bucket index | ||
| 339 | * @member: name of the &struct rhash_head within the hashable struct. | ||
| 186 | * | 340 | * |
| 187 | * This hash chain list-traversal primitive may safely run concurrently with | 341 | * This hash chain list-traversal primitive may safely run concurrently with |
| 188 | * the _rcu fkht mutation primitives such as rht_insert() as long as the | 342 | * the _rcu mutation primitives such as rhashtable_insert() as long as the |
| 189 | * traversal is guarded by rcu_read_lock(). | 343 | * traversal is guarded by rcu_read_lock(). |
| 190 | */ | 344 | */ |
| 191 | #define rht_for_each_rcu(pos, head, ht) \ | 345 | #define rht_for_each_entry_rcu_continue(tpos, pos, head, tbl, hash, member) \ |
| 192 | for (pos = rht_dereference_rcu(head, ht); \ | 346 | for (({barrier(); }), \ |
| 193 | pos; \ | 347 | pos = rht_dereference_bucket_rcu(head, tbl, hash); \ |
| 194 | pos = rht_dereference_rcu((pos)->next, ht)) | 348 | (!rht_is_a_nulls(pos)) && rht_entry(tpos, pos, member); \ |
| 349 | pos = rht_dereference_bucket_rcu(pos->next, tbl, hash)) | ||
| 195 | 350 | ||
| 196 | /** | 351 | /** |
| 197 | * rht_for_each_entry_rcu - iterate over rcu hash chain of given type | 352 | * rht_for_each_entry_rcu - iterate over rcu hash chain of given type |
| 198 | * @pos: type * to use as a loop cursor. | 353 | * @tpos: the type * to use as a loop cursor. |
| 199 | * @head: head of the hash chain (struct rhash_head *) | 354 | * @pos: the &struct rhash_head to use as a loop cursor. |
| 200 | * @member: name of the rhash_head within the hashable struct. | 355 | * @tbl: the &struct bucket_table |
| 356 | * @hash: the hash value / bucket index | ||
| 357 | * @member: name of the &struct rhash_head within the hashable struct. | ||
| 201 | * | 358 | * |
| 202 | * This hash chain list-traversal primitive may safely run concurrently with | 359 | * This hash chain list-traversal primitive may safely run concurrently with |
| 203 | * the _rcu fkht mutation primitives such as rht_insert() as long as the | 360 | * the _rcu mutation primitives such as rhashtable_insert() as long as the |
| 204 | * traversal is guarded by rcu_read_lock(). | 361 | * traversal is guarded by rcu_read_lock(). |
| 205 | */ | 362 | */ |
| 206 | #define rht_for_each_entry_rcu(pos, head, member) \ | 363 | #define rht_for_each_entry_rcu(tpos, pos, tbl, hash, member) \ |
| 207 | for (pos = rht_entry_safe(rcu_dereference_raw(head), \ | 364 | rht_for_each_entry_rcu_continue(tpos, pos, (tbl)->buckets[hash],\ |
| 208 | typeof(*(pos)), member); \ | 365 | tbl, hash, member) |
| 209 | pos; \ | ||
| 210 | pos = rht_entry_safe(rcu_dereference_raw((pos)->member.next), \ | ||
| 211 | typeof(*(pos)), member)) | ||
| 212 | 366 | ||
| 213 | #endif /* _LINUX_RHASHTABLE_H */ | 367 | #endif /* _LINUX_RHASHTABLE_H */ |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 85ab7d72b54c..1bb36edb66b9 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -626,8 +626,11 @@ struct sk_buff { | |||
| 626 | __u32 hash; | 626 | __u32 hash; |
| 627 | __be16 vlan_proto; | 627 | __be16 vlan_proto; |
| 628 | __u16 vlan_tci; | 628 | __u16 vlan_tci; |
| 629 | #ifdef CONFIG_NET_RX_BUSY_POLL | 629 | #if defined(CONFIG_NET_RX_BUSY_POLL) || defined(CONFIG_XPS) |
| 630 | unsigned int napi_id; | 630 | union { |
| 631 | unsigned int napi_id; | ||
| 632 | unsigned int sender_cpu; | ||
| 633 | }; | ||
| 631 | #endif | 634 | #endif |
| 632 | #ifdef CONFIG_NETWORK_SECMARK | 635 | #ifdef CONFIG_NETWORK_SECMARK |
| 633 | __u32 secmark; | 636 | __u32 secmark; |
| @@ -2484,19 +2487,18 @@ static inline int skb_put_padto(struct sk_buff *skb, unsigned int len) | |||
| 2484 | } | 2487 | } |
| 2485 | 2488 | ||
| 2486 | static inline int skb_add_data(struct sk_buff *skb, | 2489 | static inline int skb_add_data(struct sk_buff *skb, |
| 2487 | char __user *from, int copy) | 2490 | struct iov_iter *from, int copy) |
| 2488 | { | 2491 | { |
| 2489 | const int off = skb->len; | 2492 | const int off = skb->len; |
| 2490 | 2493 | ||
| 2491 | if (skb->ip_summed == CHECKSUM_NONE) { | 2494 | if (skb->ip_summed == CHECKSUM_NONE) { |
| 2492 | int err = 0; | 2495 | __wsum csum = 0; |
| 2493 | __wsum csum = csum_and_copy_from_user(from, skb_put(skb, copy), | 2496 | if (csum_and_copy_from_iter(skb_put(skb, copy), copy, |
| 2494 | copy, 0, &err); | 2497 | &csum, from) == copy) { |
| 2495 | if (!err) { | ||
| 2496 | skb->csum = csum_block_add(skb->csum, csum, off); | 2498 | skb->csum = csum_block_add(skb->csum, csum, off); |
| 2497 | return 0; | 2499 | return 0; |
| 2498 | } | 2500 | } |
| 2499 | } else if (!copy_from_user(skb_put(skb, copy), from, copy)) | 2501 | } else if (copy_from_iter(skb_put(skb, copy), copy, from) == copy) |
| 2500 | return 0; | 2502 | return 0; |
| 2501 | 2503 | ||
| 2502 | __skb_trim(skb, off); | 2504 | __skb_trim(skb, off); |
| @@ -2693,8 +2695,7 @@ int skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci); | |||
| 2693 | 2695 | ||
| 2694 | static inline int memcpy_from_msg(void *data, struct msghdr *msg, int len) | 2696 | static inline int memcpy_from_msg(void *data, struct msghdr *msg, int len) |
| 2695 | { | 2697 | { |
| 2696 | /* XXX: stripping const */ | 2698 | return copy_from_iter(data, len, &msg->msg_iter) == len ? 0 : -EFAULT; |
| 2697 | return memcpy_fromiovec(data, (struct iovec *)msg->msg_iter.iov, len); | ||
| 2698 | } | 2699 | } |
| 2699 | 2700 | ||
| 2700 | static inline int memcpy_to_msg(struct msghdr *msg, void *data, int len) | 2701 | static inline int memcpy_to_msg(struct msghdr *msg, void *data, int len) |
| @@ -3071,7 +3072,7 @@ static inline __wsum null_compute_pseudo(struct sk_buff *skb, int proto) | |||
| 3071 | 3072 | ||
| 3072 | #define skb_checksum_validate_zero_check(skb, proto, check, \ | 3073 | #define skb_checksum_validate_zero_check(skb, proto, check, \ |
| 3073 | compute_pseudo) \ | 3074 | compute_pseudo) \ |
| 3074 | __skb_checksum_validate_(skb, proto, true, true, check, compute_pseudo) | 3075 | __skb_checksum_validate(skb, proto, true, true, check, compute_pseudo) |
| 3075 | 3076 | ||
| 3076 | #define skb_checksum_simple_validate(skb) \ | 3077 | #define skb_checksum_simple_validate(skb) \ |
| 3077 | __skb_checksum_validate(skb, 0, true, false, 0, null_compute_pseudo) | 3078 | __skb_checksum_validate(skb, 0, true, false, 0, null_compute_pseudo) |
| @@ -3096,6 +3097,27 @@ do { \ | |||
| 3096 | compute_pseudo(skb, proto)); \ | 3097 | compute_pseudo(skb, proto)); \ |
| 3097 | } while (0) | 3098 | } while (0) |
| 3098 | 3099 | ||
| 3100 | /* Update skbuf and packet to reflect the remote checksum offload operation. | ||
| 3101 | * When called, ptr indicates the starting point for skb->csum when | ||
| 3102 | * ip_summed is CHECKSUM_COMPLETE. If we need create checksum complete | ||
| 3103 | * here, skb_postpull_rcsum is done so skb->csum start is ptr. | ||
| 3104 | */ | ||
| 3105 | static inline void skb_remcsum_process(struct sk_buff *skb, void *ptr, | ||
| 3106 | int start, int offset) | ||
| 3107 | { | ||
| 3108 | __wsum delta; | ||
| 3109 | |||
| 3110 | if (unlikely(skb->ip_summed != CHECKSUM_COMPLETE)) { | ||
| 3111 | __skb_checksum_complete(skb); | ||
| 3112 | skb_postpull_rcsum(skb, skb->data, ptr - (void *)skb->data); | ||
| 3113 | } | ||
| 3114 | |||
| 3115 | delta = remcsum_adjust(ptr, skb->csum, start, offset); | ||
| 3116 | |||
| 3117 | /* Adjust skb->csum since we changed the packet */ | ||
| 3118 | skb->csum = csum_add(skb->csum, delta); | ||
| 3119 | } | ||
| 3120 | |||
| 3099 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 3121 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
| 3100 | void nf_conntrack_destroy(struct nf_conntrack *nfct); | 3122 | void nf_conntrack_destroy(struct nf_conntrack *nfct); |
| 3101 | static inline void nf_conntrack_put(struct nf_conntrack *nfct) | 3123 | static inline void nf_conntrack_put(struct nf_conntrack *nfct) |
diff --git a/include/linux/socket.h b/include/linux/socket.h index 6e49a14365dc..5c19cba34dce 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
| @@ -318,13 +318,6 @@ struct ucred { | |||
| 318 | /* IPX options */ | 318 | /* IPX options */ |
| 319 | #define IPX_TYPE 1 | 319 | #define IPX_TYPE 1 |
| 320 | 320 | ||
| 321 | extern int csum_partial_copy_fromiovecend(unsigned char *kdata, | ||
| 322 | struct iovec *iov, | ||
| 323 | int offset, | ||
| 324 | unsigned int len, __wsum *csump); | ||
| 325 | extern unsigned long iov_pages(const struct iovec *iov, int offset, | ||
| 326 | unsigned long nr_segs); | ||
| 327 | |||
| 328 | extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr); | 321 | extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr); |
| 329 | extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); | 322 | extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); |
| 330 | 323 | ||
diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h index 262ba4ef9a8e..3e18379dfa6f 100644 --- a/include/linux/spinlock.h +++ b/include/linux/spinlock.h | |||
| @@ -190,6 +190,8 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock) | |||
| 190 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 190 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| 191 | # define raw_spin_lock_nested(lock, subclass) \ | 191 | # define raw_spin_lock_nested(lock, subclass) \ |
| 192 | _raw_spin_lock_nested(lock, subclass) | 192 | _raw_spin_lock_nested(lock, subclass) |
| 193 | # define raw_spin_lock_bh_nested(lock, subclass) \ | ||
| 194 | _raw_spin_lock_bh_nested(lock, subclass) | ||
| 193 | 195 | ||
| 194 | # define raw_spin_lock_nest_lock(lock, nest_lock) \ | 196 | # define raw_spin_lock_nest_lock(lock, nest_lock) \ |
| 195 | do { \ | 197 | do { \ |
| @@ -205,6 +207,7 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock) | |||
| 205 | # define raw_spin_lock_nested(lock, subclass) \ | 207 | # define raw_spin_lock_nested(lock, subclass) \ |
| 206 | _raw_spin_lock(((void)(subclass), (lock))) | 208 | _raw_spin_lock(((void)(subclass), (lock))) |
| 207 | # define raw_spin_lock_nest_lock(lock, nest_lock) _raw_spin_lock(lock) | 209 | # define raw_spin_lock_nest_lock(lock, nest_lock) _raw_spin_lock(lock) |
| 210 | # define raw_spin_lock_bh_nested(lock, subclass) _raw_spin_lock_bh(lock) | ||
| 208 | #endif | 211 | #endif |
| 209 | 212 | ||
| 210 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) | 213 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) |
| @@ -324,6 +327,11 @@ do { \ | |||
| 324 | raw_spin_lock_nested(spinlock_check(lock), subclass); \ | 327 | raw_spin_lock_nested(spinlock_check(lock), subclass); \ |
| 325 | } while (0) | 328 | } while (0) |
| 326 | 329 | ||
| 330 | #define spin_lock_bh_nested(lock, subclass) \ | ||
| 331 | do { \ | ||
| 332 | raw_spin_lock_bh_nested(spinlock_check(lock), subclass);\ | ||
| 333 | } while (0) | ||
| 334 | |||
| 327 | #define spin_lock_nest_lock(lock, nest_lock) \ | 335 | #define spin_lock_nest_lock(lock, nest_lock) \ |
| 328 | do { \ | 336 | do { \ |
| 329 | raw_spin_lock_nest_lock(spinlock_check(lock), nest_lock); \ | 337 | raw_spin_lock_nest_lock(spinlock_check(lock), nest_lock); \ |
diff --git a/include/linux/spinlock_api_smp.h b/include/linux/spinlock_api_smp.h index 42dfab89e740..5344268e6e62 100644 --- a/include/linux/spinlock_api_smp.h +++ b/include/linux/spinlock_api_smp.h | |||
| @@ -22,6 +22,8 @@ int in_lock_functions(unsigned long addr); | |||
| 22 | void __lockfunc _raw_spin_lock(raw_spinlock_t *lock) __acquires(lock); | 22 | void __lockfunc _raw_spin_lock(raw_spinlock_t *lock) __acquires(lock); |
| 23 | void __lockfunc _raw_spin_lock_nested(raw_spinlock_t *lock, int subclass) | 23 | void __lockfunc _raw_spin_lock_nested(raw_spinlock_t *lock, int subclass) |
| 24 | __acquires(lock); | 24 | __acquires(lock); |
| 25 | void __lockfunc _raw_spin_lock_bh_nested(raw_spinlock_t *lock, int subclass) | ||
| 26 | __acquires(lock); | ||
| 25 | void __lockfunc | 27 | void __lockfunc |
| 26 | _raw_spin_lock_nest_lock(raw_spinlock_t *lock, struct lockdep_map *map) | 28 | _raw_spin_lock_nest_lock(raw_spinlock_t *lock, struct lockdep_map *map) |
| 27 | __acquires(lock); | 29 | __acquires(lock); |
diff --git a/include/linux/spinlock_api_up.h b/include/linux/spinlock_api_up.h index d0d188861ad6..d3afef9d8dbe 100644 --- a/include/linux/spinlock_api_up.h +++ b/include/linux/spinlock_api_up.h | |||
| @@ -57,6 +57,7 @@ | |||
| 57 | 57 | ||
| 58 | #define _raw_spin_lock(lock) __LOCK(lock) | 58 | #define _raw_spin_lock(lock) __LOCK(lock) |
| 59 | #define _raw_spin_lock_nested(lock, subclass) __LOCK(lock) | 59 | #define _raw_spin_lock_nested(lock, subclass) __LOCK(lock) |
| 60 | #define _raw_spin_lock_bh_nested(lock, subclass) __LOCK(lock) | ||
| 60 | #define _raw_read_lock(lock) __LOCK(lock) | 61 | #define _raw_read_lock(lock) __LOCK(lock) |
| 61 | #define _raw_write_lock(lock) __LOCK(lock) | 62 | #define _raw_write_lock(lock) __LOCK(lock) |
| 62 | #define _raw_spin_lock_bh(lock) __LOCK_BH(lock) | 63 | #define _raw_spin_lock_bh(lock) __LOCK_BH(lock) |
diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h index f7b9100686c3..c0f707ac192b 100644 --- a/include/linux/ssb/ssb_regs.h +++ b/include/linux/ssb/ssb_regs.h | |||
| @@ -173,6 +173,7 @@ | |||
| 173 | #define SSB_SPROMSIZE_BYTES_R123 (SSB_SPROMSIZE_WORDS_R123 * sizeof(u16)) | 173 | #define SSB_SPROMSIZE_BYTES_R123 (SSB_SPROMSIZE_WORDS_R123 * sizeof(u16)) |
| 174 | #define SSB_SPROMSIZE_BYTES_R4 (SSB_SPROMSIZE_WORDS_R4 * sizeof(u16)) | 174 | #define SSB_SPROMSIZE_BYTES_R4 (SSB_SPROMSIZE_WORDS_R4 * sizeof(u16)) |
| 175 | #define SSB_SPROMSIZE_WORDS_R10 230 | 175 | #define SSB_SPROMSIZE_WORDS_R10 230 |
| 176 | #define SSB_SPROMSIZE_WORDS_R11 234 | ||
| 176 | #define SSB_SPROM_BASE1 0x1000 | 177 | #define SSB_SPROM_BASE1 0x1000 |
| 177 | #define SSB_SPROM_BASE31 0x0800 | 178 | #define SSB_SPROM_BASE31 0x0800 |
| 178 | #define SSB_SPROM_REVISION 0x007E | 179 | #define SSB_SPROM_REVISION 0x007E |
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 67309ece0772..1a7adb411647 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
| @@ -115,6 +115,7 @@ struct tcp_request_sock { | |||
| 115 | u32 rcv_isn; | 115 | u32 rcv_isn; |
| 116 | u32 snt_isn; | 116 | u32 snt_isn; |
| 117 | u32 snt_synack; /* synack sent time */ | 117 | u32 snt_synack; /* synack sent time */ |
| 118 | u32 last_oow_ack_time; /* last SYNACK */ | ||
| 118 | u32 rcv_nxt; /* the ack # by SYNACK. For | 119 | u32 rcv_nxt; /* the ack # by SYNACK. For |
| 119 | * FastOpen it's the seq# | 120 | * FastOpen it's the seq# |
| 120 | * after data-in-SYN. | 121 | * after data-in-SYN. |
| @@ -152,6 +153,7 @@ struct tcp_sock { | |||
| 152 | u32 snd_sml; /* Last byte of the most recently transmitted small packet */ | 153 | u32 snd_sml; /* Last byte of the most recently transmitted small packet */ |
| 153 | u32 rcv_tstamp; /* timestamp of last received ACK (for keepalives) */ | 154 | u32 rcv_tstamp; /* timestamp of last received ACK (for keepalives) */ |
| 154 | u32 lsndtime; /* timestamp of last sent data packet (for restart window) */ | 155 | u32 lsndtime; /* timestamp of last sent data packet (for restart window) */ |
| 156 | u32 last_oow_ack_time; /* timestamp of last out-of-window ACK */ | ||
| 155 | 157 | ||
| 156 | u32 tsoffset; /* timestamp offset */ | 158 | u32 tsoffset; /* timestamp offset */ |
| 157 | 159 | ||
| @@ -340,6 +342,10 @@ struct tcp_timewait_sock { | |||
| 340 | u32 tw_rcv_wnd; | 342 | u32 tw_rcv_wnd; |
| 341 | u32 tw_ts_offset; | 343 | u32 tw_ts_offset; |
| 342 | u32 tw_ts_recent; | 344 | u32 tw_ts_recent; |
| 345 | |||
| 346 | /* The time we sent the last out-of-window ACK: */ | ||
| 347 | u32 tw_last_oow_ack_time; | ||
| 348 | |||
| 343 | long tw_ts_recent_stamp; | 349 | long tw_ts_recent_stamp; |
| 344 | #ifdef CONFIG_TCP_MD5SIG | 350 | #ifdef CONFIG_TCP_MD5SIG |
| 345 | struct tcp_md5sig_key *tw_md5_key; | 351 | struct tcp_md5sig_key *tw_md5_key; |
diff --git a/include/linux/timecounter.h b/include/linux/timecounter.h new file mode 100644 index 000000000000..4382035a75bb --- /dev/null +++ b/include/linux/timecounter.h | |||
| @@ -0,0 +1,139 @@ | |||
| 1 | /* | ||
| 2 | * linux/include/linux/timecounter.h | ||
| 3 | * | ||
| 4 | * based on code that migrated away from | ||
| 5 | * linux/include/linux/clocksource.h | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | */ | ||
| 17 | #ifndef _LINUX_TIMECOUNTER_H | ||
| 18 | #define _LINUX_TIMECOUNTER_H | ||
| 19 | |||
| 20 | #include <linux/types.h> | ||
| 21 | |||
| 22 | /* simplify initialization of mask field */ | ||
| 23 | #define CYCLECOUNTER_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1) | ||
| 24 | |||
| 25 | /** | ||
| 26 | * struct cyclecounter - hardware abstraction for a free running counter | ||
| 27 | * Provides completely state-free accessors to the underlying hardware. | ||
| 28 | * Depending on which hardware it reads, the cycle counter may wrap | ||
| 29 | * around quickly. Locking rules (if necessary) have to be defined | ||
| 30 | * by the implementor and user of specific instances of this API. | ||
| 31 | * | ||
| 32 | * @read: returns the current cycle value | ||
| 33 | * @mask: bitmask for two's complement | ||
| 34 | * subtraction of non 64 bit counters, | ||
| 35 | * see CYCLECOUNTER_MASK() helper macro | ||
| 36 | * @mult: cycle to nanosecond multiplier | ||
| 37 | * @shift: cycle to nanosecond divisor (power of two) | ||
| 38 | */ | ||
| 39 | struct cyclecounter { | ||
| 40 | cycle_t (*read)(const struct cyclecounter *cc); | ||
| 41 | cycle_t mask; | ||
| 42 | u32 mult; | ||
| 43 | u32 shift; | ||
| 44 | }; | ||
| 45 | |||
| 46 | /** | ||
| 47 | * struct timecounter - layer above a %struct cyclecounter which counts nanoseconds | ||
| 48 | * Contains the state needed by timecounter_read() to detect | ||
| 49 | * cycle counter wrap around. Initialize with | ||
| 50 | * timecounter_init(). Also used to convert cycle counts into the | ||
| 51 | * corresponding nanosecond counts with timecounter_cyc2time(). Users | ||
| 52 | * of this code are responsible for initializing the underlying | ||
| 53 | * cycle counter hardware, locking issues and reading the time | ||
| 54 | * more often than the cycle counter wraps around. The nanosecond | ||
| 55 | * counter will only wrap around after ~585 years. | ||
| 56 | * | ||
| 57 | * @cc: the cycle counter used by this instance | ||
| 58 | * @cycle_last: most recent cycle counter value seen by | ||
| 59 | * timecounter_read() | ||
| 60 | * @nsec: continuously increasing count | ||
| 61 | * @mask: bit mask for maintaining the 'frac' field | ||
| 62 | * @frac: accumulated fractional nanoseconds | ||
| 63 | */ | ||
| 64 | struct timecounter { | ||
| 65 | const struct cyclecounter *cc; | ||
| 66 | cycle_t cycle_last; | ||
| 67 | u64 nsec; | ||
| 68 | u64 mask; | ||
| 69 | u64 frac; | ||
| 70 | }; | ||
| 71 | |||
| 72 | /** | ||
| 73 | * cyclecounter_cyc2ns - converts cycle counter cycles to nanoseconds | ||
| 74 | * @cc: Pointer to cycle counter. | ||
| 75 | * @cycles: Cycles | ||
| 76 | * @mask: bit mask for maintaining the 'frac' field | ||
| 77 | * @frac: pointer to storage for the fractional nanoseconds. | ||
| 78 | */ | ||
| 79 | static inline u64 cyclecounter_cyc2ns(const struct cyclecounter *cc, | ||
| 80 | cycle_t cycles, u64 mask, u64 *frac) | ||
| 81 | { | ||
| 82 | u64 ns = (u64) cycles; | ||
| 83 | |||
| 84 | ns = (ns * cc->mult) + *frac; | ||
| 85 | *frac = ns & mask; | ||
| 86 | return ns >> cc->shift; | ||
| 87 | } | ||
| 88 | |||
| 89 | /** | ||
| 90 | * timecounter_adjtime - Shifts the time of the clock. | ||
| 91 | * @delta: Desired change in nanoseconds. | ||
| 92 | */ | ||
| 93 | static inline void timecounter_adjtime(struct timecounter *tc, s64 delta) | ||
| 94 | { | ||
| 95 | tc->nsec += delta; | ||
| 96 | } | ||
| 97 | |||
| 98 | /** | ||
| 99 | * timecounter_init - initialize a time counter | ||
| 100 | * @tc: Pointer to time counter which is to be initialized/reset | ||
| 101 | * @cc: A cycle counter, ready to be used. | ||
| 102 | * @start_tstamp: Arbitrary initial time stamp. | ||
| 103 | * | ||
| 104 | * After this call the current cycle register (roughly) corresponds to | ||
| 105 | * the initial time stamp. Every call to timecounter_read() increments | ||
| 106 | * the time stamp counter by the number of elapsed nanoseconds. | ||
| 107 | */ | ||
| 108 | extern void timecounter_init(struct timecounter *tc, | ||
| 109 | const struct cyclecounter *cc, | ||
| 110 | u64 start_tstamp); | ||
| 111 | |||
| 112 | /** | ||
| 113 | * timecounter_read - return nanoseconds elapsed since timecounter_init() | ||
| 114 | * plus the initial time stamp | ||
| 115 | * @tc: Pointer to time counter. | ||
| 116 | * | ||
| 117 | * In other words, keeps track of time since the same epoch as | ||
| 118 | * the function which generated the initial time stamp. | ||
| 119 | */ | ||
| 120 | extern u64 timecounter_read(struct timecounter *tc); | ||
| 121 | |||
| 122 | /** | ||
| 123 | * timecounter_cyc2time - convert a cycle counter to same | ||
| 124 | * time base as values returned by | ||
| 125 | * timecounter_read() | ||
| 126 | * @tc: Pointer to time counter. | ||
| 127 | * @cycle_tstamp: a value returned by tc->cc->read() | ||
| 128 | * | ||
| 129 | * Cycle counts that are converted correctly as long as they | ||
| 130 | * fall into the interval [-1/2 max cycle count, +1/2 max cycle count], | ||
| 131 | * with "max cycle count" == cs->mask+1. | ||
| 132 | * | ||
| 133 | * This allows conversion of cycle counter values which were generated | ||
| 134 | * in the past. | ||
| 135 | */ | ||
| 136 | extern u64 timecounter_cyc2time(struct timecounter *tc, | ||
| 137 | cycle_t cycle_tstamp); | ||
| 138 | |||
| 139 | #endif | ||
diff --git a/include/linux/types.h b/include/linux/types.h index a0bb7048687f..62323825cff9 100644 --- a/include/linux/types.h +++ b/include/linux/types.h | |||
| @@ -213,5 +213,8 @@ struct callback_head { | |||
| 213 | }; | 213 | }; |
| 214 | #define rcu_head callback_head | 214 | #define rcu_head callback_head |
| 215 | 215 | ||
| 216 | /* clocksource cycle base type */ | ||
| 217 | typedef u64 cycle_t; | ||
| 218 | |||
| 216 | #endif /* __ASSEMBLY__ */ | 219 | #endif /* __ASSEMBLY__ */ |
| 217 | #endif /* _LINUX_TYPES_H */ | 220 | #endif /* _LINUX_TYPES_H */ |
diff --git a/include/linux/udp.h b/include/linux/udp.h index ee3277593222..247cfdcc4b08 100644 --- a/include/linux/udp.h +++ b/include/linux/udp.h | |||
| @@ -49,11 +49,7 @@ struct udp_sock { | |||
| 49 | unsigned int corkflag; /* Cork is required */ | 49 | unsigned int corkflag; /* Cork is required */ |
| 50 | __u8 encap_type; /* Is this an Encapsulation socket? */ | 50 | __u8 encap_type; /* Is this an Encapsulation socket? */ |
| 51 | unsigned char no_check6_tx:1,/* Send zero UDP6 checksums on TX? */ | 51 | unsigned char no_check6_tx:1,/* Send zero UDP6 checksums on TX? */ |
| 52 | no_check6_rx:1,/* Allow zero UDP6 checksums on RX? */ | 52 | no_check6_rx:1;/* Allow zero UDP6 checksums on RX? */ |
| 53 | convert_csum:1;/* On receive, convert checksum | ||
| 54 | * unnecessary to checksum complete | ||
| 55 | * if possible. | ||
| 56 | */ | ||
| 57 | /* | 53 | /* |
| 58 | * Following member retains the information to create a UDP header | 54 | * Following member retains the information to create a UDP header |
| 59 | * when the socket is uncorked. | 55 | * when the socket is uncorked. |
| @@ -102,16 +98,6 @@ static inline bool udp_get_no_check6_rx(struct sock *sk) | |||
| 102 | return udp_sk(sk)->no_check6_rx; | 98 | return udp_sk(sk)->no_check6_rx; |
| 103 | } | 99 | } |
| 104 | 100 | ||
| 105 | static inline void udp_set_convert_csum(struct sock *sk, bool val) | ||
| 106 | { | ||
| 107 | udp_sk(sk)->convert_csum = val; | ||
| 108 | } | ||
| 109 | |||
| 110 | static inline bool udp_get_convert_csum(struct sock *sk) | ||
| 111 | { | ||
| 112 | return udp_sk(sk)->convert_csum; | ||
| 113 | } | ||
| 114 | |||
| 115 | #define udp_portaddr_for_each_entry(__sk, node, list) \ | 101 | #define udp_portaddr_for_each_entry(__sk, node, list) \ |
| 116 | hlist_nulls_for_each_entry(__sk, node, list, __sk_common.skc_portaddr_node) | 102 | hlist_nulls_for_each_entry(__sk, node, list, __sk_common.skc_portaddr_node) |
| 117 | 103 | ||
diff --git a/include/linux/uio.h b/include/linux/uio.h index 1c5e453f7ea9..3e0cb4ea3905 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h | |||
| @@ -135,10 +135,4 @@ static inline void iov_iter_reexpand(struct iov_iter *i, size_t count) | |||
| 135 | size_t csum_and_copy_to_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i); | 135 | size_t csum_and_copy_to_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i); |
| 136 | size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i); | 136 | size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i); |
| 137 | 137 | ||
| 138 | int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); | ||
| 139 | int memcpy_fromiovecend(unsigned char *kdata, const struct iovec *iov, | ||
| 140 | int offset, int len); | ||
| 141 | int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata, | ||
| 142 | int offset, int len); | ||
| 143 | |||
| 144 | #endif | 138 | #endif |
diff --git a/include/linux/vmw_vmci_api.h b/include/linux/vmw_vmci_api.h index 5691f752ce8f..63df3a2a8ce5 100644 --- a/include/linux/vmw_vmci_api.h +++ b/include/linux/vmw_vmci_api.h | |||
| @@ -74,7 +74,7 @@ ssize_t vmci_qpair_dequeue(struct vmci_qp *qpair, | |||
| 74 | ssize_t vmci_qpair_peek(struct vmci_qp *qpair, void *buf, size_t buf_size, | 74 | ssize_t vmci_qpair_peek(struct vmci_qp *qpair, void *buf, size_t buf_size, |
| 75 | int mode); | 75 | int mode); |
| 76 | ssize_t vmci_qpair_enquev(struct vmci_qp *qpair, | 76 | ssize_t vmci_qpair_enquev(struct vmci_qp *qpair, |
| 77 | void *iov, size_t iov_size, int mode); | 77 | struct msghdr *msg, size_t iov_size, int mode); |
| 78 | ssize_t vmci_qpair_dequev(struct vmci_qp *qpair, | 78 | ssize_t vmci_qpair_dequev(struct vmci_qp *qpair, |
| 79 | struct msghdr *msg, size_t iov_size, int mode); | 79 | struct msghdr *msg, size_t iov_size, int mode); |
| 80 | ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, struct msghdr *msg, size_t iov_size, | 80 | ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, struct msghdr *msg, size_t iov_size, |
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index d13573bb879e..80456f72d70a 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h | |||
| @@ -62,6 +62,9 @@ int addrconf_set_dstaddr(struct net *net, void __user *arg); | |||
| 62 | 62 | ||
| 63 | int ipv6_chk_addr(struct net *net, const struct in6_addr *addr, | 63 | int ipv6_chk_addr(struct net *net, const struct in6_addr *addr, |
| 64 | const struct net_device *dev, int strict); | 64 | const struct net_device *dev, int strict); |
| 65 | int ipv6_chk_addr_and_flags(struct net *net, const struct in6_addr *addr, | ||
| 66 | const struct net_device *dev, int strict, | ||
| 67 | u32 banned_flags); | ||
| 65 | 68 | ||
| 66 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) | 69 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
| 67 | int ipv6_chk_home_addr(struct net *net, const struct in6_addr *addr); | 70 | int ipv6_chk_home_addr(struct net *net, const struct in6_addr *addr); |
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 58695ffeb138..e00455aab18c 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h | |||
| @@ -273,7 +273,7 @@ struct l2cap_ctrl { | |||
| 273 | 273 | ||
| 274 | struct hci_dev; | 274 | struct hci_dev; |
| 275 | 275 | ||
| 276 | typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status); | 276 | typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status, u16 opcode); |
| 277 | 277 | ||
| 278 | struct hci_req_ctrl { | 278 | struct hci_req_ctrl { |
| 279 | bool start; | 279 | bool start; |
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 40129b3838b2..8e54f825153c 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
| @@ -102,6 +102,28 @@ enum { | |||
| 102 | */ | 102 | */ |
| 103 | HCI_QUIRK_FIXUP_BUFFER_SIZE, | 103 | HCI_QUIRK_FIXUP_BUFFER_SIZE, |
| 104 | 104 | ||
| 105 | /* When this quirk is set, then a controller that does not | ||
| 106 | * indicate support for Inquiry Result with RSSI is assumed to | ||
| 107 | * support it anyway. Some early Bluetooth 1.2 controllers had | ||
| 108 | * wrongly configured local features that will require forcing | ||
| 109 | * them to enable this mode. Getting RSSI information with the | ||
| 110 | * inquiry responses is preferred since it allows for a better | ||
| 111 | * user expierence. | ||
| 112 | * | ||
| 113 | * This quirk must be set before hci_register_dev is called. | ||
| 114 | */ | ||
| 115 | HCI_QUIRK_FIXUP_INQUIRY_MODE, | ||
| 116 | |||
| 117 | /* When this quirk is set, then the HCI Read Local Supported | ||
| 118 | * Commands command is not supported. In general Bluetooth 1.2 | ||
| 119 | * and later controllers should support this command. However | ||
| 120 | * some controllers indicate Bluetooth 1.2 support, but do | ||
| 121 | * not support this command. | ||
| 122 | * | ||
| 123 | * This quirk must be set before hci_register_dev is called. | ||
| 124 | */ | ||
| 125 | HCI_QUIRK_BROKEN_LOCAL_COMMANDS, | ||
| 126 | |||
| 105 | /* When this quirk is set, then no stored link key handling | 127 | /* When this quirk is set, then no stored link key handling |
| 106 | * is performed. This is mainly due to the fact that the | 128 | * is performed. This is mainly due to the fact that the |
| 107 | * HCI Delete Stored Link Key command is advertised, but | 129 | * HCI Delete Stored Link Key command is advertised, but |
| @@ -162,8 +184,7 @@ enum { | |||
| 162 | */ | 184 | */ |
| 163 | enum { | 185 | enum { |
| 164 | HCI_DUT_MODE, | 186 | HCI_DUT_MODE, |
| 165 | HCI_FORCE_SC, | 187 | HCI_FORCE_BREDR_SMP, |
| 166 | HCI_FORCE_LESC, | ||
| 167 | HCI_FORCE_STATIC_ADDR, | 188 | HCI_FORCE_STATIC_ADDR, |
| 168 | }; | 189 | }; |
| 169 | 190 | ||
| @@ -343,6 +364,7 @@ enum { | |||
| 343 | #define HCI_LE_ENCRYPTION 0x01 | 364 | #define HCI_LE_ENCRYPTION 0x01 |
| 344 | #define HCI_LE_CONN_PARAM_REQ_PROC 0x02 | 365 | #define HCI_LE_CONN_PARAM_REQ_PROC 0x02 |
| 345 | #define HCI_LE_PING 0x10 | 366 | #define HCI_LE_PING 0x10 |
| 367 | #define HCI_LE_DATA_LEN_EXT 0x20 | ||
| 346 | #define HCI_LE_EXT_SCAN_POLICY 0x80 | 368 | #define HCI_LE_EXT_SCAN_POLICY 0x80 |
| 347 | 369 | ||
| 348 | /* Connection modes */ | 370 | /* Connection modes */ |
| @@ -833,11 +855,26 @@ struct hci_cp_set_event_flt { | |||
| 833 | #define HCI_CONN_SETUP_AUTO_OFF 0x01 | 855 | #define HCI_CONN_SETUP_AUTO_OFF 0x01 |
| 834 | #define HCI_CONN_SETUP_AUTO_ON 0x02 | 856 | #define HCI_CONN_SETUP_AUTO_ON 0x02 |
| 835 | 857 | ||
| 858 | #define HCI_OP_READ_STORED_LINK_KEY 0x0c0d | ||
| 859 | struct hci_cp_read_stored_link_key { | ||
| 860 | bdaddr_t bdaddr; | ||
| 861 | __u8 read_all; | ||
| 862 | } __packed; | ||
| 863 | struct hci_rp_read_stored_link_key { | ||
| 864 | __u8 status; | ||
| 865 | __u8 max_keys; | ||
| 866 | __u8 num_keys; | ||
| 867 | } __packed; | ||
| 868 | |||
| 836 | #define HCI_OP_DELETE_STORED_LINK_KEY 0x0c12 | 869 | #define HCI_OP_DELETE_STORED_LINK_KEY 0x0c12 |
| 837 | struct hci_cp_delete_stored_link_key { | 870 | struct hci_cp_delete_stored_link_key { |
| 838 | bdaddr_t bdaddr; | 871 | bdaddr_t bdaddr; |
| 839 | __u8 delete_all; | 872 | __u8 delete_all; |
| 840 | } __packed; | 873 | } __packed; |
| 874 | struct hci_rp_delete_stored_link_key { | ||
| 875 | __u8 status; | ||
| 876 | __u8 num_keys; | ||
| 877 | } __packed; | ||
| 841 | 878 | ||
| 842 | #define HCI_MAX_NAME_LENGTH 248 | 879 | #define HCI_MAX_NAME_LENGTH 248 |
| 843 | 880 | ||
| @@ -1371,6 +1408,39 @@ struct hci_cp_le_conn_param_req_neg_reply { | |||
| 1371 | __u8 reason; | 1408 | __u8 reason; |
| 1372 | } __packed; | 1409 | } __packed; |
| 1373 | 1410 | ||
| 1411 | #define HCI_OP_LE_SET_DATA_LEN 0x2022 | ||
| 1412 | struct hci_cp_le_set_data_len { | ||
| 1413 | __le16 handle; | ||
| 1414 | __le16 tx_len; | ||
| 1415 | __le16 tx_time; | ||
| 1416 | } __packed; | ||
| 1417 | struct hci_rp_le_set_data_len { | ||
| 1418 | __u8 status; | ||
| 1419 | __le16 handle; | ||
| 1420 | } __packed; | ||
| 1421 | |||
| 1422 | #define HCI_OP_LE_READ_DEF_DATA_LEN 0x2023 | ||
| 1423 | struct hci_rp_le_read_def_data_len { | ||
| 1424 | __u8 status; | ||
| 1425 | __le16 tx_len; | ||
| 1426 | __le16 tx_time; | ||
| 1427 | } __packed; | ||
| 1428 | |||
| 1429 | #define HCI_OP_LE_WRITE_DEF_DATA_LEN 0x2024 | ||
| 1430 | struct hci_cp_le_write_def_data_len { | ||
| 1431 | __le16 tx_len; | ||
| 1432 | __le16 tx_time; | ||
| 1433 | } __packed; | ||
| 1434 | |||
| 1435 | #define HCI_OP_LE_READ_MAX_DATA_LEN 0x202f | ||
| 1436 | struct hci_rp_le_read_max_data_len { | ||
| 1437 | __u8 status; | ||
| 1438 | __le16 tx_len; | ||
| 1439 | __le16 tx_time; | ||
| 1440 | __le16 rx_len; | ||
| 1441 | __le16 rx_time; | ||
| 1442 | } __packed; | ||
| 1443 | |||
| 1374 | /* ---- HCI Events ---- */ | 1444 | /* ---- HCI Events ---- */ |
| 1375 | #define HCI_EV_INQUIRY_COMPLETE 0x01 | 1445 | #define HCI_EV_INQUIRY_COMPLETE 0x01 |
| 1376 | 1446 | ||
| @@ -1796,6 +1866,15 @@ struct hci_ev_le_remote_conn_param_req { | |||
| 1796 | __le16 timeout; | 1866 | __le16 timeout; |
| 1797 | } __packed; | 1867 | } __packed; |
| 1798 | 1868 | ||
| 1869 | #define HCI_EV_LE_DATA_LEN_CHANGE 0x07 | ||
| 1870 | struct hci_ev_le_data_len_change { | ||
| 1871 | __le16 handle; | ||
| 1872 | __le16 tx_len; | ||
| 1873 | __le16 tx_time; | ||
| 1874 | __le16 rx_len; | ||
| 1875 | __le16 rx_time; | ||
| 1876 | } __packed; | ||
| 1877 | |||
| 1799 | #define HCI_EV_LE_DIRECT_ADV_REPORT 0x0B | 1878 | #define HCI_EV_LE_DIRECT_ADV_REPORT 0x0B |
| 1800 | struct hci_ev_le_direct_adv_info { | 1879 | struct hci_ev_le_direct_adv_info { |
| 1801 | __u8 evt_type; | 1880 | __u8 evt_type; |
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 3c7827005c25..52863c3e0b13 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
| @@ -79,6 +79,8 @@ struct discovery_state { | |||
| 79 | s8 rssi; | 79 | s8 rssi; |
| 80 | u16 uuid_count; | 80 | u16 uuid_count; |
| 81 | u8 (*uuids)[16]; | 81 | u8 (*uuids)[16]; |
| 82 | unsigned long scan_start; | ||
| 83 | unsigned long scan_duration; | ||
| 82 | }; | 84 | }; |
| 83 | 85 | ||
| 84 | struct hci_conn_hash { | 86 | struct hci_conn_hash { |
| @@ -145,6 +147,7 @@ struct oob_data { | |||
| 145 | struct list_head list; | 147 | struct list_head list; |
| 146 | bdaddr_t bdaddr; | 148 | bdaddr_t bdaddr; |
| 147 | u8 bdaddr_type; | 149 | u8 bdaddr_type; |
| 150 | u8 present; | ||
| 148 | u8 hash192[16]; | 151 | u8 hash192[16]; |
| 149 | u8 rand192[16]; | 152 | u8 rand192[16]; |
| 150 | u8 hash256[16]; | 153 | u8 hash256[16]; |
| @@ -205,6 +208,8 @@ struct hci_dev { | |||
| 205 | __u16 lmp_subver; | 208 | __u16 lmp_subver; |
| 206 | __u16 voice_setting; | 209 | __u16 voice_setting; |
| 207 | __u8 num_iac; | 210 | __u8 num_iac; |
| 211 | __u8 stored_max_keys; | ||
| 212 | __u8 stored_num_keys; | ||
| 208 | __u8 io_capability; | 213 | __u8 io_capability; |
| 209 | __s8 inq_tx_power; | 214 | __s8 inq_tx_power; |
| 210 | __u16 page_scan_interval; | 215 | __u16 page_scan_interval; |
| @@ -220,10 +225,17 @@ struct hci_dev { | |||
| 220 | __u16 le_conn_max_interval; | 225 | __u16 le_conn_max_interval; |
| 221 | __u16 le_conn_latency; | 226 | __u16 le_conn_latency; |
| 222 | __u16 le_supv_timeout; | 227 | __u16 le_supv_timeout; |
| 228 | __u16 le_def_tx_len; | ||
| 229 | __u16 le_def_tx_time; | ||
| 230 | __u16 le_max_tx_len; | ||
| 231 | __u16 le_max_tx_time; | ||
| 232 | __u16 le_max_rx_len; | ||
| 233 | __u16 le_max_rx_time; | ||
| 223 | __u16 discov_interleaved_timeout; | 234 | __u16 discov_interleaved_timeout; |
| 224 | __u16 conn_info_min_age; | 235 | __u16 conn_info_min_age; |
| 225 | __u16 conn_info_max_age; | 236 | __u16 conn_info_max_age; |
| 226 | __u8 ssp_debug_mode; | 237 | __u8 ssp_debug_mode; |
| 238 | __u8 hw_error_code; | ||
| 227 | __u32 clock; | 239 | __u32 clock; |
| 228 | 240 | ||
| 229 | __u16 devid_source; | 241 | __u16 devid_source; |
| @@ -285,6 +297,7 @@ struct hci_dev { | |||
| 285 | 297 | ||
| 286 | struct work_struct power_on; | 298 | struct work_struct power_on; |
| 287 | struct delayed_work power_off; | 299 | struct delayed_work power_off; |
| 300 | struct work_struct error_reset; | ||
| 288 | 301 | ||
| 289 | __u16 discov_timeout; | 302 | __u16 discov_timeout; |
| 290 | struct delayed_work discov_off; | 303 | struct delayed_work discov_off; |
| @@ -343,6 +356,7 @@ struct hci_dev { | |||
| 343 | unsigned long dev_flags; | 356 | unsigned long dev_flags; |
| 344 | 357 | ||
| 345 | struct delayed_work le_scan_disable; | 358 | struct delayed_work le_scan_disable; |
| 359 | struct delayed_work le_scan_restart; | ||
| 346 | 360 | ||
| 347 | __s8 adv_tx_power; | 361 | __s8 adv_tx_power; |
| 348 | __u8 adv_data[HCI_MAX_AD_LENGTH]; | 362 | __u8 adv_data[HCI_MAX_AD_LENGTH]; |
| @@ -361,6 +375,7 @@ struct hci_dev { | |||
| 361 | int (*setup)(struct hci_dev *hdev); | 375 | int (*setup)(struct hci_dev *hdev); |
| 362 | int (*send)(struct hci_dev *hdev, struct sk_buff *skb); | 376 | int (*send)(struct hci_dev *hdev, struct sk_buff *skb); |
| 363 | void (*notify)(struct hci_dev *hdev, unsigned int evt); | 377 | void (*notify)(struct hci_dev *hdev, unsigned int evt); |
| 378 | void (*hw_error)(struct hci_dev *hdev, u8 code); | ||
| 364 | int (*set_bdaddr)(struct hci_dev *hdev, const bdaddr_t *bdaddr); | 379 | int (*set_bdaddr)(struct hci_dev *hdev, const bdaddr_t *bdaddr); |
| 365 | }; | 380 | }; |
| 366 | 381 | ||
| @@ -434,6 +449,7 @@ struct hci_conn { | |||
| 434 | struct delayed_work le_conn_timeout; | 449 | struct delayed_work le_conn_timeout; |
| 435 | 450 | ||
| 436 | struct device dev; | 451 | struct device dev; |
| 452 | struct dentry *debugfs; | ||
| 437 | 453 | ||
| 438 | struct hci_dev *hdev; | 454 | struct hci_dev *hdev; |
| 439 | void *l2cap_data; | 455 | void *l2cap_data; |
| @@ -518,6 +534,8 @@ static inline void hci_discovery_filter_clear(struct hci_dev *hdev) | |||
| 518 | hdev->discovery.uuid_count = 0; | 534 | hdev->discovery.uuid_count = 0; |
| 519 | kfree(hdev->discovery.uuids); | 535 | kfree(hdev->discovery.uuids); |
| 520 | hdev->discovery.uuids = NULL; | 536 | hdev->discovery.uuids = NULL; |
| 537 | hdev->discovery.scan_start = 0; | ||
| 538 | hdev->discovery.scan_duration = 0; | ||
| 521 | } | 539 | } |
| 522 | 540 | ||
| 523 | bool hci_discovery_active(struct hci_dev *hdev); | 541 | bool hci_discovery_active(struct hci_dev *hdev); |
| @@ -772,7 +790,6 @@ int hci_conn_check_link_mode(struct hci_conn *conn); | |||
| 772 | int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level); | 790 | int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level); |
| 773 | int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type, | 791 | int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type, |
| 774 | bool initiator); | 792 | bool initiator); |
| 775 | int hci_conn_change_link_key(struct hci_conn *conn); | ||
| 776 | int hci_conn_switch_role(struct hci_conn *conn, __u8 role); | 793 | int hci_conn_switch_role(struct hci_conn *conn, __u8 role); |
| 777 | 794 | ||
| 778 | void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active); | 795 | void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active); |
| @@ -920,8 +937,6 @@ struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev, | |||
| 920 | bdaddr_t *addr, u8 addr_type); | 937 | bdaddr_t *addr, u8 addr_type); |
| 921 | struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev, | 938 | struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev, |
| 922 | bdaddr_t *addr, u8 addr_type); | 939 | bdaddr_t *addr, u8 addr_type); |
| 923 | int hci_conn_params_set(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type, | ||
| 924 | u8 auto_connect); | ||
| 925 | void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type); | 940 | void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type); |
| 926 | void hci_conn_params_clear_all(struct hci_dev *hdev); | 941 | void hci_conn_params_clear_all(struct hci_dev *hdev); |
| 927 | void hci_conn_params_clear_disabled(struct hci_dev *hdev); | 942 | void hci_conn_params_clear_disabled(struct hci_dev *hdev); |
| @@ -930,8 +945,6 @@ struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list, | |||
| 930 | bdaddr_t *addr, | 945 | bdaddr_t *addr, |
| 931 | u8 addr_type); | 946 | u8 addr_type); |
| 932 | 947 | ||
| 933 | void hci_update_background_scan(struct hci_dev *hdev); | ||
| 934 | |||
| 935 | void hci_uuids_clear(struct hci_dev *hdev); | 948 | void hci_uuids_clear(struct hci_dev *hdev); |
| 936 | 949 | ||
| 937 | void hci_link_keys_clear(struct hci_dev *hdev); | 950 | void hci_link_keys_clear(struct hci_dev *hdev); |
| @@ -1014,8 +1027,7 @@ void hci_conn_del_sysfs(struct hci_conn *conn); | |||
| 1014 | 1027 | ||
| 1015 | #define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \ | 1028 | #define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \ |
| 1016 | !test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) | 1029 | !test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) |
| 1017 | #define bredr_sc_enabled(dev) ((lmp_sc_capable(dev) || \ | 1030 | #define bredr_sc_enabled(dev) (lmp_sc_capable(dev) && \ |
| 1018 | test_bit(HCI_FORCE_SC, &(dev)->dbg_flags)) && \ | ||
| 1019 | test_bit(HCI_SC_ENABLED, &(dev)->dev_flags)) | 1031 | test_bit(HCI_SC_ENABLED, &(dev)->dev_flags)) |
| 1020 | 1032 | ||
| 1021 | /* ----- HCI protocols ----- */ | 1033 | /* ----- HCI protocols ----- */ |
| @@ -1284,30 +1296,8 @@ static inline int hci_check_conn_params(u16 min, u16 max, u16 latency, | |||
| 1284 | int hci_register_cb(struct hci_cb *hcb); | 1296 | int hci_register_cb(struct hci_cb *hcb); |
| 1285 | int hci_unregister_cb(struct hci_cb *hcb); | 1297 | int hci_unregister_cb(struct hci_cb *hcb); |
| 1286 | 1298 | ||
| 1287 | struct hci_request { | ||
| 1288 | struct hci_dev *hdev; | ||
| 1289 | struct sk_buff_head cmd_q; | ||
| 1290 | |||
| 1291 | /* If something goes wrong when building the HCI request, the error | ||
| 1292 | * value is stored in this field. | ||
| 1293 | */ | ||
| 1294 | int err; | ||
| 1295 | }; | ||
| 1296 | |||
| 1297 | void hci_req_init(struct hci_request *req, struct hci_dev *hdev); | ||
| 1298 | int hci_req_run(struct hci_request *req, hci_req_complete_t complete); | ||
| 1299 | void hci_req_add(struct hci_request *req, u16 opcode, u32 plen, | ||
| 1300 | const void *param); | ||
| 1301 | void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen, | ||
| 1302 | const void *param, u8 event); | ||
| 1303 | void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status); | ||
| 1304 | bool hci_req_pending(struct hci_dev *hdev); | 1299 | bool hci_req_pending(struct hci_dev *hdev); |
| 1305 | 1300 | ||
| 1306 | void hci_req_add_le_scan_disable(struct hci_request *req); | ||
| 1307 | void hci_req_add_le_passive_scan(struct hci_request *req); | ||
| 1308 | |||
| 1309 | void hci_update_page_scan(struct hci_dev *hdev, struct hci_request *req); | ||
| 1310 | |||
| 1311 | struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, | 1301 | struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, |
| 1312 | const void *param, u32 timeout); | 1302 | const void *param, u32 timeout); |
| 1313 | struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen, | 1303 | struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen, |
| @@ -1344,6 +1334,7 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event); | |||
| 1344 | #define DISCOV_INTERLEAVED_TIMEOUT 5120 /* msec */ | 1334 | #define DISCOV_INTERLEAVED_TIMEOUT 5120 /* msec */ |
| 1345 | #define DISCOV_INTERLEAVED_INQUIRY_LEN 0x04 | 1335 | #define DISCOV_INTERLEAVED_INQUIRY_LEN 0x04 |
| 1346 | #define DISCOV_BREDR_INQUIRY_LEN 0x08 | 1336 | #define DISCOV_BREDR_INQUIRY_LEN 0x08 |
| 1337 | #define DISCOV_LE_RESTART_DELAY msecs_to_jiffies(200) /* msec */ | ||
| 1347 | 1338 | ||
| 1348 | int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); | 1339 | int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); |
| 1349 | int mgmt_new_settings(struct hci_dev *hdev); | 1340 | int mgmt_new_settings(struct hci_dev *hdev); |
| @@ -1388,7 +1379,6 @@ int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr, | |||
| 1388 | void mgmt_auth_failed(struct hci_conn *conn, u8 status); | 1379 | void mgmt_auth_failed(struct hci_conn *conn, u8 status); |
| 1389 | void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status); | 1380 | void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status); |
| 1390 | void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); | 1381 | void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); |
| 1391 | void mgmt_sc_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); | ||
| 1392 | void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, | 1382 | void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, |
| 1393 | u8 status); | 1383 | u8 status); |
| 1394 | void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status); | 1384 | void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status); |
| @@ -1417,8 +1407,6 @@ u8 hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, u16 latency, | |||
| 1417 | void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __le64 rand, | 1407 | void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __le64 rand, |
| 1418 | __u8 ltk[16]); | 1408 | __u8 ltk[16]); |
| 1419 | 1409 | ||
| 1420 | int hci_update_random_address(struct hci_request *req, bool require_privacy, | ||
| 1421 | u8 *own_addr_type); | ||
| 1422 | void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr, | 1410 | void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr, |
| 1423 | u8 *bdaddr_type); | 1411 | u8 *bdaddr_type); |
| 1424 | 1412 | ||
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index d1bb342d083f..2239a3753092 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
| @@ -248,6 +248,7 @@ struct l2cap_conn_rsp { | |||
| 248 | #define L2CAP_PSM_SDP 0x0001 | 248 | #define L2CAP_PSM_SDP 0x0001 |
| 249 | #define L2CAP_PSM_RFCOMM 0x0003 | 249 | #define L2CAP_PSM_RFCOMM 0x0003 |
| 250 | #define L2CAP_PSM_3DSP 0x0021 | 250 | #define L2CAP_PSM_3DSP 0x0021 |
| 251 | #define L2CAP_PSM_IPSP 0x0023 /* 6LoWPAN */ | ||
| 251 | 252 | ||
| 252 | /* channel identifier */ | 253 | /* channel identifier */ |
| 253 | #define L2CAP_CID_SIGNALING 0x0001 | 254 | #define L2CAP_CID_SIGNALING 0x0001 |
diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h index 95c34d5180fa..e218a30f2061 100644 --- a/include/net/bluetooth/mgmt.h +++ b/include/net/bluetooth/mgmt.h | |||
| @@ -301,10 +301,6 @@ struct mgmt_cp_user_passkey_neg_reply { | |||
| 301 | #define MGMT_OP_READ_LOCAL_OOB_DATA 0x0020 | 301 | #define MGMT_OP_READ_LOCAL_OOB_DATA 0x0020 |
| 302 | #define MGMT_READ_LOCAL_OOB_DATA_SIZE 0 | 302 | #define MGMT_READ_LOCAL_OOB_DATA_SIZE 0 |
| 303 | struct mgmt_rp_read_local_oob_data { | 303 | struct mgmt_rp_read_local_oob_data { |
| 304 | __u8 hash[16]; | ||
| 305 | __u8 rand[16]; | ||
| 306 | } __packed; | ||
| 307 | struct mgmt_rp_read_local_oob_ext_data { | ||
| 308 | __u8 hash192[16]; | 304 | __u8 hash192[16]; |
| 309 | __u8 rand192[16]; | 305 | __u8 rand192[16]; |
| 310 | __u8 hash256[16]; | 306 | __u8 hash256[16]; |
diff --git a/include/net/bluetooth/rfcomm.h b/include/net/bluetooth/rfcomm.h index 578b83127af1..4190af53a46a 100644 --- a/include/net/bluetooth/rfcomm.h +++ b/include/net/bluetooth/rfcomm.h | |||
| @@ -24,8 +24,6 @@ | |||
| 24 | #ifndef __RFCOMM_H | 24 | #ifndef __RFCOMM_H |
| 25 | #define __RFCOMM_H | 25 | #define __RFCOMM_H |
| 26 | 26 | ||
| 27 | #define RFCOMM_PSM 3 | ||
| 28 | |||
| 29 | #define RFCOMM_CONN_TIMEOUT (HZ * 30) | 27 | #define RFCOMM_CONN_TIMEOUT (HZ * 30) |
| 30 | #define RFCOMM_DISC_TIMEOUT (HZ * 20) | 28 | #define RFCOMM_DISC_TIMEOUT (HZ * 20) |
| 31 | #define RFCOMM_AUTH_TIMEOUT (HZ * 25) | 29 | #define RFCOMM_AUTH_TIMEOUT (HZ * 25) |
diff --git a/include/net/bond_3ad.h b/include/net/bond_3ad.h index e01d903633ef..f04cdbb7848e 100644 --- a/include/net/bond_3ad.h +++ b/include/net/bond_3ad.h | |||
| @@ -274,7 +274,6 @@ void bond_3ad_handle_link_change(struct slave *slave, char link); | |||
| 274 | int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); | 274 | int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); |
| 275 | int __bond_3ad_get_active_agg_info(struct bonding *bond, | 275 | int __bond_3ad_get_active_agg_info(struct bonding *bond, |
| 276 | struct ad_info *ad_info); | 276 | struct ad_info *ad_info); |
| 277 | int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev); | ||
| 278 | int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond, | 277 | int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond, |
| 279 | struct slave *slave); | 278 | struct slave *slave); |
| 280 | int bond_3ad_set_carrier(struct bonding *bond); | 279 | int bond_3ad_set_carrier(struct bonding *bond); |
diff --git a/include/net/bonding.h b/include/net/bonding.h index 983a94b86b95..fda6feeb6c1f 100644 --- a/include/net/bonding.h +++ b/include/net/bonding.h | |||
| @@ -150,6 +150,12 @@ struct bond_parm_tbl { | |||
| 150 | int mode; | 150 | int mode; |
| 151 | }; | 151 | }; |
| 152 | 152 | ||
| 153 | struct netdev_notify_work { | ||
| 154 | struct delayed_work work; | ||
| 155 | struct net_device *dev; | ||
| 156 | struct netdev_bonding_info bonding_info; | ||
| 157 | }; | ||
| 158 | |||
| 153 | struct slave { | 159 | struct slave { |
| 154 | struct net_device *dev; /* first - useful for panic debug */ | 160 | struct net_device *dev; /* first - useful for panic debug */ |
| 155 | struct bonding *bond; /* our master */ | 161 | struct bonding *bond; /* our master */ |
| @@ -243,6 +249,8 @@ struct bonding { | |||
| 243 | #define bond_slave_get_rtnl(dev) \ | 249 | #define bond_slave_get_rtnl(dev) \ |
| 244 | ((struct slave *) rtnl_dereference(dev->rx_handler_data)) | 250 | ((struct slave *) rtnl_dereference(dev->rx_handler_data)) |
| 245 | 251 | ||
| 252 | void bond_queue_slave_event(struct slave *slave); | ||
| 253 | |||
| 246 | struct bond_vlan_tag { | 254 | struct bond_vlan_tag { |
| 247 | __be16 vlan_proto; | 255 | __be16 vlan_proto; |
| 248 | unsigned short vlan_id; | 256 | unsigned short vlan_id; |
| @@ -315,6 +323,7 @@ static inline void bond_set_active_slave(struct slave *slave) | |||
| 315 | { | 323 | { |
| 316 | if (slave->backup) { | 324 | if (slave->backup) { |
| 317 | slave->backup = 0; | 325 | slave->backup = 0; |
| 326 | bond_queue_slave_event(slave); | ||
| 318 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC); | 327 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC); |
| 319 | } | 328 | } |
| 320 | } | 329 | } |
| @@ -323,6 +332,7 @@ static inline void bond_set_backup_slave(struct slave *slave) | |||
| 323 | { | 332 | { |
| 324 | if (!slave->backup) { | 333 | if (!slave->backup) { |
| 325 | slave->backup = 1; | 334 | slave->backup = 1; |
| 335 | bond_queue_slave_event(slave); | ||
| 326 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC); | 336 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC); |
| 327 | } | 337 | } |
| 328 | } | 338 | } |
| @@ -336,6 +346,7 @@ static inline void bond_set_slave_state(struct slave *slave, | |||
| 336 | slave->backup = slave_state; | 346 | slave->backup = slave_state; |
| 337 | if (notify) { | 347 | if (notify) { |
| 338 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC); | 348 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC); |
| 349 | bond_queue_slave_event(slave); | ||
| 339 | slave->should_notify = 0; | 350 | slave->should_notify = 0; |
| 340 | } else { | 351 | } else { |
| 341 | if (slave->should_notify) | 352 | if (slave->should_notify) |
| @@ -490,6 +501,12 @@ static inline bool bond_is_slave_inactive(struct slave *slave) | |||
| 490 | return slave->inactive; | 501 | return slave->inactive; |
| 491 | } | 502 | } |
| 492 | 503 | ||
| 504 | static inline void bond_set_slave_link_state(struct slave *slave, int state) | ||
| 505 | { | ||
| 506 | slave->link = state; | ||
| 507 | bond_queue_slave_event(slave); | ||
| 508 | } | ||
| 509 | |||
| 493 | static inline __be32 bond_confirm_addr(struct net_device *dev, __be32 dst, __be32 local) | 510 | static inline __be32 bond_confirm_addr(struct net_device *dev, __be32 dst, __be32 local) |
| 494 | { | 511 | { |
| 495 | struct in_device *in_dev; | 512 | struct in_device *in_dev; |
| @@ -525,6 +542,7 @@ void bond_sysfs_slave_del(struct slave *slave); | |||
| 525 | int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev); | 542 | int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev); |
| 526 | int bond_release(struct net_device *bond_dev, struct net_device *slave_dev); | 543 | int bond_release(struct net_device *bond_dev, struct net_device *slave_dev); |
| 527 | u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb); | 544 | u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb); |
| 545 | int bond_set_carrier(struct bonding *bond); | ||
| 528 | void bond_select_active_slave(struct bonding *bond); | 546 | void bond_select_active_slave(struct bonding *bond); |
| 529 | void bond_change_active_slave(struct bonding *bond, struct slave *new_active); | 547 | void bond_change_active_slave(struct bonding *bond, struct slave *new_active); |
| 530 | void bond_create_debugfs(void); | 548 | void bond_create_debugfs(void); |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 4ebb816241fa..64e09e1e8099 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
| @@ -520,37 +520,41 @@ ieee80211_chandef_max_power(struct cfg80211_chan_def *chandef) | |||
| 520 | * | 520 | * |
| 521 | * @SURVEY_INFO_NOISE_DBM: noise (in dBm) was filled in | 521 | * @SURVEY_INFO_NOISE_DBM: noise (in dBm) was filled in |
| 522 | * @SURVEY_INFO_IN_USE: channel is currently being used | 522 | * @SURVEY_INFO_IN_USE: channel is currently being used |
| 523 | * @SURVEY_INFO_CHANNEL_TIME: channel active time (in ms) was filled in | 523 | * @SURVEY_INFO_TIME: active time (in ms) was filled in |
| 524 | * @SURVEY_INFO_CHANNEL_TIME_BUSY: channel busy time was filled in | 524 | * @SURVEY_INFO_TIME_BUSY: busy time was filled in |
| 525 | * @SURVEY_INFO_CHANNEL_TIME_EXT_BUSY: extension channel busy time was filled in | 525 | * @SURVEY_INFO_TIME_EXT_BUSY: extension channel busy time was filled in |
| 526 | * @SURVEY_INFO_CHANNEL_TIME_RX: channel receive time was filled in | 526 | * @SURVEY_INFO_TIME_RX: receive time was filled in |
| 527 | * @SURVEY_INFO_CHANNEL_TIME_TX: channel transmit time was filled in | 527 | * @SURVEY_INFO_TIME_TX: transmit time was filled in |
| 528 | * @SURVEY_INFO_TIME_SCAN: scan time was filled in | ||
| 528 | * | 529 | * |
| 529 | * Used by the driver to indicate which info in &struct survey_info | 530 | * Used by the driver to indicate which info in &struct survey_info |
| 530 | * it has filled in during the get_survey(). | 531 | * it has filled in during the get_survey(). |
| 531 | */ | 532 | */ |
| 532 | enum survey_info_flags { | 533 | enum survey_info_flags { |
| 533 | SURVEY_INFO_NOISE_DBM = 1<<0, | 534 | SURVEY_INFO_NOISE_DBM = BIT(0), |
| 534 | SURVEY_INFO_IN_USE = 1<<1, | 535 | SURVEY_INFO_IN_USE = BIT(1), |
| 535 | SURVEY_INFO_CHANNEL_TIME = 1<<2, | 536 | SURVEY_INFO_TIME = BIT(2), |
| 536 | SURVEY_INFO_CHANNEL_TIME_BUSY = 1<<3, | 537 | SURVEY_INFO_TIME_BUSY = BIT(3), |
| 537 | SURVEY_INFO_CHANNEL_TIME_EXT_BUSY = 1<<4, | 538 | SURVEY_INFO_TIME_EXT_BUSY = BIT(4), |
| 538 | SURVEY_INFO_CHANNEL_TIME_RX = 1<<5, | 539 | SURVEY_INFO_TIME_RX = BIT(5), |
| 539 | SURVEY_INFO_CHANNEL_TIME_TX = 1<<6, | 540 | SURVEY_INFO_TIME_TX = BIT(6), |
| 541 | SURVEY_INFO_TIME_SCAN = BIT(7), | ||
| 540 | }; | 542 | }; |
| 541 | 543 | ||
| 542 | /** | 544 | /** |
| 543 | * struct survey_info - channel survey response | 545 | * struct survey_info - channel survey response |
| 544 | * | 546 | * |
| 545 | * @channel: the channel this survey record reports, mandatory | 547 | * @channel: the channel this survey record reports, may be %NULL for a single |
| 548 | * record to report global statistics | ||
| 546 | * @filled: bitflag of flags from &enum survey_info_flags | 549 | * @filled: bitflag of flags from &enum survey_info_flags |
| 547 | * @noise: channel noise in dBm. This and all following fields are | 550 | * @noise: channel noise in dBm. This and all following fields are |
| 548 | * optional | 551 | * optional |
| 549 | * @channel_time: amount of time in ms the radio spent on the channel | 552 | * @time: amount of time in ms the radio was turn on (on the channel) |
| 550 | * @channel_time_busy: amount of time the primary channel was sensed busy | 553 | * @time_busy: amount of time the primary channel was sensed busy |
| 551 | * @channel_time_ext_busy: amount of time the extension channel was sensed busy | 554 | * @time_ext_busy: amount of time the extension channel was sensed busy |
| 552 | * @channel_time_rx: amount of time the radio spent receiving data | 555 | * @time_rx: amount of time the radio spent receiving data |
| 553 | * @channel_time_tx: amount of time the radio spent transmitting data | 556 | * @time_tx: amount of time the radio spent transmitting data |
| 557 | * @time_scan: amount of time the radio spent for scanning | ||
| 554 | * | 558 | * |
| 555 | * Used by dump_survey() to report back per-channel survey information. | 559 | * Used by dump_survey() to report back per-channel survey information. |
| 556 | * | 560 | * |
| @@ -559,11 +563,12 @@ enum survey_info_flags { | |||
| 559 | */ | 563 | */ |
| 560 | struct survey_info { | 564 | struct survey_info { |
| 561 | struct ieee80211_channel *channel; | 565 | struct ieee80211_channel *channel; |
| 562 | u64 channel_time; | 566 | u64 time; |
| 563 | u64 channel_time_busy; | 567 | u64 time_busy; |
| 564 | u64 channel_time_ext_busy; | 568 | u64 time_ext_busy; |
| 565 | u64 channel_time_rx; | 569 | u64 time_rx; |
| 566 | u64 channel_time_tx; | 570 | u64 time_tx; |
| 571 | u64 time_scan; | ||
| 567 | u32 filled; | 572 | u32 filled; |
| 568 | s8 noise; | 573 | s8 noise; |
| 569 | }; | 574 | }; |
| @@ -861,75 +866,6 @@ int cfg80211_check_station_change(struct wiphy *wiphy, | |||
| 861 | enum cfg80211_station_type statype); | 866 | enum cfg80211_station_type statype); |
| 862 | 867 | ||
| 863 | /** | 868 | /** |
| 864 | * enum station_info_flags - station information flags | ||
| 865 | * | ||
| 866 | * Used by the driver to indicate which info in &struct station_info | ||
| 867 | * it has filled in during get_station() or dump_station(). | ||
| 868 | * | ||
| 869 | * @STATION_INFO_INACTIVE_TIME: @inactive_time filled | ||
| 870 | * @STATION_INFO_RX_BYTES: @rx_bytes filled | ||
| 871 | * @STATION_INFO_TX_BYTES: @tx_bytes filled | ||
| 872 | * @STATION_INFO_RX_BYTES64: @rx_bytes filled with 64-bit value | ||
| 873 | * @STATION_INFO_TX_BYTES64: @tx_bytes filled with 64-bit value | ||
| 874 | * @STATION_INFO_LLID: @llid filled | ||
| 875 | * @STATION_INFO_PLID: @plid filled | ||
| 876 | * @STATION_INFO_PLINK_STATE: @plink_state filled | ||
| 877 | * @STATION_INFO_SIGNAL: @signal filled | ||
| 878 | * @STATION_INFO_TX_BITRATE: @txrate fields are filled | ||
| 879 | * (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs) | ||
| 880 | * @STATION_INFO_RX_PACKETS: @rx_packets filled with 32-bit value | ||
| 881 | * @STATION_INFO_TX_PACKETS: @tx_packets filled with 32-bit value | ||
| 882 | * @STATION_INFO_TX_RETRIES: @tx_retries filled | ||
| 883 | * @STATION_INFO_TX_FAILED: @tx_failed filled | ||
| 884 | * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled | ||
| 885 | * @STATION_INFO_SIGNAL_AVG: @signal_avg filled | ||
| 886 | * @STATION_INFO_RX_BITRATE: @rxrate fields are filled | ||
| 887 | * @STATION_INFO_BSS_PARAM: @bss_param filled | ||
| 888 | * @STATION_INFO_CONNECTED_TIME: @connected_time filled | ||
| 889 | * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled | ||
| 890 | * @STATION_INFO_STA_FLAGS: @sta_flags filled | ||
| 891 | * @STATION_INFO_BEACON_LOSS_COUNT: @beacon_loss_count filled | ||
| 892 | * @STATION_INFO_T_OFFSET: @t_offset filled | ||
| 893 | * @STATION_INFO_LOCAL_PM: @local_pm filled | ||
| 894 | * @STATION_INFO_PEER_PM: @peer_pm filled | ||
| 895 | * @STATION_INFO_NONPEER_PM: @nonpeer_pm filled | ||
| 896 | * @STATION_INFO_CHAIN_SIGNAL: @chain_signal filled | ||
| 897 | * @STATION_INFO_CHAIN_SIGNAL_AVG: @chain_signal_avg filled | ||
| 898 | * @STATION_INFO_EXPECTED_THROUGHPUT: @expected_throughput filled | ||
| 899 | */ | ||
| 900 | enum station_info_flags { | ||
| 901 | STATION_INFO_INACTIVE_TIME = BIT(0), | ||
| 902 | STATION_INFO_RX_BYTES = BIT(1), | ||
| 903 | STATION_INFO_TX_BYTES = BIT(2), | ||
| 904 | STATION_INFO_LLID = BIT(3), | ||
| 905 | STATION_INFO_PLID = BIT(4), | ||
| 906 | STATION_INFO_PLINK_STATE = BIT(5), | ||
| 907 | STATION_INFO_SIGNAL = BIT(6), | ||
| 908 | STATION_INFO_TX_BITRATE = BIT(7), | ||
| 909 | STATION_INFO_RX_PACKETS = BIT(8), | ||
| 910 | STATION_INFO_TX_PACKETS = BIT(9), | ||
| 911 | STATION_INFO_TX_RETRIES = BIT(10), | ||
| 912 | STATION_INFO_TX_FAILED = BIT(11), | ||
| 913 | STATION_INFO_RX_DROP_MISC = BIT(12), | ||
| 914 | STATION_INFO_SIGNAL_AVG = BIT(13), | ||
| 915 | STATION_INFO_RX_BITRATE = BIT(14), | ||
| 916 | STATION_INFO_BSS_PARAM = BIT(15), | ||
| 917 | STATION_INFO_CONNECTED_TIME = BIT(16), | ||
| 918 | STATION_INFO_ASSOC_REQ_IES = BIT(17), | ||
| 919 | STATION_INFO_STA_FLAGS = BIT(18), | ||
| 920 | STATION_INFO_BEACON_LOSS_COUNT = BIT(19), | ||
| 921 | STATION_INFO_T_OFFSET = BIT(20), | ||
| 922 | STATION_INFO_LOCAL_PM = BIT(21), | ||
| 923 | STATION_INFO_PEER_PM = BIT(22), | ||
| 924 | STATION_INFO_NONPEER_PM = BIT(23), | ||
| 925 | STATION_INFO_RX_BYTES64 = BIT(24), | ||
| 926 | STATION_INFO_TX_BYTES64 = BIT(25), | ||
| 927 | STATION_INFO_CHAIN_SIGNAL = BIT(26), | ||
| 928 | STATION_INFO_CHAIN_SIGNAL_AVG = BIT(27), | ||
| 929 | STATION_INFO_EXPECTED_THROUGHPUT = BIT(28), | ||
| 930 | }; | ||
| 931 | |||
| 932 | /** | ||
| 933 | * enum station_info_rate_flags - bitrate info flags | 869 | * enum station_info_rate_flags - bitrate info flags |
| 934 | * | 870 | * |
| 935 | * Used by the driver to indicate the specific rate transmission | 871 | * Used by the driver to indicate the specific rate transmission |
| @@ -937,22 +873,35 @@ enum station_info_flags { | |||
| 937 | * | 873 | * |
| 938 | * @RATE_INFO_FLAGS_MCS: mcs field filled with HT MCS | 874 | * @RATE_INFO_FLAGS_MCS: mcs field filled with HT MCS |
| 939 | * @RATE_INFO_FLAGS_VHT_MCS: mcs field filled with VHT MCS | 875 | * @RATE_INFO_FLAGS_VHT_MCS: mcs field filled with VHT MCS |
| 940 | * @RATE_INFO_FLAGS_40_MHZ_WIDTH: 40 MHz width transmission | ||
| 941 | * @RATE_INFO_FLAGS_80_MHZ_WIDTH: 80 MHz width transmission | ||
| 942 | * @RATE_INFO_FLAGS_80P80_MHZ_WIDTH: 80+80 MHz width transmission | ||
| 943 | * @RATE_INFO_FLAGS_160_MHZ_WIDTH: 160 MHz width transmission | ||
| 944 | * @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval | 876 | * @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval |
| 945 | * @RATE_INFO_FLAGS_60G: 60GHz MCS | 877 | * @RATE_INFO_FLAGS_60G: 60GHz MCS |
| 946 | */ | 878 | */ |
| 947 | enum rate_info_flags { | 879 | enum rate_info_flags { |
| 948 | RATE_INFO_FLAGS_MCS = BIT(0), | 880 | RATE_INFO_FLAGS_MCS = BIT(0), |
| 949 | RATE_INFO_FLAGS_VHT_MCS = BIT(1), | 881 | RATE_INFO_FLAGS_VHT_MCS = BIT(1), |
| 950 | RATE_INFO_FLAGS_40_MHZ_WIDTH = BIT(2), | 882 | RATE_INFO_FLAGS_SHORT_GI = BIT(2), |
| 951 | RATE_INFO_FLAGS_80_MHZ_WIDTH = BIT(3), | 883 | RATE_INFO_FLAGS_60G = BIT(3), |
| 952 | RATE_INFO_FLAGS_80P80_MHZ_WIDTH = BIT(4), | 884 | }; |
| 953 | RATE_INFO_FLAGS_160_MHZ_WIDTH = BIT(5), | 885 | |
| 954 | RATE_INFO_FLAGS_SHORT_GI = BIT(6), | 886 | /** |
| 955 | RATE_INFO_FLAGS_60G = BIT(7), | 887 | * enum rate_info_bw - rate bandwidth information |
| 888 | * | ||
| 889 | * Used by the driver to indicate the rate bandwidth. | ||
| 890 | * | ||
| 891 | * @RATE_INFO_BW_5: 5 MHz bandwidth | ||
| 892 | * @RATE_INFO_BW_10: 10 MHz bandwidth | ||
| 893 | * @RATE_INFO_BW_20: 20 MHz bandwidth | ||
| 894 | * @RATE_INFO_BW_40: 40 MHz bandwidth | ||
| 895 | * @RATE_INFO_BW_80: 80 MHz bandwidth | ||
| 896 | * @RATE_INFO_BW_160: 160 MHz bandwidth | ||
| 897 | */ | ||
| 898 | enum rate_info_bw { | ||
| 899 | RATE_INFO_BW_5, | ||
| 900 | RATE_INFO_BW_10, | ||
| 901 | RATE_INFO_BW_20, | ||
| 902 | RATE_INFO_BW_40, | ||
| 903 | RATE_INFO_BW_80, | ||
| 904 | RATE_INFO_BW_160, | ||
| 956 | }; | 905 | }; |
| 957 | 906 | ||
| 958 | /** | 907 | /** |
| @@ -964,12 +913,14 @@ enum rate_info_flags { | |||
| 964 | * @mcs: mcs index if struct describes a 802.11n bitrate | 913 | * @mcs: mcs index if struct describes a 802.11n bitrate |
| 965 | * @legacy: bitrate in 100kbit/s for 802.11abg | 914 | * @legacy: bitrate in 100kbit/s for 802.11abg |
| 966 | * @nss: number of streams (VHT only) | 915 | * @nss: number of streams (VHT only) |
| 916 | * @bw: bandwidth (from &enum rate_info_bw) | ||
| 967 | */ | 917 | */ |
| 968 | struct rate_info { | 918 | struct rate_info { |
| 969 | u8 flags; | 919 | u8 flags; |
| 970 | u8 mcs; | 920 | u8 mcs; |
| 971 | u16 legacy; | 921 | u16 legacy; |
| 972 | u8 nss; | 922 | u8 nss; |
| 923 | u8 bw; | ||
| 973 | }; | 924 | }; |
| 974 | 925 | ||
| 975 | /** | 926 | /** |
| @@ -1003,6 +954,24 @@ struct sta_bss_parameters { | |||
| 1003 | u16 beacon_interval; | 954 | u16 beacon_interval; |
| 1004 | }; | 955 | }; |
| 1005 | 956 | ||
| 957 | /** | ||
| 958 | * struct cfg80211_tid_stats - per-TID statistics | ||
| 959 | * @filled: bitmap of flags using the bits of &enum nl80211_tid_stats to | ||
| 960 | * indicate the relevant values in this struct are filled | ||
| 961 | * @rx_msdu: number of received MSDUs | ||
| 962 | * @tx_msdu: number of (attempted) transmitted MSDUs | ||
| 963 | * @tx_msdu_retries: number of retries (not counting the first) for | ||
| 964 | * transmitted MSDUs | ||
| 965 | * @tx_msdu_failed: number of failed transmitted MSDUs | ||
| 966 | */ | ||
| 967 | struct cfg80211_tid_stats { | ||
| 968 | u32 filled; | ||
| 969 | u64 rx_msdu; | ||
| 970 | u64 tx_msdu; | ||
| 971 | u64 tx_msdu_retries; | ||
| 972 | u64 tx_msdu_failed; | ||
| 973 | }; | ||
| 974 | |||
| 1006 | #define IEEE80211_MAX_CHAINS 4 | 975 | #define IEEE80211_MAX_CHAINS 4 |
| 1007 | 976 | ||
| 1008 | /** | 977 | /** |
| @@ -1010,11 +979,12 @@ struct sta_bss_parameters { | |||
| 1010 | * | 979 | * |
| 1011 | * Station information filled by driver for get_station() and dump_station. | 980 | * Station information filled by driver for get_station() and dump_station. |
| 1012 | * | 981 | * |
| 1013 | * @filled: bitflag of flags from &enum station_info_flags | 982 | * @filled: bitflag of flags using the bits of &enum nl80211_sta_info to |
| 983 | * indicate the relevant values in this struct for them | ||
| 1014 | * @connected_time: time(in secs) since a station is last connected | 984 | * @connected_time: time(in secs) since a station is last connected |
| 1015 | * @inactive_time: time since last station activity (tx/rx) in milliseconds | 985 | * @inactive_time: time since last station activity (tx/rx) in milliseconds |
| 1016 | * @rx_bytes: bytes received from this station | 986 | * @rx_bytes: bytes (size of MPDUs) received from this station |
| 1017 | * @tx_bytes: bytes transmitted to this station | 987 | * @tx_bytes: bytes (size of MPDUs) transmitted to this station |
| 1018 | * @llid: mesh local link id | 988 | * @llid: mesh local link id |
| 1019 | * @plid: mesh peer link id | 989 | * @plid: mesh peer link id |
| 1020 | * @plink_state: mesh peer link state | 990 | * @plink_state: mesh peer link state |
| @@ -1027,10 +997,10 @@ struct sta_bss_parameters { | |||
| 1027 | * @chain_signal_avg: per-chain signal strength average in dBm | 997 | * @chain_signal_avg: per-chain signal strength average in dBm |
| 1028 | * @txrate: current unicast bitrate from this station | 998 | * @txrate: current unicast bitrate from this station |
| 1029 | * @rxrate: current unicast bitrate to this station | 999 | * @rxrate: current unicast bitrate to this station |
| 1030 | * @rx_packets: packets received from this station | 1000 | * @rx_packets: packets (MSDUs & MMPDUs) received from this station |
| 1031 | * @tx_packets: packets transmitted to this station | 1001 | * @tx_packets: packets (MSDUs & MMPDUs) transmitted to this station |
| 1032 | * @tx_retries: cumulative retry counts | 1002 | * @tx_retries: cumulative retry counts (MPDUs) |
| 1033 | * @tx_failed: number of failed transmissions (retries exceeded, no ACK) | 1003 | * @tx_failed: number of failed transmissions (MPDUs) (retries exceeded, no ACK) |
| 1034 | * @rx_dropped_misc: Dropped for un-specified reason. | 1004 | * @rx_dropped_misc: Dropped for un-specified reason. |
| 1035 | * @bss_param: current BSS parameters | 1005 | * @bss_param: current BSS parameters |
| 1036 | * @generation: generation number for nl80211 dumps. | 1006 | * @generation: generation number for nl80211 dumps. |
| @@ -1050,6 +1020,11 @@ struct sta_bss_parameters { | |||
| 1050 | * @nonpeer_pm: non-peer mesh STA power save mode | 1020 | * @nonpeer_pm: non-peer mesh STA power save mode |
| 1051 | * @expected_throughput: expected throughput in kbps (including 802.11 headers) | 1021 | * @expected_throughput: expected throughput in kbps (including 802.11 headers) |
| 1052 | * towards this station. | 1022 | * towards this station. |
| 1023 | * @rx_beacon: number of beacons received from this peer | ||
| 1024 | * @rx_beacon_signal_avg: signal strength average (in dBm) for beacons received | ||
| 1025 | * from this peer | ||
| 1026 | * @pertid: per-TID statistics, see &struct cfg80211_tid_stats, using the last | ||
| 1027 | * (IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs. | ||
| 1053 | */ | 1028 | */ |
| 1054 | struct station_info { | 1029 | struct station_info { |
| 1055 | u32 filled; | 1030 | u32 filled; |
| @@ -1090,10 +1065,9 @@ struct station_info { | |||
| 1090 | 1065 | ||
| 1091 | u32 expected_throughput; | 1066 | u32 expected_throughput; |
| 1092 | 1067 | ||
| 1093 | /* | 1068 | u64 rx_beacon; |
| 1094 | * Note: Add a new enum station_info_flags value for each new field and | 1069 | u8 rx_beacon_signal_avg; |
| 1095 | * use it to check which fields are initialized. | 1070 | struct cfg80211_tid_stats pertid[IEEE80211_NUM_TIDS + 1]; |
| 1096 | */ | ||
| 1097 | }; | 1071 | }; |
| 1098 | 1072 | ||
| 1099 | /** | 1073 | /** |
| @@ -1516,6 +1490,13 @@ struct cfg80211_match_set { | |||
| 1516 | * @mac_addr_mask: MAC address mask used with randomisation, bits that | 1490 | * @mac_addr_mask: MAC address mask used with randomisation, bits that |
| 1517 | * are 0 in the mask should be randomised, bits that are 1 should | 1491 | * are 0 in the mask should be randomised, bits that are 1 should |
| 1518 | * be taken from the @mac_addr | 1492 | * be taken from the @mac_addr |
| 1493 | * @rcu_head: RCU callback used to free the struct | ||
| 1494 | * @owner_nlportid: netlink portid of owner (if this should is a request | ||
| 1495 | * owned by a particular socket) | ||
| 1496 | * @delay: delay in seconds to use before starting the first scan | ||
| 1497 | * cycle. The driver may ignore this parameter and start | ||
| 1498 | * immediately (or at any other time), if this feature is not | ||
| 1499 | * supported. | ||
| 1519 | */ | 1500 | */ |
| 1520 | struct cfg80211_sched_scan_request { | 1501 | struct cfg80211_sched_scan_request { |
| 1521 | struct cfg80211_ssid *ssids; | 1502 | struct cfg80211_ssid *ssids; |
| @@ -1529,6 +1510,7 @@ struct cfg80211_sched_scan_request { | |||
| 1529 | struct cfg80211_match_set *match_sets; | 1510 | struct cfg80211_match_set *match_sets; |
| 1530 | int n_match_sets; | 1511 | int n_match_sets; |
| 1531 | s32 min_rssi_thold; | 1512 | s32 min_rssi_thold; |
| 1513 | u32 delay; | ||
| 1532 | 1514 | ||
| 1533 | u8 mac_addr[ETH_ALEN] __aligned(2); | 1515 | u8 mac_addr[ETH_ALEN] __aligned(2); |
| 1534 | u8 mac_addr_mask[ETH_ALEN] __aligned(2); | 1516 | u8 mac_addr_mask[ETH_ALEN] __aligned(2); |
| @@ -1537,6 +1519,8 @@ struct cfg80211_sched_scan_request { | |||
| 1537 | struct wiphy *wiphy; | 1519 | struct wiphy *wiphy; |
| 1538 | struct net_device *dev; | 1520 | struct net_device *dev; |
| 1539 | unsigned long scan_start; | 1521 | unsigned long scan_start; |
| 1522 | struct rcu_head rcu_head; | ||
| 1523 | u32 owner_nlportid; | ||
| 1540 | 1524 | ||
| 1541 | /* keep last */ | 1525 | /* keep last */ |
| 1542 | struct ieee80211_channel *channels[0]; | 1526 | struct ieee80211_channel *channels[0]; |
| @@ -3011,6 +2995,8 @@ struct wiphy_vendor_command { | |||
| 3011 | * @regulatory_flags: wiphy regulatory flags, see | 2995 | * @regulatory_flags: wiphy regulatory flags, see |
| 3012 | * &enum ieee80211_regulatory_flags | 2996 | * &enum ieee80211_regulatory_flags |
| 3013 | * @features: features advertised to nl80211, see &enum nl80211_feature_flags. | 2997 | * @features: features advertised to nl80211, see &enum nl80211_feature_flags. |
| 2998 | * @ext_features: extended features advertised to nl80211, see | ||
| 2999 | * &enum nl80211_ext_feature_index. | ||
| 3014 | * @bss_priv_size: each BSS struct has private data allocated with it, | 3000 | * @bss_priv_size: each BSS struct has private data allocated with it, |
| 3015 | * this variable determines its size | 3001 | * this variable determines its size |
| 3016 | * @max_scan_ssids: maximum number of SSIDs the device can scan for in | 3002 | * @max_scan_ssids: maximum number of SSIDs the device can scan for in |
| @@ -3120,6 +3106,7 @@ struct wiphy { | |||
| 3120 | u16 max_acl_mac_addrs; | 3106 | u16 max_acl_mac_addrs; |
| 3121 | 3107 | ||
| 3122 | u32 flags, regulatory_flags, features; | 3108 | u32 flags, regulatory_flags, features; |
| 3109 | u8 ext_features[DIV_ROUND_UP(NUM_NL80211_EXT_FEATURES, 8)]; | ||
| 3123 | 3110 | ||
| 3124 | u32 ap_sme_capa; | 3111 | u32 ap_sme_capa; |
| 3125 | 3112 | ||
| @@ -3808,6 +3795,34 @@ const u8 *cfg80211_find_vendor_ie(unsigned int oui, u8 oui_type, | |||
| 3808 | int regulatory_hint(struct wiphy *wiphy, const char *alpha2); | 3795 | int regulatory_hint(struct wiphy *wiphy, const char *alpha2); |
| 3809 | 3796 | ||
| 3810 | /** | 3797 | /** |
| 3798 | * regulatory_set_wiphy_regd - set regdom info for self managed drivers | ||
| 3799 | * @wiphy: the wireless device we want to process the regulatory domain on | ||
| 3800 | * @rd: the regulatory domain informatoin to use for this wiphy | ||
| 3801 | * | ||
| 3802 | * Set the regulatory domain information for self-managed wiphys, only they | ||
| 3803 | * may use this function. See %REGULATORY_WIPHY_SELF_MANAGED for more | ||
| 3804 | * information. | ||
| 3805 | * | ||
| 3806 | * Return: 0 on success. -EINVAL, -EPERM | ||
| 3807 | */ | ||
| 3808 | int regulatory_set_wiphy_regd(struct wiphy *wiphy, | ||
| 3809 | struct ieee80211_regdomain *rd); | ||
| 3810 | |||
| 3811 | /** | ||
| 3812 | * regulatory_set_wiphy_regd_sync_rtnl - set regdom for self-managed drivers | ||
| 3813 | * @wiphy: the wireless device we want to process the regulatory domain on | ||
| 3814 | * @rd: the regulatory domain information to use for this wiphy | ||
| 3815 | * | ||
| 3816 | * This functions requires the RTNL to be held and applies the new regdomain | ||
| 3817 | * synchronously to this wiphy. For more details see | ||
| 3818 | * regulatory_set_wiphy_regd(). | ||
| 3819 | * | ||
| 3820 | * Return: 0 on success. -EINVAL, -EPERM | ||
| 3821 | */ | ||
| 3822 | int regulatory_set_wiphy_regd_sync_rtnl(struct wiphy *wiphy, | ||
| 3823 | struct ieee80211_regdomain *rd); | ||
| 3824 | |||
| 3825 | /** | ||
| 3811 | * wiphy_apply_custom_regulatory - apply a custom driver regulatory domain | 3826 | * wiphy_apply_custom_regulatory - apply a custom driver regulatory domain |
| 3812 | * @wiphy: the wireless device we want to process the regulatory domain on | 3827 | * @wiphy: the wireless device we want to process the regulatory domain on |
| 3813 | * @regd: the custom regulatory domain to use for this wiphy | 3828 | * @regd: the custom regulatory domain to use for this wiphy |
| @@ -4565,13 +4580,27 @@ void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr, | |||
| 4565 | struct station_info *sinfo, gfp_t gfp); | 4580 | struct station_info *sinfo, gfp_t gfp); |
| 4566 | 4581 | ||
| 4567 | /** | 4582 | /** |
| 4583 | * cfg80211_del_sta_sinfo - notify userspace about deletion of a station | ||
| 4584 | * @dev: the netdev | ||
| 4585 | * @mac_addr: the station's address | ||
| 4586 | * @sinfo: the station information/statistics | ||
| 4587 | * @gfp: allocation flags | ||
| 4588 | */ | ||
| 4589 | void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr, | ||
| 4590 | struct station_info *sinfo, gfp_t gfp); | ||
| 4591 | |||
| 4592 | /** | ||
| 4568 | * cfg80211_del_sta - notify userspace about deletion of a station | 4593 | * cfg80211_del_sta - notify userspace about deletion of a station |
| 4569 | * | 4594 | * |
| 4570 | * @dev: the netdev | 4595 | * @dev: the netdev |
| 4571 | * @mac_addr: the station's address | 4596 | * @mac_addr: the station's address |
| 4572 | * @gfp: allocation flags | 4597 | * @gfp: allocation flags |
| 4573 | */ | 4598 | */ |
| 4574 | void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp); | 4599 | static inline void cfg80211_del_sta(struct net_device *dev, |
| 4600 | const u8 *mac_addr, gfp_t gfp) | ||
| 4601 | { | ||
| 4602 | cfg80211_del_sta_sinfo(dev, mac_addr, NULL, gfp); | ||
| 4603 | } | ||
| 4575 | 4604 | ||
| 4576 | /** | 4605 | /** |
| 4577 | * cfg80211_conn_failed - connection request failed notification | 4606 | * cfg80211_conn_failed - connection request failed notification |
| @@ -5033,6 +5062,42 @@ void cfg80211_stop_iface(struct wiphy *wiphy, struct wireless_dev *wdev, | |||
| 5033 | */ | 5062 | */ |
| 5034 | void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy); | 5063 | void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy); |
| 5035 | 5064 | ||
| 5065 | /** | ||
| 5066 | * wiphy_ext_feature_set - set the extended feature flag | ||
| 5067 | * | ||
| 5068 | * @wiphy: the wiphy to modify. | ||
| 5069 | * @ftidx: extended feature bit index. | ||
| 5070 | * | ||
| 5071 | * The extended features are flagged in multiple bytes (see | ||
| 5072 | * &struct wiphy.@ext_features) | ||
| 5073 | */ | ||
| 5074 | static inline void wiphy_ext_feature_set(struct wiphy *wiphy, | ||
| 5075 | enum nl80211_ext_feature_index ftidx) | ||
| 5076 | { | ||
| 5077 | u8 *ft_byte; | ||
| 5078 | |||
| 5079 | ft_byte = &wiphy->ext_features[ftidx / 8]; | ||
| 5080 | *ft_byte |= BIT(ftidx % 8); | ||
| 5081 | } | ||
| 5082 | |||
| 5083 | /** | ||
| 5084 | * wiphy_ext_feature_isset - check the extended feature flag | ||
| 5085 | * | ||
| 5086 | * @wiphy: the wiphy to modify. | ||
| 5087 | * @ftidx: extended feature bit index. | ||
| 5088 | * | ||
| 5089 | * The extended features are flagged in multiple bytes (see | ||
| 5090 | * &struct wiphy.@ext_features) | ||
| 5091 | */ | ||
| 5092 | static inline bool | ||
| 5093 | wiphy_ext_feature_isset(struct wiphy *wiphy, | ||
| 5094 | enum nl80211_ext_feature_index ftidx) | ||
| 5095 | { | ||
| 5096 | u8 ft_byte; | ||
| 5097 | |||
| 5098 | ft_byte = wiphy->ext_features[ftidx / 8]; | ||
| 5099 | return (ft_byte & BIT(ftidx % 8)) != 0; | ||
| 5100 | } | ||
| 5036 | 5101 | ||
| 5037 | /* ethtool helper */ | 5102 | /* ethtool helper */ |
| 5038 | void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info); | 5103 | void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info); |
diff --git a/include/net/cfg802154.h b/include/net/cfg802154.h index 7f713acfa106..eeda67652766 100644 --- a/include/net/cfg802154.h +++ b/include/net/cfg802154.h | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <net/nl802154.h> | 25 | #include <net/nl802154.h> |
| 26 | 26 | ||
| 27 | struct wpan_phy; | 27 | struct wpan_phy; |
| 28 | struct wpan_phy_cca; | ||
| 28 | 29 | ||
| 29 | struct cfg802154_ops { | 30 | struct cfg802154_ops { |
| 30 | struct net_device * (*add_virtual_intf_deprecated)(struct wpan_phy *wpan_phy, | 31 | struct net_device * (*add_virtual_intf_deprecated)(struct wpan_phy *wpan_phy, |
| @@ -39,6 +40,8 @@ struct cfg802154_ops { | |||
| 39 | int (*del_virtual_intf)(struct wpan_phy *wpan_phy, | 40 | int (*del_virtual_intf)(struct wpan_phy *wpan_phy, |
| 40 | struct wpan_dev *wpan_dev); | 41 | struct wpan_dev *wpan_dev); |
| 41 | int (*set_channel)(struct wpan_phy *wpan_phy, u8 page, u8 channel); | 42 | int (*set_channel)(struct wpan_phy *wpan_phy, u8 page, u8 channel); |
| 43 | int (*set_cca_mode)(struct wpan_phy *wpan_phy, | ||
| 44 | const struct wpan_phy_cca *cca); | ||
| 42 | int (*set_pan_id)(struct wpan_phy *wpan_phy, | 45 | int (*set_pan_id)(struct wpan_phy *wpan_phy, |
| 43 | struct wpan_dev *wpan_dev, __le16 pan_id); | 46 | struct wpan_dev *wpan_dev, __le16 pan_id); |
| 44 | int (*set_short_addr)(struct wpan_phy *wpan_phy, | 47 | int (*set_short_addr)(struct wpan_phy *wpan_phy, |
| @@ -56,6 +59,11 @@ struct cfg802154_ops { | |||
| 56 | struct wpan_dev *wpan_dev, bool mode); | 59 | struct wpan_dev *wpan_dev, bool mode); |
| 57 | }; | 60 | }; |
| 58 | 61 | ||
| 62 | struct wpan_phy_cca { | ||
| 63 | enum nl802154_cca_modes mode; | ||
| 64 | enum nl802154_cca_opts opt; | ||
| 65 | }; | ||
| 66 | |||
| 59 | struct wpan_phy { | 67 | struct wpan_phy { |
| 60 | struct mutex pib_lock; | 68 | struct mutex pib_lock; |
| 61 | 69 | ||
| @@ -76,7 +84,7 @@ struct wpan_phy { | |||
| 76 | u8 current_page; | 84 | u8 current_page; |
| 77 | u32 channels_supported[IEEE802154_MAX_PAGE + 1]; | 85 | u32 channels_supported[IEEE802154_MAX_PAGE + 1]; |
| 78 | s8 transmit_power; | 86 | s8 transmit_power; |
| 79 | u8 cca_mode; | 87 | struct wpan_phy_cca cca; |
| 80 | 88 | ||
| 81 | __le64 perm_extended_addr; | 89 | __le64 perm_extended_addr; |
| 82 | 90 | ||
diff --git a/include/net/genetlink.h b/include/net/genetlink.h index 6c92415311ca..0574abd3db86 100644 --- a/include/net/genetlink.h +++ b/include/net/genetlink.h | |||
| @@ -211,6 +211,23 @@ static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr, | |||
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | /** | 213 | /** |
| 214 | * genlmsg_parse - parse attributes of a genetlink message | ||
| 215 | * @nlh: netlink message header | ||
| 216 | * @family: genetlink message family | ||
| 217 | * @tb: destination array with maxtype+1 elements | ||
| 218 | * @maxtype: maximum attribute type to be expected | ||
| 219 | * @policy: validation policy | ||
| 220 | * */ | ||
| 221 | static inline int genlmsg_parse(const struct nlmsghdr *nlh, | ||
| 222 | const struct genl_family *family, | ||
| 223 | struct nlattr *tb[], int maxtype, | ||
| 224 | const struct nla_policy *policy) | ||
| 225 | { | ||
| 226 | return nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype, | ||
| 227 | policy); | ||
| 228 | } | ||
| 229 | |||
| 230 | /** | ||
| 214 | * genl_dump_check_consistent - check if sequence is consistent and advertise if not | 231 | * genl_dump_check_consistent - check if sequence is consistent and advertise if not |
| 215 | * @cb: netlink callback structure that stores the sequence number | 232 | * @cb: netlink callback structure that stores the sequence number |
| 216 | * @user_hdr: user header as returned from genlmsg_put() | 233 | * @user_hdr: user header as returned from genlmsg_put() |
| @@ -250,9 +267,9 @@ static inline void *genlmsg_put_reply(struct sk_buff *skb, | |||
| 250 | * @skb: socket buffer the message is stored in | 267 | * @skb: socket buffer the message is stored in |
| 251 | * @hdr: user specific header | 268 | * @hdr: user specific header |
| 252 | */ | 269 | */ |
| 253 | static inline int genlmsg_end(struct sk_buff *skb, void *hdr) | 270 | static inline void genlmsg_end(struct sk_buff *skb, void *hdr) |
| 254 | { | 271 | { |
| 255 | return nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN); | 272 | nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN); |
| 256 | } | 273 | } |
| 257 | 274 | ||
| 258 | /** | 275 | /** |
diff --git a/include/net/geneve.h b/include/net/geneve.h index 112132cf8e2e..14fb8d3390b4 100644 --- a/include/net/geneve.h +++ b/include/net/geneve.h | |||
| @@ -68,13 +68,12 @@ struct geneve_sock; | |||
| 68 | typedef void (geneve_rcv_t)(struct geneve_sock *gs, struct sk_buff *skb); | 68 | typedef void (geneve_rcv_t)(struct geneve_sock *gs, struct sk_buff *skb); |
| 69 | 69 | ||
| 70 | struct geneve_sock { | 70 | struct geneve_sock { |
| 71 | struct hlist_node hlist; | 71 | struct list_head list; |
| 72 | geneve_rcv_t *rcv; | 72 | geneve_rcv_t *rcv; |
| 73 | void *rcv_data; | 73 | void *rcv_data; |
| 74 | struct work_struct del_work; | ||
| 75 | struct socket *sock; | 74 | struct socket *sock; |
| 76 | struct rcu_head rcu; | 75 | struct rcu_head rcu; |
| 77 | atomic_t refcnt; | 76 | int refcnt; |
| 78 | struct udp_offload udp_offloads; | 77 | struct udp_offload udp_offloads; |
| 79 | }; | 78 | }; |
| 80 | 79 | ||
| @@ -91,7 +90,7 @@ int geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt, | |||
| 91 | struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos, | 90 | struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos, |
| 92 | __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port, | 91 | __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port, |
| 93 | __be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt, | 92 | __be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt, |
| 94 | bool xnet); | 93 | bool csum, bool xnet); |
| 95 | #endif /*ifdef CONFIG_INET */ | 94 | #endif /*ifdef CONFIG_INET */ |
| 96 | 95 | ||
| 97 | #endif /*ifdef__NET_GENEVE_H */ | 96 | #endif /*ifdef__NET_GENEVE_H */ |
diff --git a/include/net/gro_cells.h b/include/net/gro_cells.h index 734d9b5f577a..0f712c0bc0bf 100644 --- a/include/net/gro_cells.h +++ b/include/net/gro_cells.h | |||
| @@ -8,25 +8,23 @@ | |||
| 8 | struct gro_cell { | 8 | struct gro_cell { |
| 9 | struct sk_buff_head napi_skbs; | 9 | struct sk_buff_head napi_skbs; |
| 10 | struct napi_struct napi; | 10 | struct napi_struct napi; |
| 11 | } ____cacheline_aligned_in_smp; | 11 | }; |
| 12 | 12 | ||
| 13 | struct gro_cells { | 13 | struct gro_cells { |
| 14 | unsigned int gro_cells_mask; | 14 | struct gro_cell __percpu *cells; |
| 15 | struct gro_cell *cells; | ||
| 16 | }; | 15 | }; |
| 17 | 16 | ||
| 18 | static inline void gro_cells_receive(struct gro_cells *gcells, struct sk_buff *skb) | 17 | static inline void gro_cells_receive(struct gro_cells *gcells, struct sk_buff *skb) |
| 19 | { | 18 | { |
| 20 | struct gro_cell *cell = gcells->cells; | 19 | struct gro_cell *cell; |
| 21 | struct net_device *dev = skb->dev; | 20 | struct net_device *dev = skb->dev; |
| 22 | 21 | ||
| 23 | if (!cell || skb_cloned(skb) || !(dev->features & NETIF_F_GRO)) { | 22 | if (!gcells->cells || skb_cloned(skb) || !(dev->features & NETIF_F_GRO)) { |
| 24 | netif_rx(skb); | 23 | netif_rx(skb); |
| 25 | return; | 24 | return; |
| 26 | } | 25 | } |
| 27 | 26 | ||
| 28 | if (skb_rx_queue_recorded(skb)) | 27 | cell = this_cpu_ptr(gcells->cells); |
| 29 | cell += skb_get_rx_queue(skb) & gcells->gro_cells_mask; | ||
| 30 | 28 | ||
| 31 | if (skb_queue_len(&cell->napi_skbs) > netdev_max_backlog) { | 29 | if (skb_queue_len(&cell->napi_skbs) > netdev_max_backlog) { |
| 32 | atomic_long_inc(&dev->rx_dropped); | 30 | atomic_long_inc(&dev->rx_dropped); |
| @@ -72,15 +70,12 @@ static inline int gro_cells_init(struct gro_cells *gcells, struct net_device *de | |||
| 72 | { | 70 | { |
| 73 | int i; | 71 | int i; |
| 74 | 72 | ||
| 75 | gcells->gro_cells_mask = roundup_pow_of_two(netif_get_num_default_rss_queues()) - 1; | 73 | gcells->cells = alloc_percpu(struct gro_cell); |
| 76 | gcells->cells = kcalloc(gcells->gro_cells_mask + 1, | ||
| 77 | sizeof(struct gro_cell), | ||
| 78 | GFP_KERNEL); | ||
| 79 | if (!gcells->cells) | 74 | if (!gcells->cells) |
| 80 | return -ENOMEM; | 75 | return -ENOMEM; |
| 81 | 76 | ||
| 82 | for (i = 0; i <= gcells->gro_cells_mask; i++) { | 77 | for_each_possible_cpu(i) { |
| 83 | struct gro_cell *cell = gcells->cells + i; | 78 | struct gro_cell *cell = per_cpu_ptr(gcells->cells, i); |
| 84 | 79 | ||
| 85 | skb_queue_head_init(&cell->napi_skbs); | 80 | skb_queue_head_init(&cell->napi_skbs); |
| 86 | netif_napi_add(dev, &cell->napi, gro_cell_poll, 64); | 81 | netif_napi_add(dev, &cell->napi, gro_cell_poll, 64); |
| @@ -91,16 +86,16 @@ static inline int gro_cells_init(struct gro_cells *gcells, struct net_device *de | |||
| 91 | 86 | ||
| 92 | static inline void gro_cells_destroy(struct gro_cells *gcells) | 87 | static inline void gro_cells_destroy(struct gro_cells *gcells) |
| 93 | { | 88 | { |
| 94 | struct gro_cell *cell = gcells->cells; | ||
| 95 | int i; | 89 | int i; |
| 96 | 90 | ||
| 97 | if (!cell) | 91 | if (!gcells->cells) |
| 98 | return; | 92 | return; |
| 99 | for (i = 0; i <= gcells->gro_cells_mask; i++,cell++) { | 93 | for_each_possible_cpu(i) { |
| 94 | struct gro_cell *cell = per_cpu_ptr(gcells->cells, i); | ||
| 100 | netif_napi_del(&cell->napi); | 95 | netif_napi_del(&cell->napi); |
| 101 | skb_queue_purge(&cell->napi_skbs); | 96 | skb_queue_purge(&cell->napi_skbs); |
| 102 | } | 97 | } |
| 103 | kfree(gcells->cells); | 98 | free_percpu(gcells->cells); |
| 104 | gcells->cells = NULL; | 99 | gcells->cells = NULL; |
| 105 | } | 100 | } |
| 106 | 101 | ||
diff --git a/include/net/ieee802154_netdev.h b/include/net/ieee802154_netdev.h index 83bb8a73d23c..94a297052442 100644 --- a/include/net/ieee802154_netdev.h +++ b/include/net/ieee802154_netdev.h | |||
| @@ -28,6 +28,8 @@ | |||
| 28 | #include <linux/skbuff.h> | 28 | #include <linux/skbuff.h> |
| 29 | #include <linux/ieee802154.h> | 29 | #include <linux/ieee802154.h> |
| 30 | 30 | ||
| 31 | #include <net/cfg802154.h> | ||
| 32 | |||
| 31 | struct ieee802154_sechdr { | 33 | struct ieee802154_sechdr { |
| 32 | #if defined(__LITTLE_ENDIAN_BITFIELD) | 34 | #if defined(__LITTLE_ENDIAN_BITFIELD) |
| 33 | u8 level:3, | 35 | u8 level:3, |
| @@ -337,7 +339,7 @@ struct ieee802154_mac_params { | |||
| 337 | s8 frame_retries; | 339 | s8 frame_retries; |
| 338 | 340 | ||
| 339 | bool lbt; | 341 | bool lbt; |
| 340 | u8 cca_mode; | 342 | struct wpan_phy_cca cca; |
| 341 | s32 cca_ed_level; | 343 | s32 cca_ed_level; |
| 342 | }; | 344 | }; |
| 343 | 345 | ||
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h index 848e85cb5c61..5976bdecf58b 100644 --- a/include/net/inet_connection_sock.h +++ b/include/net/inet_connection_sock.h | |||
| @@ -98,7 +98,8 @@ struct inet_connection_sock { | |||
| 98 | const struct tcp_congestion_ops *icsk_ca_ops; | 98 | const struct tcp_congestion_ops *icsk_ca_ops; |
| 99 | const struct inet_connection_sock_af_ops *icsk_af_ops; | 99 | const struct inet_connection_sock_af_ops *icsk_af_ops; |
| 100 | unsigned int (*icsk_sync_mss)(struct sock *sk, u32 pmtu); | 100 | unsigned int (*icsk_sync_mss)(struct sock *sk, u32 pmtu); |
| 101 | __u8 icsk_ca_state; | 101 | __u8 icsk_ca_state:7, |
| 102 | icsk_ca_dst_locked:1; | ||
| 102 | __u8 icsk_retransmits; | 103 | __u8 icsk_retransmits; |
| 103 | __u8 icsk_pending; | 104 | __u8 icsk_pending; |
| 104 | __u8 icsk_backoff; | 105 | __u8 icsk_backoff; |
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index a829b77523cf..eb16c7beed1e 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | #ifndef _INET_SOCK_H | 16 | #ifndef _INET_SOCK_H |
| 17 | #define _INET_SOCK_H | 17 | #define _INET_SOCK_H |
| 18 | 18 | ||
| 19 | 19 | #include <linux/bitops.h> | |
| 20 | #include <linux/kmemcheck.h> | 20 | #include <linux/kmemcheck.h> |
| 21 | #include <linux/string.h> | 21 | #include <linux/string.h> |
| 22 | #include <linux/types.h> | 22 | #include <linux/types.h> |
| @@ -184,6 +184,7 @@ struct inet_sock { | |||
| 184 | mc_all:1, | 184 | mc_all:1, |
| 185 | nodefrag:1; | 185 | nodefrag:1; |
| 186 | __u8 rcv_tos; | 186 | __u8 rcv_tos; |
| 187 | __u8 convert_csum; | ||
| 187 | int uc_index; | 188 | int uc_index; |
| 188 | int mc_index; | 189 | int mc_index; |
| 189 | __be32 mc_addr; | 190 | __be32 mc_addr; |
| @@ -194,6 +195,16 @@ struct inet_sock { | |||
| 194 | #define IPCORK_OPT 1 /* ip-options has been held in ipcork.opt */ | 195 | #define IPCORK_OPT 1 /* ip-options has been held in ipcork.opt */ |
| 195 | #define IPCORK_ALLFRAG 2 /* always fragment (for ipv6 for now) */ | 196 | #define IPCORK_ALLFRAG 2 /* always fragment (for ipv6 for now) */ |
| 196 | 197 | ||
| 198 | /* cmsg flags for inet */ | ||
| 199 | #define IP_CMSG_PKTINFO BIT(0) | ||
| 200 | #define IP_CMSG_TTL BIT(1) | ||
| 201 | #define IP_CMSG_TOS BIT(2) | ||
| 202 | #define IP_CMSG_RECVOPTS BIT(3) | ||
| 203 | #define IP_CMSG_RETOPTS BIT(4) | ||
| 204 | #define IP_CMSG_PASSSEC BIT(5) | ||
| 205 | #define IP_CMSG_ORIGDSTADDR BIT(6) | ||
| 206 | #define IP_CMSG_CHECKSUM BIT(7) | ||
| 207 | |||
| 197 | static inline struct inet_sock *inet_sk(const struct sock *sk) | 208 | static inline struct inet_sock *inet_sk(const struct sock *sk) |
| 198 | { | 209 | { |
| 199 | return (struct inet_sock *)sk; | 210 | return (struct inet_sock *)sk; |
| @@ -250,4 +261,20 @@ static inline __u8 inet_sk_flowi_flags(const struct sock *sk) | |||
| 250 | return flags; | 261 | return flags; |
| 251 | } | 262 | } |
| 252 | 263 | ||
| 264 | static inline void inet_inc_convert_csum(struct sock *sk) | ||
| 265 | { | ||
| 266 | inet_sk(sk)->convert_csum++; | ||
| 267 | } | ||
| 268 | |||
| 269 | static inline void inet_dec_convert_csum(struct sock *sk) | ||
| 270 | { | ||
| 271 | if (inet_sk(sk)->convert_csum > 0) | ||
| 272 | inet_sk(sk)->convert_csum--; | ||
| 273 | } | ||
| 274 | |||
| 275 | static inline bool inet_get_convert_csum(struct sock *sk) | ||
| 276 | { | ||
| 277 | return !!inet_sk(sk)->convert_csum; | ||
| 278 | } | ||
| 279 | |||
| 253 | #endif /* _INET_SOCK_H */ | 280 | #endif /* _INET_SOCK_H */ |
diff --git a/include/net/ip.h b/include/net/ip.h index 09cf5aebb283..025c61c0dffb 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
| @@ -538,7 +538,7 @@ int ip_options_rcv_srr(struct sk_buff *skb); | |||
| 538 | */ | 538 | */ |
| 539 | 539 | ||
| 540 | void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb); | 540 | void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb); |
| 541 | void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb); | 541 | void ip_cmsg_recv_offset(struct msghdr *msg, struct sk_buff *skb, int offset); |
| 542 | int ip_cmsg_send(struct net *net, struct msghdr *msg, | 542 | int ip_cmsg_send(struct net *net, struct msghdr *msg, |
| 543 | struct ipcm_cookie *ipc, bool allow_ipv6); | 543 | struct ipcm_cookie *ipc, bool allow_ipv6); |
| 544 | int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval, | 544 | int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval, |
| @@ -558,6 +558,11 @@ void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port, | |||
| 558 | void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport, | 558 | void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport, |
| 559 | u32 info); | 559 | u32 info); |
| 560 | 560 | ||
| 561 | static inline void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb) | ||
| 562 | { | ||
| 563 | ip_cmsg_recv_offset(msg, skb, 0); | ||
| 564 | } | ||
| 565 | |||
| 561 | bool icmp_global_allow(void); | 566 | bool icmp_global_allow(void); |
| 562 | extern int sysctl_icmp_msgs_per_sec; | 567 | extern int sysctl_icmp_msgs_per_sec; |
| 563 | extern int sysctl_icmp_msgs_burst; | 568 | extern int sysctl_icmp_msgs_burst; |
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index 8eea35d32a75..20e80fa7bbdd 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h | |||
| @@ -74,6 +74,11 @@ struct fib6_node { | |||
| 74 | #define FIB6_SUBTREE(fn) ((fn)->subtree) | 74 | #define FIB6_SUBTREE(fn) ((fn)->subtree) |
| 75 | #endif | 75 | #endif |
| 76 | 76 | ||
| 77 | struct mx6_config { | ||
| 78 | const u32 *mx; | ||
| 79 | DECLARE_BITMAP(mx_valid, RTAX_MAX); | ||
| 80 | }; | ||
| 81 | |||
| 77 | /* | 82 | /* |
| 78 | * routing information | 83 | * routing information |
| 79 | * | 84 | * |
| @@ -291,9 +296,8 @@ struct fib6_node *fib6_locate(struct fib6_node *root, | |||
| 291 | void fib6_clean_all(struct net *net, int (*func)(struct rt6_info *, void *arg), | 296 | void fib6_clean_all(struct net *net, int (*func)(struct rt6_info *, void *arg), |
| 292 | void *arg); | 297 | void *arg); |
| 293 | 298 | ||
| 294 | int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nl_info *info, | 299 | int fib6_add(struct fib6_node *root, struct rt6_info *rt, |
| 295 | struct nlattr *mx, int mx_len); | 300 | struct nl_info *info, struct mx6_config *mxc); |
| 296 | |||
| 297 | int fib6_del(struct rt6_info *rt, struct nl_info *info); | 301 | int fib6_del(struct rt6_info *rt, struct nl_info *info); |
| 298 | 302 | ||
| 299 | void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info); | 303 | void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info); |
diff --git a/include/net/ip6_tunnel.h b/include/net/ip6_tunnel.h index 9326c41c2d7f..76c091b53dae 100644 --- a/include/net/ip6_tunnel.h +++ b/include/net/ip6_tunnel.h | |||
| @@ -70,6 +70,7 @@ int ip6_tnl_xmit_ctl(struct ip6_tnl *t, const struct in6_addr *laddr, | |||
| 70 | __u16 ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw); | 70 | __u16 ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw); |
| 71 | __u32 ip6_tnl_get_cap(struct ip6_tnl *t, const struct in6_addr *laddr, | 71 | __u32 ip6_tnl_get_cap(struct ip6_tnl *t, const struct in6_addr *laddr, |
| 72 | const struct in6_addr *raddr); | 72 | const struct in6_addr *raddr); |
| 73 | struct net *ip6_tnl_get_link_net(const struct net_device *dev); | ||
| 73 | 74 | ||
| 74 | static inline void ip6tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | 75 | static inline void ip6tunnel_xmit(struct sk_buff *skb, struct net_device *dev) |
| 75 | { | 76 | { |
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index 09a819ee2151..5bd120e4bc0a 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h | |||
| @@ -222,16 +222,19 @@ static inline struct fib_table *fib_new_table(struct net *net, u32 id) | |||
| 222 | static inline int fib_lookup(struct net *net, const struct flowi4 *flp, | 222 | static inline int fib_lookup(struct net *net, const struct flowi4 *flp, |
| 223 | struct fib_result *res) | 223 | struct fib_result *res) |
| 224 | { | 224 | { |
| 225 | struct fib_table *table; | 225 | int err = -ENETUNREACH; |
| 226 | |||
| 227 | rcu_read_lock(); | ||
| 228 | |||
| 229 | if (!fib_table_lookup(fib_get_table(net, RT_TABLE_LOCAL), flp, res, | ||
| 230 | FIB_LOOKUP_NOREF) || | ||
| 231 | !fib_table_lookup(fib_get_table(net, RT_TABLE_MAIN), flp, res, | ||
| 232 | FIB_LOOKUP_NOREF)) | ||
| 233 | err = 0; | ||
| 226 | 234 | ||
| 227 | table = fib_get_table(net, RT_TABLE_LOCAL); | 235 | rcu_read_unlock(); |
| 228 | if (!fib_table_lookup(table, flp, res, FIB_LOOKUP_NOREF)) | ||
| 229 | return 0; | ||
| 230 | 236 | ||
| 231 | table = fib_get_table(net, RT_TABLE_MAIN); | 237 | return err; |
| 232 | if (!fib_table_lookup(table, flp, res, FIB_LOOKUP_NOREF)) | ||
| 233 | return 0; | ||
| 234 | return -ENETUNREACH; | ||
| 235 | } | 238 | } |
| 236 | 239 | ||
| 237 | #else /* CONFIG_IP_MULTIPLE_TABLES */ | 240 | #else /* CONFIG_IP_MULTIPLE_TABLES */ |
| @@ -247,20 +250,25 @@ static inline int fib_lookup(struct net *net, struct flowi4 *flp, | |||
| 247 | struct fib_result *res) | 250 | struct fib_result *res) |
| 248 | { | 251 | { |
| 249 | if (!net->ipv4.fib_has_custom_rules) { | 252 | if (!net->ipv4.fib_has_custom_rules) { |
| 253 | int err = -ENETUNREACH; | ||
| 254 | |||
| 255 | rcu_read_lock(); | ||
| 256 | |||
| 250 | res->tclassid = 0; | 257 | res->tclassid = 0; |
| 251 | if (net->ipv4.fib_local && | 258 | if ((net->ipv4.fib_local && |
| 252 | !fib_table_lookup(net->ipv4.fib_local, flp, res, | 259 | !fib_table_lookup(net->ipv4.fib_local, flp, res, |
| 253 | FIB_LOOKUP_NOREF)) | 260 | FIB_LOOKUP_NOREF)) || |
| 254 | return 0; | 261 | (net->ipv4.fib_main && |
| 255 | if (net->ipv4.fib_main && | 262 | !fib_table_lookup(net->ipv4.fib_main, flp, res, |
| 256 | !fib_table_lookup(net->ipv4.fib_main, flp, res, | 263 | FIB_LOOKUP_NOREF)) || |
| 257 | FIB_LOOKUP_NOREF)) | 264 | (net->ipv4.fib_default && |
| 258 | return 0; | 265 | !fib_table_lookup(net->ipv4.fib_default, flp, res, |
| 259 | if (net->ipv4.fib_default && | 266 | FIB_LOOKUP_NOREF))) |
| 260 | !fib_table_lookup(net->ipv4.fib_default, flp, res, | 267 | err = 0; |
| 261 | FIB_LOOKUP_NOREF)) | 268 | |
| 262 | return 0; | 269 | rcu_read_unlock(); |
| 263 | return -ENETUNREACH; | 270 | |
| 271 | return err; | ||
| 264 | } | 272 | } |
| 265 | return __fib_lookup(net, flp, res); | 273 | return __fib_lookup(net, flp, res); |
| 266 | } | 274 | } |
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h index 25a59eb388a6..2c47061a6954 100644 --- a/include/net/ip_tunnels.h +++ b/include/net/ip_tunnels.h | |||
| @@ -97,7 +97,10 @@ struct ip_tunnel { | |||
| 97 | #define TUNNEL_DONT_FRAGMENT __cpu_to_be16(0x0100) | 97 | #define TUNNEL_DONT_FRAGMENT __cpu_to_be16(0x0100) |
| 98 | #define TUNNEL_OAM __cpu_to_be16(0x0200) | 98 | #define TUNNEL_OAM __cpu_to_be16(0x0200) |
| 99 | #define TUNNEL_CRIT_OPT __cpu_to_be16(0x0400) | 99 | #define TUNNEL_CRIT_OPT __cpu_to_be16(0x0400) |
| 100 | #define TUNNEL_OPTIONS_PRESENT __cpu_to_be16(0x0800) | 100 | #define TUNNEL_GENEVE_OPT __cpu_to_be16(0x0800) |
| 101 | #define TUNNEL_VXLAN_OPT __cpu_to_be16(0x1000) | ||
| 102 | |||
| 103 | #define TUNNEL_OPTIONS_PRESENT (TUNNEL_GENEVE_OPT | TUNNEL_VXLAN_OPT) | ||
| 101 | 104 | ||
| 102 | struct tnl_ptk_info { | 105 | struct tnl_ptk_info { |
| 103 | __be16 flags; | 106 | __be16 flags; |
| @@ -138,6 +141,7 @@ int ip_tunnel_encap_del_ops(const struct ip_tunnel_encap_ops *op, | |||
| 138 | int ip_tunnel_init(struct net_device *dev); | 141 | int ip_tunnel_init(struct net_device *dev); |
| 139 | void ip_tunnel_uninit(struct net_device *dev); | 142 | void ip_tunnel_uninit(struct net_device *dev); |
| 140 | void ip_tunnel_dellink(struct net_device *dev, struct list_head *head); | 143 | void ip_tunnel_dellink(struct net_device *dev, struct list_head *head); |
| 144 | struct net *ip_tunnel_get_link_net(const struct net_device *dev); | ||
| 141 | int ip_tunnel_init_net(struct net *net, int ip_tnl_net_id, | 145 | int ip_tunnel_init_net(struct net *net, int ip_tnl_net_id, |
| 142 | struct rtnl_link_ops *ops, char *devname); | 146 | struct rtnl_link_ops *ops, char *devname); |
| 143 | 147 | ||
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 6e416f6d3e3c..4c9fe224d73b 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
| @@ -671,8 +671,6 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add | |||
| 671 | return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); | 671 | return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); |
| 672 | } | 672 | } |
| 673 | 673 | ||
| 674 | u32 __ipv6_select_ident(u32 hashrnd, struct in6_addr *dst, | ||
| 675 | struct in6_addr *src); | ||
| 676 | void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt); | 674 | void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt); |
| 677 | void ipv6_proxy_select_ident(struct sk_buff *skb); | 675 | void ipv6_proxy_select_ident(struct sk_buff *skb); |
| 678 | 676 | ||
| @@ -791,6 +789,25 @@ int ip6_push_pending_frames(struct sock *sk); | |||
| 791 | 789 | ||
| 792 | void ip6_flush_pending_frames(struct sock *sk); | 790 | void ip6_flush_pending_frames(struct sock *sk); |
| 793 | 791 | ||
| 792 | int ip6_send_skb(struct sk_buff *skb); | ||
| 793 | |||
| 794 | struct sk_buff *__ip6_make_skb(struct sock *sk, struct sk_buff_head *queue, | ||
| 795 | struct inet_cork_full *cork, | ||
| 796 | struct inet6_cork *v6_cork); | ||
| 797 | struct sk_buff *ip6_make_skb(struct sock *sk, | ||
| 798 | int getfrag(void *from, char *to, int offset, | ||
| 799 | int len, int odd, struct sk_buff *skb), | ||
| 800 | void *from, int length, int transhdrlen, | ||
| 801 | int hlimit, int tclass, struct ipv6_txoptions *opt, | ||
| 802 | struct flowi6 *fl6, struct rt6_info *rt, | ||
| 803 | unsigned int flags, int dontfrag); | ||
| 804 | |||
| 805 | static inline struct sk_buff *ip6_finish_skb(struct sock *sk) | ||
| 806 | { | ||
| 807 | return __ip6_make_skb(sk, &sk->sk_write_queue, &inet_sk(sk)->cork, | ||
| 808 | &inet6_sk(sk)->cork); | ||
| 809 | } | ||
| 810 | |||
| 794 | int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6); | 811 | int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6); |
| 795 | struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6, | 812 | struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6, |
| 796 | const struct in6_addr *final_dst); | 813 | const struct in6_addr *final_dst); |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 29c7be8808d5..d52914b75331 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
| @@ -376,6 +376,12 @@ enum ieee80211_rssi_event { | |||
| 376 | * @ssid_len: Length of SSID given in @ssid. | 376 | * @ssid_len: Length of SSID given in @ssid. |
| 377 | * @hidden_ssid: The SSID of the current vif is hidden. Only valid in AP-mode. | 377 | * @hidden_ssid: The SSID of the current vif is hidden. Only valid in AP-mode. |
| 378 | * @txpower: TX power in dBm | 378 | * @txpower: TX power in dBm |
| 379 | * @txpower_type: TX power adjustment used to control per packet Transmit | ||
| 380 | * Power Control (TPC) in lower driver for the current vif. In particular | ||
| 381 | * TPC is enabled if value passed in %txpower_type is | ||
| 382 | * NL80211_TX_POWER_LIMITED (allow using less than specified from | ||
| 383 | * userspace), whereas TPC is disabled if %txpower_type is set to | ||
| 384 | * NL80211_TX_POWER_FIXED (use value configured from userspace) | ||
| 379 | * @p2p_noa_attr: P2P NoA attribute for P2P powersave | 385 | * @p2p_noa_attr: P2P NoA attribute for P2P powersave |
| 380 | */ | 386 | */ |
| 381 | struct ieee80211_bss_conf { | 387 | struct ieee80211_bss_conf { |
| @@ -411,6 +417,7 @@ struct ieee80211_bss_conf { | |||
| 411 | size_t ssid_len; | 417 | size_t ssid_len; |
| 412 | bool hidden_ssid; | 418 | bool hidden_ssid; |
| 413 | int txpower; | 419 | int txpower; |
| 420 | enum nl80211_tx_power_setting txpower_type; | ||
| 414 | struct ieee80211_p2p_noa_attr p2p_noa_attr; | 421 | struct ieee80211_p2p_noa_attr p2p_noa_attr; |
| 415 | }; | 422 | }; |
| 416 | 423 | ||
| @@ -505,8 +512,11 @@ struct ieee80211_bss_conf { | |||
| 505 | * @IEEE80211_TX_CTL_DONTFRAG: Don't fragment this packet even if it | 512 | * @IEEE80211_TX_CTL_DONTFRAG: Don't fragment this packet even if it |
| 506 | * would be fragmented by size (this is optional, only used for | 513 | * would be fragmented by size (this is optional, only used for |
| 507 | * monitor injection). | 514 | * monitor injection). |
| 508 | * @IEEE80211_TX_CTL_PS_RESPONSE: This frame is a response to a poll | 515 | * @IEEE80211_TX_STAT_NOACK_TRANSMITTED: A frame that was marked with |
| 509 | * frame (PS-Poll or uAPSD). | 516 | * IEEE80211_TX_CTL_NO_ACK has been successfully transmitted without |
| 517 | * any errors (like issues specific to the driver/HW). | ||
| 518 | * This flag must not be set for frames that don't request no-ack | ||
| 519 | * behaviour with IEEE80211_TX_CTL_NO_ACK. | ||
| 510 | * | 520 | * |
| 511 | * Note: If you have to add new flags to the enumeration, then don't | 521 | * Note: If you have to add new flags to the enumeration, then don't |
| 512 | * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary. | 522 | * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary. |
| @@ -542,7 +552,7 @@ enum mac80211_tx_info_flags { | |||
| 542 | IEEE80211_TX_STATUS_EOSP = BIT(28), | 552 | IEEE80211_TX_STATUS_EOSP = BIT(28), |
| 543 | IEEE80211_TX_CTL_USE_MINRATE = BIT(29), | 553 | IEEE80211_TX_CTL_USE_MINRATE = BIT(29), |
| 544 | IEEE80211_TX_CTL_DONTFRAG = BIT(30), | 554 | IEEE80211_TX_CTL_DONTFRAG = BIT(30), |
| 545 | IEEE80211_TX_CTL_PS_RESPONSE = BIT(31), | 555 | IEEE80211_TX_STAT_NOACK_TRANSMITTED = BIT(31), |
| 546 | }; | 556 | }; |
| 547 | 557 | ||
| 548 | #define IEEE80211_TX_CTL_STBC_SHIFT 23 | 558 | #define IEEE80211_TX_CTL_STBC_SHIFT 23 |
| @@ -552,11 +562,14 @@ enum mac80211_tx_info_flags { | |||
| 552 | * | 562 | * |
| 553 | * @IEEE80211_TX_CTRL_PORT_CTRL_PROTO: this frame is a port control | 563 | * @IEEE80211_TX_CTRL_PORT_CTRL_PROTO: this frame is a port control |
| 554 | * protocol frame (e.g. EAP) | 564 | * protocol frame (e.g. EAP) |
| 565 | * @IEEE80211_TX_CTRL_PS_RESPONSE: This frame is a response to a poll | ||
| 566 | * frame (PS-Poll or uAPSD). | ||
| 555 | * | 567 | * |
| 556 | * These flags are used in tx_info->control.flags. | 568 | * These flags are used in tx_info->control.flags. |
| 557 | */ | 569 | */ |
| 558 | enum mac80211_tx_control_flags { | 570 | enum mac80211_tx_control_flags { |
| 559 | IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0), | 571 | IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0), |
| 572 | IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), | ||
| 560 | }; | 573 | }; |
| 561 | 574 | ||
| 562 | /* | 575 | /* |
| @@ -925,15 +938,13 @@ enum mac80211_rx_flags { | |||
| 925 | * These flags are used with the @vht_flag member of | 938 | * These flags are used with the @vht_flag member of |
| 926 | * &struct ieee80211_rx_status. | 939 | * &struct ieee80211_rx_status. |
| 927 | * @RX_VHT_FLAG_80MHZ: 80 MHz was used | 940 | * @RX_VHT_FLAG_80MHZ: 80 MHz was used |
| 928 | * @RX_VHT_FLAG_80P80MHZ: 80+80 MHz was used | ||
| 929 | * @RX_VHT_FLAG_160MHZ: 160 MHz was used | 941 | * @RX_VHT_FLAG_160MHZ: 160 MHz was used |
| 930 | * @RX_VHT_FLAG_BF: packet was beamformed | 942 | * @RX_VHT_FLAG_BF: packet was beamformed |
| 931 | */ | 943 | */ |
| 932 | enum mac80211_rx_vht_flags { | 944 | enum mac80211_rx_vht_flags { |
| 933 | RX_VHT_FLAG_80MHZ = BIT(0), | 945 | RX_VHT_FLAG_80MHZ = BIT(0), |
| 934 | RX_VHT_FLAG_80P80MHZ = BIT(1), | 946 | RX_VHT_FLAG_160MHZ = BIT(1), |
| 935 | RX_VHT_FLAG_160MHZ = BIT(2), | 947 | RX_VHT_FLAG_BF = BIT(2), |
| 936 | RX_VHT_FLAG_BF = BIT(3), | ||
| 937 | }; | 948 | }; |
| 938 | 949 | ||
| 939 | /** | 950 | /** |
| @@ -1181,10 +1192,15 @@ struct ieee80211_channel_switch { | |||
| 1181 | * monitoring on this virtual interface -- i.e. it can monitor | 1192 | * monitoring on this virtual interface -- i.e. it can monitor |
| 1182 | * connection quality related parameters, such as the RSSI level and | 1193 | * connection quality related parameters, such as the RSSI level and |
| 1183 | * provide notifications if configured trigger levels are reached. | 1194 | * provide notifications if configured trigger levels are reached. |
| 1195 | * @IEEE80211_VIF_SUPPORTS_UAPSD: The device can do U-APSD for this | ||
| 1196 | * interface. This flag should be set during interface addition, | ||
| 1197 | * but may be set/cleared as late as authentication to an AP. It is | ||
| 1198 | * only valid for managed/station mode interfaces. | ||
| 1184 | */ | 1199 | */ |
| 1185 | enum ieee80211_vif_flags { | 1200 | enum ieee80211_vif_flags { |
| 1186 | IEEE80211_VIF_BEACON_FILTER = BIT(0), | 1201 | IEEE80211_VIF_BEACON_FILTER = BIT(0), |
| 1187 | IEEE80211_VIF_SUPPORTS_CQM_RSSI = BIT(1), | 1202 | IEEE80211_VIF_SUPPORTS_CQM_RSSI = BIT(1), |
| 1203 | IEEE80211_VIF_SUPPORTS_UAPSD = BIT(2), | ||
| 1188 | }; | 1204 | }; |
| 1189 | 1205 | ||
| 1190 | /** | 1206 | /** |
| @@ -1270,19 +1286,22 @@ struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev); | |||
| 1270 | * | 1286 | * |
| 1271 | * @IEEE80211_KEY_FLAG_GENERATE_IV: This flag should be set by the | 1287 | * @IEEE80211_KEY_FLAG_GENERATE_IV: This flag should be set by the |
| 1272 | * driver to indicate that it requires IV generation for this | 1288 | * driver to indicate that it requires IV generation for this |
| 1273 | * particular key. | 1289 | * particular key. Setting this flag does not necessarily mean that SKBs |
| 1290 | * will have sufficient tailroom for ICV or MIC. | ||
| 1274 | * @IEEE80211_KEY_FLAG_GENERATE_MMIC: This flag should be set by | 1291 | * @IEEE80211_KEY_FLAG_GENERATE_MMIC: This flag should be set by |
| 1275 | * the driver for a TKIP key if it requires Michael MIC | 1292 | * the driver for a TKIP key if it requires Michael MIC |
| 1276 | * generation in software. | 1293 | * generation in software. |
| 1277 | * @IEEE80211_KEY_FLAG_PAIRWISE: Set by mac80211, this flag indicates | 1294 | * @IEEE80211_KEY_FLAG_PAIRWISE: Set by mac80211, this flag indicates |
| 1278 | * that the key is pairwise rather then a shared key. | 1295 | * that the key is pairwise rather then a shared key. |
| 1279 | * @IEEE80211_KEY_FLAG_SW_MGMT_TX: This flag should be set by the driver for a | 1296 | * @IEEE80211_KEY_FLAG_SW_MGMT_TX: This flag should be set by the driver for a |
| 1280 | * CCMP key if it requires CCMP encryption of management frames (MFP) to | 1297 | * CCMP/GCMP key if it requires CCMP/GCMP encryption of management frames |
| 1281 | * be done in software. | 1298 | * (MFP) to be done in software. |
| 1282 | * @IEEE80211_KEY_FLAG_PUT_IV_SPACE: This flag should be set by the driver | 1299 | * @IEEE80211_KEY_FLAG_PUT_IV_SPACE: This flag should be set by the driver |
| 1283 | * if space should be prepared for the IV, but the IV | 1300 | * if space should be prepared for the IV, but the IV |
| 1284 | * itself should not be generated. Do not set together with | 1301 | * itself should not be generated. Do not set together with |
| 1285 | * @IEEE80211_KEY_FLAG_GENERATE_IV on the same key. | 1302 | * @IEEE80211_KEY_FLAG_GENERATE_IV on the same key. Setting this flag does |
| 1303 | * not necessarily mean that SKBs will have sufficient tailroom for ICV or | ||
| 1304 | * MIC. | ||
| 1286 | * @IEEE80211_KEY_FLAG_RX_MGMT: This key will be used to decrypt received | 1305 | * @IEEE80211_KEY_FLAG_RX_MGMT: This key will be used to decrypt received |
| 1287 | * management frames. The flag can help drivers that have a hardware | 1306 | * management frames. The flag can help drivers that have a hardware |
| 1288 | * crypto implementation that doesn't deal with management frames | 1307 | * crypto implementation that doesn't deal with management frames |
| @@ -1291,8 +1310,11 @@ struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev); | |||
| 1291 | * RX, if your crypto engine can't deal with TX you can also set the | 1310 | * RX, if your crypto engine can't deal with TX you can also set the |
| 1292 | * %IEEE80211_KEY_FLAG_SW_MGMT_TX flag to encrypt such frames in SW. | 1311 | * %IEEE80211_KEY_FLAG_SW_MGMT_TX flag to encrypt such frames in SW. |
| 1293 | * @IEEE80211_KEY_FLAG_GENERATE_IV_MGMT: This flag should be set by the | 1312 | * @IEEE80211_KEY_FLAG_GENERATE_IV_MGMT: This flag should be set by the |
| 1294 | * driver for a CCMP key to indicate that is requires IV generation | 1313 | * driver for a CCMP/GCMP key to indicate that is requires IV generation |
| 1295 | * only for managment frames (MFP). | 1314 | * only for managment frames (MFP). |
| 1315 | * @IEEE80211_KEY_FLAG_RESERVE_TAILROOM: This flag should be set by the | ||
| 1316 | * driver for a key to indicate that sufficient tailroom must always | ||
| 1317 | * be reserved for ICV or MIC, even when HW encryption is enabled. | ||
| 1296 | */ | 1318 | */ |
| 1297 | enum ieee80211_key_flags { | 1319 | enum ieee80211_key_flags { |
| 1298 | IEEE80211_KEY_FLAG_GENERATE_IV_MGMT = BIT(0), | 1320 | IEEE80211_KEY_FLAG_GENERATE_IV_MGMT = BIT(0), |
| @@ -1302,6 +1324,7 @@ enum ieee80211_key_flags { | |||
| 1302 | IEEE80211_KEY_FLAG_SW_MGMT_TX = BIT(4), | 1324 | IEEE80211_KEY_FLAG_SW_MGMT_TX = BIT(4), |
| 1303 | IEEE80211_KEY_FLAG_PUT_IV_SPACE = BIT(5), | 1325 | IEEE80211_KEY_FLAG_PUT_IV_SPACE = BIT(5), |
| 1304 | IEEE80211_KEY_FLAG_RX_MGMT = BIT(6), | 1326 | IEEE80211_KEY_FLAG_RX_MGMT = BIT(6), |
| 1327 | IEEE80211_KEY_FLAG_RESERVE_TAILROOM = BIT(7), | ||
| 1305 | }; | 1328 | }; |
| 1306 | 1329 | ||
| 1307 | /** | 1330 | /** |
| @@ -1580,11 +1603,6 @@ struct ieee80211_tx_control { | |||
| 1580 | * @IEEE80211_HW_MFP_CAPABLE: | 1603 | * @IEEE80211_HW_MFP_CAPABLE: |
| 1581 | * Hardware supports management frame protection (MFP, IEEE 802.11w). | 1604 | * Hardware supports management frame protection (MFP, IEEE 802.11w). |
| 1582 | * | 1605 | * |
| 1583 | * @IEEE80211_HW_SUPPORTS_UAPSD: | ||
| 1584 | * Hardware supports Unscheduled Automatic Power Save Delivery | ||
| 1585 | * (U-APSD) in managed mode. The mode is configured with | ||
| 1586 | * conf_tx() operation. | ||
| 1587 | * | ||
| 1588 | * @IEEE80211_HW_REPORTS_TX_ACK_STATUS: | 1606 | * @IEEE80211_HW_REPORTS_TX_ACK_STATUS: |
| 1589 | * Hardware can provide ack status reports of Tx frames to | 1607 | * Hardware can provide ack status reports of Tx frames to |
| 1590 | * the stack. | 1608 | * the stack. |
| @@ -1623,6 +1641,12 @@ struct ieee80211_tx_control { | |||
| 1623 | * be created. It is expected user-space will create vifs as | 1641 | * be created. It is expected user-space will create vifs as |
| 1624 | * desired (and thus have them named as desired). | 1642 | * desired (and thus have them named as desired). |
| 1625 | * | 1643 | * |
| 1644 | * @IEEE80211_HW_SW_CRYPTO_CONTROL: The driver wants to control which of the | ||
| 1645 | * crypto algorithms can be done in software - so don't automatically | ||
| 1646 | * try to fall back to it if hardware crypto fails, but do so only if | ||
| 1647 | * the driver returns 1. This also forces the driver to advertise its | ||
| 1648 | * supported cipher suites. | ||
| 1649 | * | ||
| 1626 | * @IEEE80211_HW_QUEUE_CONTROL: The driver wants to control per-interface | 1650 | * @IEEE80211_HW_QUEUE_CONTROL: The driver wants to control per-interface |
| 1627 | * queue mapping in order to use different queues (not just one per AC) | 1651 | * queue mapping in order to use different queues (not just one per AC) |
| 1628 | * for different virtual interfaces. See the doc section on HW queue | 1652 | * for different virtual interfaces. See the doc section on HW queue |
| @@ -1670,8 +1694,8 @@ enum ieee80211_hw_flags { | |||
| 1670 | IEEE80211_HW_MFP_CAPABLE = 1<<13, | 1694 | IEEE80211_HW_MFP_CAPABLE = 1<<13, |
| 1671 | IEEE80211_HW_WANT_MONITOR_VIF = 1<<14, | 1695 | IEEE80211_HW_WANT_MONITOR_VIF = 1<<14, |
| 1672 | IEEE80211_HW_NO_AUTO_VIF = 1<<15, | 1696 | IEEE80211_HW_NO_AUTO_VIF = 1<<15, |
| 1673 | /* free slot */ | 1697 | IEEE80211_HW_SW_CRYPTO_CONTROL = 1<<16, |
| 1674 | IEEE80211_HW_SUPPORTS_UAPSD = 1<<17, | 1698 | /* free slots */ |
| 1675 | IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, | 1699 | IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, |
| 1676 | IEEE80211_HW_CONNECTION_MONITOR = 1<<19, | 1700 | IEEE80211_HW_CONNECTION_MONITOR = 1<<19, |
| 1677 | IEEE80211_HW_QUEUE_CONTROL = 1<<20, | 1701 | IEEE80211_HW_QUEUE_CONTROL = 1<<20, |
| @@ -1945,6 +1969,11 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb); | |||
| 1945 | * added; if you return 0 then hw_key_idx must be assigned to the | 1969 | * added; if you return 0 then hw_key_idx must be assigned to the |
| 1946 | * hardware key index, you are free to use the full u8 range. | 1970 | * hardware key index, you are free to use the full u8 range. |
| 1947 | * | 1971 | * |
| 1972 | * Note that in the case that the @IEEE80211_HW_SW_CRYPTO_CONTROL flag is | ||
| 1973 | * set, mac80211 will not automatically fall back to software crypto if | ||
| 1974 | * enabling hardware crypto failed. The set_key() call may also return the | ||
| 1975 | * value 1 to permit this specific key/algorithm to be done in software. | ||
| 1976 | * | ||
| 1948 | * When the cmd is %DISABLE_KEY then it must succeed. | 1977 | * When the cmd is %DISABLE_KEY then it must succeed. |
| 1949 | * | 1978 | * |
| 1950 | * Note that it is permissible to not decrypt a frame even if a key | 1979 | * Note that it is permissible to not decrypt a frame even if a key |
| @@ -2023,7 +2052,7 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb); | |||
| 2023 | * enabled whenever user has enabled powersave. | 2052 | * enabled whenever user has enabled powersave. |
| 2024 | * | 2053 | * |
| 2025 | * Driver informs U-APSD client support by enabling | 2054 | * Driver informs U-APSD client support by enabling |
| 2026 | * %IEEE80211_HW_SUPPORTS_UAPSD flag. The mode is configured through the | 2055 | * %IEEE80211_VIF_SUPPORTS_UAPSD flag. The mode is configured through the |
| 2027 | * uapsd parameter in conf_tx() operation. Hardware needs to send the QoS | 2056 | * uapsd parameter in conf_tx() operation. Hardware needs to send the QoS |
| 2028 | * Nullfunc frames and stay awake until the service period has ended. To | 2057 | * Nullfunc frames and stay awake until the service period has ended. To |
| 2029 | * utilize U-APSD, dynamic powersave is disabled for voip AC and all frames | 2058 | * utilize U-APSD, dynamic powersave is disabled for voip AC and all frames |
| @@ -2696,6 +2725,14 @@ enum ieee80211_reconfig_type { | |||
| 2696 | * is only used if the configured rate control algorithm actually uses | 2725 | * is only used if the configured rate control algorithm actually uses |
| 2697 | * the new rate table API, and is therefore optional. Must be atomic. | 2726 | * the new rate table API, and is therefore optional. Must be atomic. |
| 2698 | * | 2727 | * |
| 2728 | * @sta_statistics: Get statistics for this station. For example with beacon | ||
| 2729 | * filtering, the statistics kept by mac80211 might not be accurate, so | ||
| 2730 | * let the driver pre-fill the statistics. The driver can fill most of | ||
| 2731 | * the values (indicating which by setting the filled bitmap), but not | ||
| 2732 | * all of them make sense - see the source for which ones are possible. | ||
| 2733 | * Statistics that the driver doesn't fill will be filled by mac80211. | ||
| 2734 | * The callback can sleep. | ||
| 2735 | * | ||
| 2699 | * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max), | 2736 | * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max), |
| 2700 | * bursting) for a hardware TX queue. | 2737 | * bursting) for a hardware TX queue. |
| 2701 | * Returns a negative error code on failure. | 2738 | * Returns a negative error code on failure. |
| @@ -2856,9 +2893,6 @@ enum ieee80211_reconfig_type { | |||
| 2856 | * @get_et_strings: Ethtool API to get a set of strings to describe stats | 2893 | * @get_et_strings: Ethtool API to get a set of strings to describe stats |
| 2857 | * and perhaps other supported types of ethtool data-sets. | 2894 | * and perhaps other supported types of ethtool data-sets. |
| 2858 | * | 2895 | * |
| 2859 | * @get_rssi: Get current signal strength in dBm, the function is optional | ||
| 2860 | * and can sleep. | ||
| 2861 | * | ||
| 2862 | * @mgd_prepare_tx: Prepare for transmitting a management frame for association | 2896 | * @mgd_prepare_tx: Prepare for transmitting a management frame for association |
| 2863 | * before associated. In multi-channel scenarios, a virtual interface is | 2897 | * before associated. In multi-channel scenarios, a virtual interface is |
| 2864 | * bound to a channel before it is associated, but as it isn't associated | 2898 | * bound to a channel before it is associated, but as it isn't associated |
| @@ -3059,6 +3093,10 @@ struct ieee80211_ops { | |||
| 3059 | void (*sta_rate_tbl_update)(struct ieee80211_hw *hw, | 3093 | void (*sta_rate_tbl_update)(struct ieee80211_hw *hw, |
| 3060 | struct ieee80211_vif *vif, | 3094 | struct ieee80211_vif *vif, |
| 3061 | struct ieee80211_sta *sta); | 3095 | struct ieee80211_sta *sta); |
| 3096 | void (*sta_statistics)(struct ieee80211_hw *hw, | ||
| 3097 | struct ieee80211_vif *vif, | ||
| 3098 | struct ieee80211_sta *sta, | ||
| 3099 | struct station_info *sinfo); | ||
| 3062 | int (*conf_tx)(struct ieee80211_hw *hw, | 3100 | int (*conf_tx)(struct ieee80211_hw *hw, |
| 3063 | struct ieee80211_vif *vif, u16 ac, | 3101 | struct ieee80211_vif *vif, u16 ac, |
| 3064 | const struct ieee80211_tx_queue_params *params); | 3102 | const struct ieee80211_tx_queue_params *params); |
| @@ -3126,8 +3164,6 @@ struct ieee80211_ops { | |||
| 3126 | void (*get_et_strings)(struct ieee80211_hw *hw, | 3164 | void (*get_et_strings)(struct ieee80211_hw *hw, |
| 3127 | struct ieee80211_vif *vif, | 3165 | struct ieee80211_vif *vif, |
| 3128 | u32 sset, u8 *data); | 3166 | u32 sset, u8 *data); |
| 3129 | int (*get_rssi)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | ||
| 3130 | struct ieee80211_sta *sta, s8 *rssi_dbm); | ||
| 3131 | 3167 | ||
| 3132 | void (*mgd_prepare_tx)(struct ieee80211_hw *hw, | 3168 | void (*mgd_prepare_tx)(struct ieee80211_hw *hw, |
| 3133 | struct ieee80211_vif *vif); | 3169 | struct ieee80211_vif *vif); |
| @@ -4062,6 +4098,10 @@ void ieee80211_aes_cmac_calculate_k1_k2(struct ieee80211_key_conf *keyconf, | |||
| 4062 | * reverse order than in packet) | 4098 | * reverse order than in packet) |
| 4063 | * @aes_cmac: PN data, most significant byte first (big endian, | 4099 | * @aes_cmac: PN data, most significant byte first (big endian, |
| 4064 | * reverse order than in packet) | 4100 | * reverse order than in packet) |
| 4101 | * @aes_gmac: PN data, most significant byte first (big endian, | ||
| 4102 | * reverse order than in packet) | ||
| 4103 | * @gcmp: PN data, most significant byte first (big endian, | ||
| 4104 | * reverse order than in packet) | ||
| 4065 | */ | 4105 | */ |
| 4066 | struct ieee80211_key_seq { | 4106 | struct ieee80211_key_seq { |
| 4067 | union { | 4107 | union { |
| @@ -4075,6 +4115,12 @@ struct ieee80211_key_seq { | |||
| 4075 | struct { | 4115 | struct { |
| 4076 | u8 pn[6]; | 4116 | u8 pn[6]; |
| 4077 | } aes_cmac; | 4117 | } aes_cmac; |
| 4118 | struct { | ||
| 4119 | u8 pn[6]; | ||
| 4120 | } aes_gmac; | ||
| 4121 | struct { | ||
| 4122 | u8 pn[6]; | ||
| 4123 | } gcmp; | ||
| 4078 | }; | 4124 | }; |
| 4079 | }; | 4125 | }; |
| 4080 | 4126 | ||
| @@ -4099,7 +4145,7 @@ void ieee80211_get_key_tx_seq(struct ieee80211_key_conf *keyconf, | |||
| 4099 | * ieee80211_get_key_rx_seq - get key RX sequence counter | 4145 | * ieee80211_get_key_rx_seq - get key RX sequence counter |
| 4100 | * | 4146 | * |
| 4101 | * @keyconf: the parameter passed with the set key | 4147 | * @keyconf: the parameter passed with the set key |
| 4102 | * @tid: The TID, or -1 for the management frame value (CCMP only); | 4148 | * @tid: The TID, or -1 for the management frame value (CCMP/GCMP only); |
| 4103 | * the value on TID 0 is also used for non-QoS frames. For | 4149 | * the value on TID 0 is also used for non-QoS frames. For |
| 4104 | * CMAC, only TID 0 is valid. | 4150 | * CMAC, only TID 0 is valid. |
| 4105 | * @seq: buffer to receive the sequence data | 4151 | * @seq: buffer to receive the sequence data |
| @@ -4135,7 +4181,7 @@ void ieee80211_set_key_tx_seq(struct ieee80211_key_conf *keyconf, | |||
| 4135 | * ieee80211_set_key_rx_seq - set key RX sequence counter | 4181 | * ieee80211_set_key_rx_seq - set key RX sequence counter |
| 4136 | * | 4182 | * |
| 4137 | * @keyconf: the parameter passed with the set key | 4183 | * @keyconf: the parameter passed with the set key |
| 4138 | * @tid: The TID, or -1 for the management frame value (CCMP only); | 4184 | * @tid: The TID, or -1 for the management frame value (CCMP/GCMP only); |
| 4139 | * the value on TID 0 is also used for non-QoS frames. For | 4185 | * the value on TID 0 is also used for non-QoS frames. For |
| 4140 | * CMAC, only TID 0 is valid. | 4186 | * CMAC, only TID 0 is valid. |
| 4141 | * @seq: new sequence data | 4187 | * @seq: new sequence data |
diff --git a/include/net/mac802154.h b/include/net/mac802154.h index c823d910b46c..850647811749 100644 --- a/include/net/mac802154.h +++ b/include/net/mac802154.h | |||
| @@ -20,6 +20,8 @@ | |||
| 20 | #include <linux/ieee802154.h> | 20 | #include <linux/ieee802154.h> |
| 21 | #include <linux/skbuff.h> | 21 | #include <linux/skbuff.h> |
| 22 | 22 | ||
| 23 | #include <net/cfg802154.h> | ||
| 24 | |||
| 23 | /* General MAC frame format: | 25 | /* General MAC frame format: |
| 24 | * 2 bytes: Frame Control | 26 | * 2 bytes: Frame Control |
| 25 | * 1 byte: Sequence Number | 27 | * 1 byte: Sequence Number |
| @@ -212,7 +214,8 @@ struct ieee802154_ops { | |||
| 212 | unsigned long changed); | 214 | unsigned long changed); |
| 213 | int (*set_txpower)(struct ieee802154_hw *hw, int db); | 215 | int (*set_txpower)(struct ieee802154_hw *hw, int db); |
| 214 | int (*set_lbt)(struct ieee802154_hw *hw, bool on); | 216 | int (*set_lbt)(struct ieee802154_hw *hw, bool on); |
| 215 | int (*set_cca_mode)(struct ieee802154_hw *hw, u8 mode); | 217 | int (*set_cca_mode)(struct ieee802154_hw *hw, |
| 218 | const struct wpan_phy_cca *cca); | ||
| 216 | int (*set_cca_ed_level)(struct ieee802154_hw *hw, | 219 | int (*set_cca_ed_level)(struct ieee802154_hw *hw, |
| 217 | s32 level); | 220 | s32 level); |
| 218 | int (*set_csma_params)(struct ieee802154_hw *hw, | 221 | int (*set_csma_params)(struct ieee802154_hw *hw, |
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 2e8756b8c775..36faf4990c4b 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h | |||
| @@ -60,6 +60,7 @@ struct net { | |||
| 60 | struct list_head exit_list; /* Use only net_mutex */ | 60 | struct list_head exit_list; /* Use only net_mutex */ |
| 61 | 61 | ||
| 62 | struct user_namespace *user_ns; /* Owning user namespace */ | 62 | struct user_namespace *user_ns; /* Owning user namespace */ |
| 63 | struct idr netns_ids; | ||
| 63 | 64 | ||
| 64 | struct ns_common ns; | 65 | struct ns_common ns; |
| 65 | 66 | ||
| @@ -290,6 +291,9 @@ static inline struct net *read_pnet(struct net * const *pnet) | |||
| 290 | #define __net_initconst __initconst | 291 | #define __net_initconst __initconst |
| 291 | #endif | 292 | #endif |
| 292 | 293 | ||
| 294 | int peernet2id(struct net *net, struct net *peer); | ||
| 295 | struct net *get_net_ns_by_id(struct net *net, int id); | ||
| 296 | |||
| 293 | struct pernet_operations { | 297 | struct pernet_operations { |
| 294 | struct list_head list; | 298 | struct list_head list; |
| 295 | int (*init)(struct net *net); | 299 | int (*init)(struct net *net); |
diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index f0daed2b54d1..74f271a172dd 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h | |||
| @@ -191,8 +191,6 @@ __nf_conntrack_find(struct net *net, u16 zone, | |||
| 191 | int nf_conntrack_hash_check_insert(struct nf_conn *ct); | 191 | int nf_conntrack_hash_check_insert(struct nf_conn *ct); |
| 192 | bool nf_ct_delete(struct nf_conn *ct, u32 pid, int report); | 192 | bool nf_ct_delete(struct nf_conn *ct, u32 pid, int report); |
| 193 | 193 | ||
| 194 | void nf_conntrack_flush_report(struct net *net, u32 portid, int report); | ||
| 195 | |||
| 196 | bool nf_ct_get_tuplepr(const struct sk_buff *skb, unsigned int nhoff, | 194 | bool nf_ct_get_tuplepr(const struct sk_buff *skb, unsigned int nhoff, |
| 197 | u_int16_t l3num, struct nf_conntrack_tuple *tuple); | 195 | u_int16_t l3num, struct nf_conntrack_tuple *tuple); |
| 198 | bool nf_ct_invert_tuplepr(struct nf_conntrack_tuple *inverse, | 196 | bool nf_ct_invert_tuplepr(struct nf_conntrack_tuple *inverse, |
diff --git a/include/net/netlink.h b/include/net/netlink.h index 64158353ecb2..e010ee8da41d 100644 --- a/include/net/netlink.h +++ b/include/net/netlink.h | |||
| @@ -490,14 +490,10 @@ static inline struct sk_buff *nlmsg_new(size_t payload, gfp_t flags) | |||
| 490 | * Corrects the netlink message header to include the appeneded | 490 | * Corrects the netlink message header to include the appeneded |
| 491 | * attributes. Only necessary if attributes have been added to | 491 | * attributes. Only necessary if attributes have been added to |
| 492 | * the message. | 492 | * the message. |
| 493 | * | ||
| 494 | * Returns the total data length of the skb. | ||
| 495 | */ | 493 | */ |
| 496 | static inline int nlmsg_end(struct sk_buff *skb, struct nlmsghdr *nlh) | 494 | static inline void nlmsg_end(struct sk_buff *skb, struct nlmsghdr *nlh) |
| 497 | { | 495 | { |
| 498 | nlh->nlmsg_len = skb_tail_pointer(skb) - (unsigned char *)nlh; | 496 | nlh->nlmsg_len = skb_tail_pointer(skb) - (unsigned char *)nlh; |
| 499 | |||
| 500 | return skb->len; | ||
| 501 | } | 497 | } |
| 502 | 498 | ||
| 503 | /** | 499 | /** |
| @@ -520,8 +516,10 @@ static inline void *nlmsg_get_pos(struct sk_buff *skb) | |||
| 520 | */ | 516 | */ |
| 521 | static inline void nlmsg_trim(struct sk_buff *skb, const void *mark) | 517 | static inline void nlmsg_trim(struct sk_buff *skb, const void *mark) |
| 522 | { | 518 | { |
| 523 | if (mark) | 519 | if (mark) { |
| 520 | WARN_ON((unsigned char *) mark < skb->data); | ||
| 524 | skb_trim(skb, (unsigned char *) mark - skb->data); | 521 | skb_trim(skb, (unsigned char *) mark - skb->data); |
| 522 | } | ||
| 525 | } | 523 | } |
| 526 | 524 | ||
| 527 | /** | 525 | /** |
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 0ffef1a38efc..dbe225478adb 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h | |||
| @@ -48,7 +48,8 @@ struct netns_ipv4 { | |||
| 48 | struct hlist_head *fib_table_hash; | 48 | struct hlist_head *fib_table_hash; |
| 49 | struct sock *fibnl; | 49 | struct sock *fibnl; |
| 50 | 50 | ||
| 51 | struct sock **icmp_sk; | 51 | struct sock * __percpu *icmp_sk; |
| 52 | |||
| 52 | struct inet_peer_base *peers; | 53 | struct inet_peer_base *peers; |
| 53 | struct tcpm_hash_bucket *tcp_metrics_hash; | 54 | struct tcpm_hash_bucket *tcp_metrics_hash; |
| 54 | unsigned int tcp_metrics_hash_log; | 55 | unsigned int tcp_metrics_hash_log; |
| @@ -81,6 +82,8 @@ struct netns_ipv4 { | |||
| 81 | 82 | ||
| 82 | int sysctl_fwmark_reflect; | 83 | int sysctl_fwmark_reflect; |
| 83 | int sysctl_tcp_fwmark_accept; | 84 | int sysctl_tcp_fwmark_accept; |
| 85 | int sysctl_tcp_mtu_probing; | ||
| 86 | int sysctl_tcp_base_mss; | ||
| 84 | 87 | ||
| 85 | struct ping_group_range ping_group_range; | 88 | struct ping_group_range ping_group_range; |
| 86 | 89 | ||
diff --git a/include/net/nfc/hci.h b/include/net/nfc/hci.h index 14bd0e1c47fa..ab672b537dd4 100644 --- a/include/net/nfc/hci.h +++ b/include/net/nfc/hci.h | |||
| @@ -51,8 +51,10 @@ struct nfc_hci_ops { | |||
| 51 | int (*tm_send)(struct nfc_hci_dev *hdev, struct sk_buff *skb); | 51 | int (*tm_send)(struct nfc_hci_dev *hdev, struct sk_buff *skb); |
| 52 | int (*check_presence)(struct nfc_hci_dev *hdev, | 52 | int (*check_presence)(struct nfc_hci_dev *hdev, |
| 53 | struct nfc_target *target); | 53 | struct nfc_target *target); |
| 54 | int (*event_received)(struct nfc_hci_dev *hdev, u8 gate, u8 event, | 54 | int (*event_received)(struct nfc_hci_dev *hdev, u8 pipe, u8 event, |
| 55 | struct sk_buff *skb); | 55 | struct sk_buff *skb); |
| 56 | void (*cmd_received)(struct nfc_hci_dev *hdev, u8 pipe, u8 cmd, | ||
| 57 | struct sk_buff *skb); | ||
| 56 | int (*fw_download)(struct nfc_hci_dev *hdev, const char *firmware_name); | 58 | int (*fw_download)(struct nfc_hci_dev *hdev, const char *firmware_name); |
| 57 | int (*discover_se)(struct nfc_hci_dev *dev); | 59 | int (*discover_se)(struct nfc_hci_dev *dev); |
| 58 | int (*enable_se)(struct nfc_hci_dev *dev, u32 se_idx); | 60 | int (*enable_se)(struct nfc_hci_dev *dev, u32 se_idx); |
| @@ -63,8 +65,10 @@ struct nfc_hci_ops { | |||
| 63 | }; | 65 | }; |
| 64 | 66 | ||
| 65 | /* Pipes */ | 67 | /* Pipes */ |
| 66 | #define NFC_HCI_INVALID_PIPE 0x80 | ||
| 67 | #define NFC_HCI_DO_NOT_CREATE_PIPE 0x81 | 68 | #define NFC_HCI_DO_NOT_CREATE_PIPE 0x81 |
| 69 | #define NFC_HCI_INVALID_PIPE 0x80 | ||
| 70 | #define NFC_HCI_INVALID_GATE 0xFF | ||
| 71 | #define NFC_HCI_INVALID_HOST 0x80 | ||
| 68 | #define NFC_HCI_LINK_MGMT_PIPE 0x00 | 72 | #define NFC_HCI_LINK_MGMT_PIPE 0x00 |
| 69 | #define NFC_HCI_ADMIN_PIPE 0x01 | 73 | #define NFC_HCI_ADMIN_PIPE 0x01 |
| 70 | 74 | ||
| @@ -73,7 +77,13 @@ struct nfc_hci_gate { | |||
| 73 | u8 pipe; | 77 | u8 pipe; |
| 74 | }; | 78 | }; |
| 75 | 79 | ||
| 80 | struct nfc_hci_pipe { | ||
| 81 | u8 gate; | ||
| 82 | u8 dest_host; | ||
| 83 | }; | ||
| 84 | |||
| 76 | #define NFC_HCI_MAX_CUSTOM_GATES 50 | 85 | #define NFC_HCI_MAX_CUSTOM_GATES 50 |
| 86 | #define NFC_HCI_MAX_PIPES 127 | ||
| 77 | struct nfc_hci_init_data { | 87 | struct nfc_hci_init_data { |
| 78 | u8 gate_count; | 88 | u8 gate_count; |
| 79 | struct nfc_hci_gate gates[NFC_HCI_MAX_CUSTOM_GATES]; | 89 | struct nfc_hci_gate gates[NFC_HCI_MAX_CUSTOM_GATES]; |
| @@ -125,6 +135,7 @@ struct nfc_hci_dev { | |||
| 125 | void *clientdata; | 135 | void *clientdata; |
| 126 | 136 | ||
| 127 | u8 gate2pipe[NFC_HCI_MAX_GATES]; | 137 | u8 gate2pipe[NFC_HCI_MAX_GATES]; |
| 138 | struct nfc_hci_pipe pipes[NFC_HCI_MAX_PIPES]; | ||
| 128 | 139 | ||
| 129 | u8 sw_romlib; | 140 | u8 sw_romlib; |
| 130 | u8 sw_patch; | 141 | u8 sw_patch; |
| @@ -167,6 +178,8 @@ void *nfc_hci_get_clientdata(struct nfc_hci_dev *hdev); | |||
| 167 | void nfc_hci_driver_failure(struct nfc_hci_dev *hdev, int err); | 178 | void nfc_hci_driver_failure(struct nfc_hci_dev *hdev, int err); |
| 168 | 179 | ||
| 169 | int nfc_hci_result_to_errno(u8 result); | 180 | int nfc_hci_result_to_errno(u8 result); |
| 181 | void nfc_hci_reset_pipes(struct nfc_hci_dev *dev); | ||
| 182 | void nfc_hci_reset_pipes_per_host(struct nfc_hci_dev *hdev, u8 host); | ||
| 170 | 183 | ||
| 171 | /* Host IDs */ | 184 | /* Host IDs */ |
| 172 | #define NFC_HCI_HOST_CONTROLLER_ID 0x00 | 185 | #define NFC_HCI_HOST_CONTROLLER_ID 0x00 |
| @@ -219,6 +232,12 @@ int nfc_hci_result_to_errno(u8 result); | |||
| 219 | #define NFC_HCI_EVT_POST_DATA 0x02 | 232 | #define NFC_HCI_EVT_POST_DATA 0x02 |
| 220 | #define NFC_HCI_EVT_HOT_PLUG 0x03 | 233 | #define NFC_HCI_EVT_HOT_PLUG 0x03 |
| 221 | 234 | ||
| 235 | /* Generic commands */ | ||
| 236 | #define NFC_HCI_ANY_SET_PARAMETER 0x01 | ||
| 237 | #define NFC_HCI_ANY_GET_PARAMETER 0x02 | ||
| 238 | #define NFC_HCI_ANY_OPEN_PIPE 0x03 | ||
| 239 | #define NFC_HCI_ANY_CLOSE_PIPE 0x04 | ||
| 240 | |||
| 222 | /* Reader RF gates events */ | 241 | /* Reader RF gates events */ |
| 223 | #define NFC_HCI_EVT_READER_REQUESTED 0x10 | 242 | #define NFC_HCI_EVT_READER_REQUESTED 0x10 |
| 224 | #define NFC_HCI_EVT_END_OPERATION 0x11 | 243 | #define NFC_HCI_EVT_END_OPERATION 0x11 |
| @@ -249,8 +268,6 @@ int nfc_hci_send_cmd(struct nfc_hci_dev *hdev, u8 gate, u8 cmd, | |||
| 249 | int nfc_hci_send_cmd_async(struct nfc_hci_dev *hdev, u8 gate, u8 cmd, | 268 | int nfc_hci_send_cmd_async(struct nfc_hci_dev *hdev, u8 gate, u8 cmd, |
| 250 | const u8 *param, size_t param_len, | 269 | const u8 *param, size_t param_len, |
| 251 | data_exchange_cb_t cb, void *cb_context); | 270 | data_exchange_cb_t cb, void *cb_context); |
| 252 | int nfc_hci_send_response(struct nfc_hci_dev *hdev, u8 gate, u8 response, | ||
| 253 | const u8 *param, size_t param_len); | ||
| 254 | int nfc_hci_send_event(struct nfc_hci_dev *hdev, u8 gate, u8 event, | 271 | int nfc_hci_send_event(struct nfc_hci_dev *hdev, u8 gate, u8 event, |
| 255 | const u8 *param, size_t param_len); | 272 | const u8 *param, size_t param_len); |
| 256 | int nfc_hci_target_discovered(struct nfc_hci_dev *hdev, u8 gate); | 273 | int nfc_hci_target_discovered(struct nfc_hci_dev *hdev, u8 gate); |
diff --git a/include/net/nfc/nci.h b/include/net/nfc/nci.h index e7257a4653b4..a2f2f3d3196d 100644 --- a/include/net/nfc/nci.h +++ b/include/net/nfc/nci.h | |||
| @@ -62,6 +62,25 @@ | |||
| 62 | #define NCI_STATUS_NFCEE_PROTOCOL_ERROR 0xc2 | 62 | #define NCI_STATUS_NFCEE_PROTOCOL_ERROR 0xc2 |
| 63 | #define NCI_STATUS_NFCEE_TIMEOUT_ERROR 0xc3 | 63 | #define NCI_STATUS_NFCEE_TIMEOUT_ERROR 0xc3 |
| 64 | 64 | ||
| 65 | /* NFCEE Interface/Protocols */ | ||
| 66 | #define NCI_NFCEE_INTERFACE_APDU 0x00 | ||
| 67 | #define NCI_NFCEE_INTERFACE_HCI_ACCESS 0x01 | ||
| 68 | #define NCI_NFCEE_INTERFACE_TYPE3_CMD_SET 0x02 | ||
| 69 | #define NCI_NFCEE_INTERFACE_TRANSPARENT 0x03 | ||
| 70 | |||
| 71 | /* Destination type */ | ||
| 72 | #define NCI_DESTINATION_NFCC_LOOPBACK 0x01 | ||
| 73 | #define NCI_DESTINATION_REMOTE_NFC_ENDPOINT 0x02 | ||
| 74 | #define NCI_DESTINATION_NFCEE 0x03 | ||
| 75 | |||
| 76 | /* Destination-specific parameters type */ | ||
| 77 | #define NCI_DESTINATION_SPECIFIC_PARAM_RF_TYPE 0x00 | ||
| 78 | #define NCI_DESTINATION_SPECIFIC_PARAM_NFCEE_TYPE 0x01 | ||
| 79 | |||
| 80 | /* NFCEE Discovery Action */ | ||
| 81 | #define NCI_NFCEE_DISCOVERY_ACTION_DISABLE 0x00 | ||
| 82 | #define NCI_NFCEE_DISCOVERY_ACTION_ENABLE 0x01 | ||
| 83 | |||
| 65 | /* NCI RF Technology and Mode */ | 84 | /* NCI RF Technology and Mode */ |
| 66 | #define NCI_NFC_A_PASSIVE_POLL_MODE 0x00 | 85 | #define NCI_NFC_A_PASSIVE_POLL_MODE 0x00 |
| 67 | #define NCI_NFC_B_PASSIVE_POLL_MODE 0x01 | 86 | #define NCI_NFC_B_PASSIVE_POLL_MODE 0x01 |
| @@ -224,6 +243,28 @@ struct nci_core_set_config_cmd { | |||
| 224 | struct set_config_param param; /* support 1 param per cmd is enough */ | 243 | struct set_config_param param; /* support 1 param per cmd is enough */ |
| 225 | } __packed; | 244 | } __packed; |
| 226 | 245 | ||
| 246 | #define NCI_OP_CORE_CONN_CREATE_CMD nci_opcode_pack(NCI_GID_CORE, 0x04) | ||
| 247 | #define DEST_SPEC_PARAMS_ID_INDEX 0 | ||
| 248 | #define DEST_SPEC_PARAMS_PROTOCOL_INDEX 1 | ||
| 249 | struct dest_spec_params { | ||
| 250 | __u8 id; | ||
| 251 | __u8 protocol; | ||
| 252 | } __packed; | ||
| 253 | |||
| 254 | struct core_conn_create_dest_spec_params { | ||
| 255 | __u8 type; | ||
| 256 | __u8 length; | ||
| 257 | __u8 value[0]; | ||
| 258 | } __packed; | ||
| 259 | |||
| 260 | struct nci_core_conn_create_cmd { | ||
| 261 | __u8 destination_type; | ||
| 262 | __u8 number_destination_params; | ||
| 263 | struct core_conn_create_dest_spec_params params[0]; | ||
| 264 | } __packed; | ||
| 265 | |||
| 266 | #define NCI_OP_CORE_CONN_CLOSE_CMD nci_opcode_pack(NCI_GID_CORE, 0x05) | ||
| 267 | |||
| 227 | #define NCI_OP_RF_DISCOVER_MAP_CMD nci_opcode_pack(NCI_GID_RF_MGMT, 0x00) | 268 | #define NCI_OP_RF_DISCOVER_MAP_CMD nci_opcode_pack(NCI_GID_RF_MGMT, 0x00) |
| 228 | struct disc_map_config { | 269 | struct disc_map_config { |
| 229 | __u8 rf_protocol; | 270 | __u8 rf_protocol; |
| @@ -260,6 +301,19 @@ struct nci_rf_deactivate_cmd { | |||
| 260 | __u8 type; | 301 | __u8 type; |
| 261 | } __packed; | 302 | } __packed; |
| 262 | 303 | ||
| 304 | #define NCI_OP_NFCEE_DISCOVER_CMD nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x00) | ||
| 305 | struct nci_nfcee_discover_cmd { | ||
| 306 | __u8 discovery_action; | ||
| 307 | } __packed; | ||
| 308 | |||
| 309 | #define NCI_OP_NFCEE_MODE_SET_CMD nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x01) | ||
| 310 | #define NCI_NFCEE_DISABLE 0x00 | ||
| 311 | #define NCI_NFCEE_ENABLE 0x01 | ||
| 312 | struct nci_nfcee_mode_set_cmd { | ||
| 313 | __u8 nfcee_id; | ||
| 314 | __u8 nfcee_mode; | ||
| 315 | } __packed; | ||
| 316 | |||
| 263 | /* ----------------------- */ | 317 | /* ----------------------- */ |
| 264 | /* ---- NCI Responses ---- */ | 318 | /* ---- NCI Responses ---- */ |
| 265 | /* ----------------------- */ | 319 | /* ----------------------- */ |
| @@ -295,6 +349,16 @@ struct nci_core_set_config_rsp { | |||
| 295 | __u8 params_id[0]; /* variable size array */ | 349 | __u8 params_id[0]; /* variable size array */ |
| 296 | } __packed; | 350 | } __packed; |
| 297 | 351 | ||
| 352 | #define NCI_OP_CORE_CONN_CREATE_RSP nci_opcode_pack(NCI_GID_CORE, 0x04) | ||
| 353 | struct nci_core_conn_create_rsp { | ||
| 354 | __u8 status; | ||
| 355 | __u8 max_ctrl_pkt_payload_len; | ||
| 356 | __u8 credits_cnt; | ||
| 357 | __u8 conn_id; | ||
| 358 | } __packed; | ||
| 359 | |||
| 360 | #define NCI_OP_CORE_CONN_CLOSE_RSP nci_opcode_pack(NCI_GID_CORE, 0x05) | ||
| 361 | |||
| 298 | #define NCI_OP_RF_DISCOVER_MAP_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x00) | 362 | #define NCI_OP_RF_DISCOVER_MAP_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x00) |
| 299 | 363 | ||
| 300 | #define NCI_OP_RF_DISCOVER_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x03) | 364 | #define NCI_OP_RF_DISCOVER_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x03) |
| @@ -303,6 +367,13 @@ struct nci_core_set_config_rsp { | |||
| 303 | 367 | ||
| 304 | #define NCI_OP_RF_DEACTIVATE_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x06) | 368 | #define NCI_OP_RF_DEACTIVATE_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x06) |
| 305 | 369 | ||
| 370 | #define NCI_OP_NFCEE_DISCOVER_RSP nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x00) | ||
| 371 | struct nci_nfcee_discover_rsp { | ||
| 372 | __u8 status; | ||
| 373 | __u8 num_nfcee; | ||
| 374 | } __packed; | ||
| 375 | |||
| 376 | #define NCI_OP_NFCEE_MODE_SET_RSP nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x01) | ||
| 306 | /* --------------------------- */ | 377 | /* --------------------------- */ |
| 307 | /* ---- NCI Notifications ---- */ | 378 | /* ---- NCI Notifications ---- */ |
| 308 | /* --------------------------- */ | 379 | /* --------------------------- */ |
| @@ -430,4 +501,30 @@ struct nci_rf_deactivate_ntf { | |||
| 430 | __u8 reason; | 501 | __u8 reason; |
| 431 | } __packed; | 502 | } __packed; |
| 432 | 503 | ||
| 504 | #define NCI_OP_RF_NFCEE_ACTION_NTF nci_opcode_pack(NCI_GID_RF_MGMT, 0x09) | ||
| 505 | struct nci_rf_nfcee_action_ntf { | ||
| 506 | __u8 nfcee_id; | ||
| 507 | __u8 trigger; | ||
| 508 | __u8 supported_data_length; | ||
| 509 | __u8 supported_data[0]; | ||
| 510 | } __packed; | ||
| 511 | |||
| 512 | #define NCI_OP_NFCEE_DISCOVER_NTF nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x00) | ||
| 513 | struct nci_nfcee_supported_protocol { | ||
| 514 | __u8 num_protocol; | ||
| 515 | __u8 supported_protocol[0]; | ||
| 516 | } __packed; | ||
| 517 | |||
| 518 | struct nci_nfcee_information_tlv { | ||
| 519 | __u8 num_tlv; | ||
| 520 | __u8 information_tlv[0]; | ||
| 521 | } __packed; | ||
| 522 | |||
| 523 | struct nci_nfcee_discover_ntf { | ||
| 524 | __u8 nfcee_id; | ||
| 525 | __u8 nfcee_status; | ||
| 526 | struct nci_nfcee_supported_protocol supported_protocols; | ||
| 527 | struct nci_nfcee_information_tlv information_tlv; | ||
| 528 | } __packed; | ||
| 529 | |||
| 433 | #endif /* __NCI_H */ | 530 | #endif /* __NCI_H */ |
diff --git a/include/net/nfc/nci_core.h b/include/net/nfc/nci_core.h index 9e51bb4d841e..ff87f8611fa3 100644 --- a/include/net/nfc/nci_core.h +++ b/include/net/nfc/nci_core.h | |||
| @@ -78,15 +78,107 @@ struct nci_ops { | |||
| 78 | int (*se_io)(struct nci_dev *ndev, u32 se_idx, | 78 | int (*se_io)(struct nci_dev *ndev, u32 se_idx, |
| 79 | u8 *apdu, size_t apdu_length, | 79 | u8 *apdu, size_t apdu_length, |
| 80 | se_io_cb_t cb, void *cb_context); | 80 | se_io_cb_t cb, void *cb_context); |
| 81 | int (*hci_load_session)(struct nci_dev *ndev); | ||
| 82 | void (*hci_event_received)(struct nci_dev *ndev, u8 pipe, u8 event, | ||
| 83 | struct sk_buff *skb); | ||
| 84 | void (*hci_cmd_received)(struct nci_dev *ndev, u8 pipe, u8 cmd, | ||
| 85 | struct sk_buff *skb); | ||
| 81 | }; | 86 | }; |
| 82 | 87 | ||
| 83 | #define NCI_MAX_SUPPORTED_RF_INTERFACES 4 | 88 | #define NCI_MAX_SUPPORTED_RF_INTERFACES 4 |
| 84 | #define NCI_MAX_DISCOVERED_TARGETS 10 | 89 | #define NCI_MAX_DISCOVERED_TARGETS 10 |
| 90 | #define NCI_MAX_NUM_NFCEE 255 | ||
| 91 | #define NCI_MAX_CONN_ID 7 | ||
| 92 | |||
| 93 | struct nci_conn_info { | ||
| 94 | struct list_head list; | ||
| 95 | __u8 id; /* can be an RF Discovery ID or an NFCEE ID */ | ||
| 96 | __u8 conn_id; | ||
| 97 | __u8 max_pkt_payload_len; | ||
| 98 | |||
| 99 | atomic_t credits_cnt; | ||
| 100 | __u8 initial_num_credits; | ||
| 101 | |||
| 102 | data_exchange_cb_t data_exchange_cb; | ||
| 103 | void *data_exchange_cb_context; | ||
| 104 | |||
| 105 | struct sk_buff *rx_skb; | ||
| 106 | }; | ||
| 107 | |||
| 108 | #define NCI_INVALID_CONN_ID 0x80 | ||
| 109 | |||
| 110 | #define NCI_HCI_ANY_OPEN_PIPE 0x03 | ||
| 111 | |||
| 112 | /* Gates */ | ||
| 113 | #define NCI_HCI_ADMIN_GATE 0x00 | ||
| 114 | #define NCI_HCI_LINK_MGMT_GATE 0x06 | ||
| 115 | |||
| 116 | /* Pipes */ | ||
| 117 | #define NCI_HCI_LINK_MGMT_PIPE 0x00 | ||
| 118 | #define NCI_HCI_ADMIN_PIPE 0x01 | ||
| 119 | |||
| 120 | /* Generic responses */ | ||
| 121 | #define NCI_HCI_ANY_OK 0x00 | ||
| 122 | #define NCI_HCI_ANY_E_NOT_CONNECTED 0x01 | ||
| 123 | #define NCI_HCI_ANY_E_CMD_PAR_UNKNOWN 0x02 | ||
| 124 | #define NCI_HCI_ANY_E_NOK 0x03 | ||
| 125 | #define NCI_HCI_ANY_E_PIPES_FULL 0x04 | ||
| 126 | #define NCI_HCI_ANY_E_REG_PAR_UNKNOWN 0x05 | ||
| 127 | #define NCI_HCI_ANY_E_PIPE_NOT_OPENED 0x06 | ||
| 128 | #define NCI_HCI_ANY_E_CMD_NOT_SUPPORTED 0x07 | ||
| 129 | #define NCI_HCI_ANY_E_INHIBITED 0x08 | ||
| 130 | #define NCI_HCI_ANY_E_TIMEOUT 0x09 | ||
| 131 | #define NCI_HCI_ANY_E_REG_ACCESS_DENIED 0x0a | ||
| 132 | #define NCI_HCI_ANY_E_PIPE_ACCESS_DENIED 0x0b | ||
| 133 | |||
| 134 | #define NCI_HCI_DO_NOT_OPEN_PIPE 0x81 | ||
| 135 | #define NCI_HCI_INVALID_PIPE 0x80 | ||
| 136 | #define NCI_HCI_INVALID_GATE 0xFF | ||
| 137 | #define NCI_HCI_INVALID_HOST 0x80 | ||
| 138 | |||
| 139 | #define NCI_HCI_MAX_CUSTOM_GATES 50 | ||
| 140 | #define NCI_HCI_MAX_PIPES 127 | ||
| 141 | |||
| 142 | struct nci_hci_gate { | ||
| 143 | u8 gate; | ||
| 144 | u8 pipe; | ||
| 145 | u8 dest_host; | ||
| 146 | } __packed; | ||
| 147 | |||
| 148 | struct nci_hci_pipe { | ||
| 149 | u8 gate; | ||
| 150 | u8 host; | ||
| 151 | } __packed; | ||
| 152 | |||
| 153 | struct nci_hci_init_data { | ||
| 154 | u8 gate_count; | ||
| 155 | struct nci_hci_gate gates[NCI_HCI_MAX_CUSTOM_GATES]; | ||
| 156 | char session_id[9]; | ||
| 157 | }; | ||
| 158 | |||
| 159 | #define NCI_HCI_MAX_GATES 256 | ||
| 160 | |||
| 161 | struct nci_hci_dev { | ||
| 162 | u8 nfcee_id; | ||
| 163 | struct nci_dev *ndev; | ||
| 164 | struct nci_conn_info *conn_info; | ||
| 165 | |||
| 166 | struct nci_hci_init_data init_data; | ||
| 167 | struct nci_hci_pipe pipes[NCI_HCI_MAX_PIPES]; | ||
| 168 | u8 gate2pipe[NCI_HCI_MAX_GATES]; | ||
| 169 | int expected_pipes; | ||
| 170 | int count_pipes; | ||
| 171 | |||
| 172 | struct sk_buff_head rx_hcp_frags; | ||
| 173 | struct work_struct msg_rx_work; | ||
| 174 | struct sk_buff_head msg_rx_queue; | ||
| 175 | }; | ||
| 85 | 176 | ||
| 86 | /* NCI Core structures */ | 177 | /* NCI Core structures */ |
| 87 | struct nci_dev { | 178 | struct nci_dev { |
| 88 | struct nfc_dev *nfc_dev; | 179 | struct nfc_dev *nfc_dev; |
| 89 | struct nci_ops *ops; | 180 | struct nci_ops *ops; |
| 181 | struct nci_hci_dev *hci_dev; | ||
| 90 | 182 | ||
| 91 | int tx_headroom; | 183 | int tx_headroom; |
| 92 | int tx_tailroom; | 184 | int tx_tailroom; |
| @@ -95,7 +187,10 @@ struct nci_dev { | |||
| 95 | unsigned long flags; | 187 | unsigned long flags; |
| 96 | 188 | ||
| 97 | atomic_t cmd_cnt; | 189 | atomic_t cmd_cnt; |
| 98 | atomic_t credits_cnt; | 190 | __u8 cur_conn_id; |
| 191 | |||
| 192 | struct list_head conn_info_list; | ||
| 193 | struct nci_conn_info *rf_conn_info; | ||
| 99 | 194 | ||
| 100 | struct timer_list cmd_timer; | 195 | struct timer_list cmd_timer; |
| 101 | struct timer_list data_timer; | 196 | struct timer_list data_timer; |
| @@ -141,13 +236,10 @@ struct nci_dev { | |||
| 141 | __u8 manufact_id; | 236 | __u8 manufact_id; |
| 142 | __u32 manufact_specific_info; | 237 | __u32 manufact_specific_info; |
| 143 | 238 | ||
| 144 | /* received during NCI_OP_RF_INTF_ACTIVATED_NTF */ | 239 | /* Save RF Discovery ID or NFCEE ID under conn_create */ |
| 145 | __u8 max_data_pkt_payload_size; | 240 | __u8 cur_id; |
| 146 | __u8 initial_num_credits; | ||
| 147 | 241 | ||
| 148 | /* stored during nci_data_exchange */ | 242 | /* stored during nci_data_exchange */ |
| 149 | data_exchange_cb_t data_exchange_cb; | ||
| 150 | void *data_exchange_cb_context; | ||
| 151 | struct sk_buff *rx_data_reassembly; | 243 | struct sk_buff *rx_data_reassembly; |
| 152 | 244 | ||
| 153 | /* stored during intf_activated_ntf */ | 245 | /* stored during intf_activated_ntf */ |
| @@ -163,9 +255,36 @@ struct nci_dev *nci_allocate_device(struct nci_ops *ops, | |||
| 163 | void nci_free_device(struct nci_dev *ndev); | 255 | void nci_free_device(struct nci_dev *ndev); |
| 164 | int nci_register_device(struct nci_dev *ndev); | 256 | int nci_register_device(struct nci_dev *ndev); |
| 165 | void nci_unregister_device(struct nci_dev *ndev); | 257 | void nci_unregister_device(struct nci_dev *ndev); |
| 258 | int nci_request(struct nci_dev *ndev, | ||
| 259 | void (*req)(struct nci_dev *ndev, | ||
| 260 | unsigned long opt), | ||
| 261 | unsigned long opt, __u32 timeout); | ||
| 166 | int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb); | 262 | int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb); |
| 167 | int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, __u8 *val); | 263 | int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, __u8 *val); |
| 168 | 264 | ||
| 265 | int nci_nfcee_discover(struct nci_dev *ndev, u8 action); | ||
| 266 | int nci_nfcee_mode_set(struct nci_dev *ndev, u8 nfcee_id, u8 nfcee_mode); | ||
| 267 | int nci_core_conn_create(struct nci_dev *ndev, u8 destination_type, | ||
| 268 | u8 number_destination_params, | ||
| 269 | size_t params_len, | ||
| 270 | struct core_conn_create_dest_spec_params *params); | ||
| 271 | int nci_core_conn_close(struct nci_dev *ndev, u8 conn_id); | ||
| 272 | |||
| 273 | struct nci_hci_dev *nci_hci_allocate(struct nci_dev *ndev); | ||
| 274 | int nci_hci_send_event(struct nci_dev *ndev, u8 gate, u8 event, | ||
| 275 | const u8 *param, size_t param_len); | ||
| 276 | int nci_hci_send_cmd(struct nci_dev *ndev, u8 gate, | ||
| 277 | u8 cmd, const u8 *param, size_t param_len, | ||
| 278 | struct sk_buff **skb); | ||
| 279 | int nci_hci_open_pipe(struct nci_dev *ndev, u8 pipe); | ||
| 280 | int nci_hci_connect_gate(struct nci_dev *ndev, u8 dest_host, | ||
| 281 | u8 dest_gate, u8 pipe); | ||
| 282 | int nci_hci_set_param(struct nci_dev *ndev, u8 gate, u8 idx, | ||
| 283 | const u8 *param, size_t param_len); | ||
| 284 | int nci_hci_get_param(struct nci_dev *ndev, u8 gate, u8 idx, | ||
| 285 | struct sk_buff **skb); | ||
| 286 | int nci_hci_dev_session_init(struct nci_dev *ndev); | ||
| 287 | |||
| 169 | static inline struct sk_buff *nci_skb_alloc(struct nci_dev *ndev, | 288 | static inline struct sk_buff *nci_skb_alloc(struct nci_dev *ndev, |
| 170 | unsigned int len, | 289 | unsigned int len, |
| 171 | gfp_t how) | 290 | gfp_t how) |
| @@ -200,7 +319,9 @@ void nci_rx_data_packet(struct nci_dev *ndev, struct sk_buff *skb); | |||
| 200 | int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload); | 319 | int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload); |
| 201 | int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb); | 320 | int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb); |
| 202 | void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb, | 321 | void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb, |
| 203 | int err); | 322 | __u8 conn_id, int err); |
| 323 | void nci_hci_data_received_cb(void *context, struct sk_buff *skb, int err); | ||
| 324 | |||
| 204 | void nci_clear_target_list(struct nci_dev *ndev); | 325 | void nci_clear_target_list(struct nci_dev *ndev); |
| 205 | 326 | ||
| 206 | /* ----- NCI requests ----- */ | 327 | /* ----- NCI requests ----- */ |
| @@ -209,6 +330,8 @@ void nci_clear_target_list(struct nci_dev *ndev); | |||
| 209 | #define NCI_REQ_CANCELED 2 | 330 | #define NCI_REQ_CANCELED 2 |
| 210 | 331 | ||
| 211 | void nci_req_complete(struct nci_dev *ndev, int result); | 332 | void nci_req_complete(struct nci_dev *ndev, int result); |
| 333 | struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev, | ||
| 334 | int conn_id); | ||
| 212 | 335 | ||
| 213 | /* ----- NCI status code ----- */ | 336 | /* ----- NCI status code ----- */ |
| 214 | int nci_to_errno(__u8 code); | 337 | int nci_to_errno(__u8 code); |
diff --git a/include/net/nfc/nfc.h b/include/net/nfc/nfc.h index 12adb817c27a..73190e65d5c1 100644 --- a/include/net/nfc/nfc.h +++ b/include/net/nfc/nfc.h | |||
| @@ -135,6 +135,31 @@ struct nfc_se { | |||
| 135 | u16 state; | 135 | u16 state; |
| 136 | }; | 136 | }; |
| 137 | 137 | ||
| 138 | /** | ||
| 139 | * nfc_evt_transaction - A struct for NFC secure element event transaction. | ||
| 140 | * | ||
| 141 | * @aid: The application identifier triggering the event | ||
| 142 | * | ||
| 143 | * @aid_len: The application identifier length [5:16] | ||
| 144 | * | ||
| 145 | * @params: The application parameters transmitted during the transaction | ||
| 146 | * | ||
| 147 | * @params_len: The applications parameters length [0:255] | ||
| 148 | * | ||
| 149 | */ | ||
| 150 | #define NFC_MIN_AID_LENGTH 5 | ||
| 151 | #define NFC_MAX_AID_LENGTH 16 | ||
| 152 | #define NFC_MAX_PARAMS_LENGTH 255 | ||
| 153 | |||
| 154 | #define NFC_EVT_TRANSACTION_AID_TAG 0x81 | ||
| 155 | #define NFC_EVT_TRANSACTION_PARAMS_TAG 0x82 | ||
| 156 | struct nfc_evt_transaction { | ||
| 157 | u32 aid_len; | ||
| 158 | u8 aid[NFC_MAX_AID_LENGTH]; | ||
| 159 | u8 params_len; | ||
| 160 | u8 params[NFC_MAX_PARAMS_LENGTH]; | ||
| 161 | } __packed; | ||
| 162 | |||
| 138 | struct nfc_genl_data { | 163 | struct nfc_genl_data { |
| 139 | u32 poll_req_portid; | 164 | u32 poll_req_portid; |
| 140 | struct mutex genl_data_mutex; | 165 | struct mutex genl_data_mutex; |
| @@ -262,6 +287,8 @@ int nfc_tm_data_received(struct nfc_dev *dev, struct sk_buff *skb); | |||
| 262 | 287 | ||
| 263 | void nfc_driver_failure(struct nfc_dev *dev, int err); | 288 | void nfc_driver_failure(struct nfc_dev *dev, int err); |
| 264 | 289 | ||
| 290 | int nfc_se_transaction(struct nfc_dev *dev, u8 se_idx, | ||
| 291 | struct nfc_evt_transaction *evt_transaction); | ||
| 265 | int nfc_add_se(struct nfc_dev *dev, u32 se_idx, u16 type); | 292 | int nfc_add_se(struct nfc_dev *dev, u32 se_idx, u16 type); |
| 266 | int nfc_remove_se(struct nfc_dev *dev, u32 se_idx); | 293 | int nfc_remove_se(struct nfc_dev *dev, u32 se_idx); |
| 267 | struct nfc_se *nfc_find_se(struct nfc_dev *dev, u32 se_idx); | 294 | struct nfc_se *nfc_find_se(struct nfc_dev *dev, u32 se_idx); |
diff --git a/include/net/nl802154.h b/include/net/nl802154.h index 6dbd406ca41b..f8b5bc997959 100644 --- a/include/net/nl802154.h +++ b/include/net/nl802154.h | |||
| @@ -82,7 +82,7 @@ enum nl802154_attrs { | |||
| 82 | NL802154_ATTR_TX_POWER, | 82 | NL802154_ATTR_TX_POWER, |
| 83 | 83 | ||
| 84 | NL802154_ATTR_CCA_MODE, | 84 | NL802154_ATTR_CCA_MODE, |
| 85 | NL802154_ATTR_CCA_MODE3_AND, | 85 | NL802154_ATTR_CCA_OPT, |
| 86 | NL802154_ATTR_CCA_ED_LEVEL, | 86 | NL802154_ATTR_CCA_ED_LEVEL, |
| 87 | 87 | ||
| 88 | NL802154_ATTR_MAX_FRAME_RETRIES, | 88 | NL802154_ATTR_MAX_FRAME_RETRIES, |
| @@ -119,4 +119,47 @@ enum nl802154_iftype { | |||
| 119 | NL802154_IFTYPE_MAX = NUM_NL802154_IFTYPES - 1 | 119 | NL802154_IFTYPE_MAX = NUM_NL802154_IFTYPES - 1 |
| 120 | }; | 120 | }; |
| 121 | 121 | ||
| 122 | /** | ||
| 123 | * enum nl802154_cca_modes - cca modes | ||
| 124 | * | ||
| 125 | * @__NL802154_CCA_INVALID: cca mode number 0 is reserved | ||
| 126 | * @NL802154_CCA_ENERGY: Energy above threshold | ||
| 127 | * @NL802154_CCA_CARRIER: Carrier sense only | ||
| 128 | * @NL802154_CCA_ENERGY_CARRIER: Carrier sense with energy above threshold | ||
| 129 | * @NL802154_CCA_ALOHA: CCA shall always report an idle medium | ||
| 130 | * @NL802154_CCA_UWB_SHR: UWB preamble sense based on the SHR of a frame | ||
| 131 | * @NL802154_CCA_UWB_MULTIPEXED: UWB preamble sense based on the packet with | ||
| 132 | * the multiplexed preamble | ||
| 133 | * @__NL802154_CCA_ATTR_AFTER_LAST: Internal | ||
| 134 | * @NL802154_CCA_ATTR_MAX: Maximum CCA attribute number | ||
| 135 | */ | ||
| 136 | enum nl802154_cca_modes { | ||
| 137 | __NL802154_CCA_INVALID, | ||
| 138 | NL802154_CCA_ENERGY, | ||
| 139 | NL802154_CCA_CARRIER, | ||
| 140 | NL802154_CCA_ENERGY_CARRIER, | ||
| 141 | NL802154_CCA_ALOHA, | ||
| 142 | NL802154_CCA_UWB_SHR, | ||
| 143 | NL802154_CCA_UWB_MULTIPEXED, | ||
| 144 | |||
| 145 | /* keep last */ | ||
| 146 | __NL802154_CCA_ATTR_AFTER_LAST, | ||
| 147 | NL802154_CCA_ATTR_MAX = __NL802154_CCA_ATTR_AFTER_LAST - 1 | ||
| 148 | }; | ||
| 149 | |||
| 150 | /** | ||
| 151 | * enum nl802154_cca_opts - additional options for cca modes | ||
| 152 | * | ||
| 153 | * @NL802154_CCA_OPT_ENERGY_CARRIER_OR: NL802154_CCA_ENERGY_CARRIER with OR | ||
| 154 | * @NL802154_CCA_OPT_ENERGY_CARRIER_AND: NL802154_CCA_ENERGY_CARRIER with AND | ||
| 155 | */ | ||
| 156 | enum nl802154_cca_opts { | ||
| 157 | NL802154_CCA_OPT_ENERGY_CARRIER_AND, | ||
| 158 | NL802154_CCA_OPT_ENERGY_CARRIER_OR, | ||
| 159 | |||
| 160 | /* keep last */ | ||
| 161 | __NL802154_CCA_OPT_ATTR_AFTER_LAST, | ||
| 162 | NL802154_CCA_OPT_ATTR_MAX = __NL802154_CCA_OPT_ATTR_AFTER_LAST - 1 | ||
| 163 | }; | ||
| 164 | |||
| 122 | #endif /* __NL802154_H */ | 165 | #endif /* __NL802154_H */ |
diff --git a/include/net/ping.h b/include/net/ping.h index f074060bc5de..cc16d413f681 100644 --- a/include/net/ping.h +++ b/include/net/ping.h | |||
| @@ -59,7 +59,7 @@ extern struct pingv6_ops pingv6_ops; | |||
| 59 | 59 | ||
| 60 | struct pingfakehdr { | 60 | struct pingfakehdr { |
| 61 | struct icmphdr icmph; | 61 | struct icmphdr icmph; |
| 62 | struct iovec *iov; | 62 | struct msghdr *msg; |
| 63 | sa_family_t family; | 63 | sa_family_t family; |
| 64 | __wsum wcheck; | 64 | __wsum wcheck; |
| 65 | }; | 65 | }; |
diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index 27a33833ff4a..2342bf12cb78 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/jiffies.h> | 4 | #include <linux/jiffies.h> |
| 5 | #include <linux/ktime.h> | 5 | #include <linux/ktime.h> |
| 6 | #include <linux/if_vlan.h> | ||
| 6 | #include <net/sch_generic.h> | 7 | #include <net/sch_generic.h> |
| 7 | 8 | ||
| 8 | struct qdisc_walker { | 9 | struct qdisc_walker { |
| @@ -114,6 +115,17 @@ int tc_classify_compat(struct sk_buff *skb, const struct tcf_proto *tp, | |||
| 114 | int tc_classify(struct sk_buff *skb, const struct tcf_proto *tp, | 115 | int tc_classify(struct sk_buff *skb, const struct tcf_proto *tp, |
| 115 | struct tcf_result *res); | 116 | struct tcf_result *res); |
| 116 | 117 | ||
| 118 | static inline __be16 tc_skb_protocol(const struct sk_buff *skb) | ||
| 119 | { | ||
| 120 | /* We need to take extra care in case the skb came via | ||
| 121 | * vlan accelerated path. In that case, use skb->vlan_proto | ||
| 122 | * as the original vlan header was already stripped. | ||
| 123 | */ | ||
| 124 | if (skb_vlan_tag_present(skb)) | ||
| 125 | return skb->vlan_proto; | ||
| 126 | return skb->protocol; | ||
| 127 | } | ||
| 128 | |||
| 117 | /* Calculate maximal size of packet seen by hard_start_xmit | 129 | /* Calculate maximal size of packet seen by hard_start_xmit |
| 118 | routine of this device. | 130 | routine of this device. |
| 119 | */ | 131 | */ |
diff --git a/include/net/regulatory.h b/include/net/regulatory.h index b776d72d84be..ebc5a2ed8631 100644 --- a/include/net/regulatory.h +++ b/include/net/regulatory.h | |||
| @@ -147,6 +147,24 @@ struct regulatory_request { | |||
| 147 | * NL80211_IFTYPE_P2P_CLIENT, NL80211_IFTYPE_P2P_GO, | 147 | * NL80211_IFTYPE_P2P_CLIENT, NL80211_IFTYPE_P2P_GO, |
| 148 | * NL80211_IFTYPE_P2P_DEVICE. The flag will be set by default if a device | 148 | * NL80211_IFTYPE_P2P_DEVICE. The flag will be set by default if a device |
| 149 | * includes any modes unsupported for enforcement checking. | 149 | * includes any modes unsupported for enforcement checking. |
| 150 | * @REGULATORY_WIPHY_SELF_MANAGED: for devices that employ wiphy-specific | ||
| 151 | * regdom management. These devices will ignore all regdom changes not | ||
| 152 | * originating from their own wiphy. | ||
| 153 | * A self-managed wiphys only employs regulatory information obtained from | ||
| 154 | * the FW and driver and does not use other cfg80211 sources like | ||
| 155 | * beacon-hints, country-code IEs and hints from other devices on the same | ||
| 156 | * system. Conversely, a self-managed wiphy does not share its regulatory | ||
| 157 | * hints with other devices in the system. If a system contains several | ||
| 158 | * devices, one or more of which are self-managed, there might be | ||
| 159 | * contradictory regulatory settings between them. Usage of flag is | ||
| 160 | * generally discouraged. Only use it if the FW/driver is incompatible | ||
| 161 | * with non-locally originated hints. | ||
| 162 | * This flag is incompatible with the flags: %REGULATORY_CUSTOM_REG, | ||
| 163 | * %REGULATORY_STRICT_REG, %REGULATORY_COUNTRY_IE_FOLLOW_POWER, | ||
| 164 | * %REGULATORY_COUNTRY_IE_IGNORE and %REGULATORY_DISABLE_BEACON_HINTS. | ||
| 165 | * Mixing any of the above flags with this flag will result in a failure | ||
| 166 | * to register the wiphy. This flag implies | ||
| 167 | * %REGULATORY_DISABLE_BEACON_HINTS and %REGULATORY_COUNTRY_IE_IGNORE. | ||
| 150 | */ | 168 | */ |
| 151 | enum ieee80211_regulatory_flags { | 169 | enum ieee80211_regulatory_flags { |
| 152 | REGULATORY_CUSTOM_REG = BIT(0), | 170 | REGULATORY_CUSTOM_REG = BIT(0), |
| @@ -156,6 +174,7 @@ enum ieee80211_regulatory_flags { | |||
| 156 | REGULATORY_COUNTRY_IE_IGNORE = BIT(4), | 174 | REGULATORY_COUNTRY_IE_IGNORE = BIT(4), |
| 157 | REGULATORY_ENABLE_RELAX_NO_IR = BIT(5), | 175 | REGULATORY_ENABLE_RELAX_NO_IR = BIT(5), |
| 158 | REGULATORY_IGNORE_STALE_KICKOFF = BIT(6), | 176 | REGULATORY_IGNORE_STALE_KICKOFF = BIT(6), |
| 177 | REGULATORY_WIPHY_SELF_MANAGED = BIT(7), | ||
| 159 | }; | 178 | }; |
| 160 | 179 | ||
| 161 | struct ieee80211_freq_range { | 180 | struct ieee80211_freq_range { |
diff --git a/include/net/route.h b/include/net/route.h index b17cf28f996e..fe22d03afb6a 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
| @@ -46,6 +46,7 @@ | |||
| 46 | 46 | ||
| 47 | struct fib_nh; | 47 | struct fib_nh; |
| 48 | struct fib_info; | 48 | struct fib_info; |
| 49 | struct uncached_list; | ||
| 49 | struct rtable { | 50 | struct rtable { |
| 50 | struct dst_entry dst; | 51 | struct dst_entry dst; |
| 51 | 52 | ||
| @@ -64,6 +65,7 @@ struct rtable { | |||
| 64 | u32 rt_pmtu; | 65 | u32 rt_pmtu; |
| 65 | 66 | ||
| 66 | struct list_head rt_uncached; | 67 | struct list_head rt_uncached; |
| 68 | struct uncached_list *rt_uncached_list; | ||
| 67 | }; | 69 | }; |
| 68 | 70 | ||
| 69 | static inline bool rt_is_input_route(const struct rtable *rt) | 71 | static inline bool rt_is_input_route(const struct rtable *rt) |
diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index e21b9f9653c0..6c6d5393fc34 100644 --- a/include/net/rtnetlink.h +++ b/include/net/rtnetlink.h | |||
| @@ -46,6 +46,7 @@ static inline int rtnl_msg_family(const struct nlmsghdr *nlh) | |||
| 46 | * to create when creating a new device. | 46 | * to create when creating a new device. |
| 47 | * @get_num_rx_queues: Function to determine number of receive queues | 47 | * @get_num_rx_queues: Function to determine number of receive queues |
| 48 | * to create when creating a new device. | 48 | * to create when creating a new device. |
| 49 | * @get_link_net: Function to get the i/o netns of the device | ||
| 49 | */ | 50 | */ |
| 50 | struct rtnl_link_ops { | 51 | struct rtnl_link_ops { |
| 51 | struct list_head list; | 52 | struct list_head list; |
| @@ -93,6 +94,7 @@ struct rtnl_link_ops { | |||
| 93 | int (*fill_slave_info)(struct sk_buff *skb, | 94 | int (*fill_slave_info)(struct sk_buff *skb, |
| 94 | const struct net_device *dev, | 95 | const struct net_device *dev, |
| 95 | const struct net_device *slave_dev); | 96 | const struct net_device *slave_dev); |
| 97 | struct net *(*get_link_net)(const struct net_device *dev); | ||
| 96 | }; | 98 | }; |
| 97 | 99 | ||
| 98 | int __rtnl_link_register(struct rtnl_link_ops *ops); | 100 | int __rtnl_link_register(struct rtnl_link_ops *ops); |
diff --git a/include/net/sock.h b/include/net/sock.h index 2210fec65669..e13824570b0f 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -857,18 +857,6 @@ static inline void sock_rps_record_flow_hash(__u32 hash) | |||
| 857 | #endif | 857 | #endif |
| 858 | } | 858 | } |
| 859 | 859 | ||
| 860 | static inline void sock_rps_reset_flow_hash(__u32 hash) | ||
| 861 | { | ||
| 862 | #ifdef CONFIG_RPS | ||
| 863 | struct rps_sock_flow_table *sock_flow_table; | ||
| 864 | |||
| 865 | rcu_read_lock(); | ||
| 866 | sock_flow_table = rcu_dereference(rps_sock_flow_table); | ||
| 867 | rps_reset_sock_flow(sock_flow_table, hash); | ||
| 868 | rcu_read_unlock(); | ||
| 869 | #endif | ||
| 870 | } | ||
| 871 | |||
| 872 | static inline void sock_rps_record_flow(const struct sock *sk) | 860 | static inline void sock_rps_record_flow(const struct sock *sk) |
| 873 | { | 861 | { |
| 874 | #ifdef CONFIG_RPS | 862 | #ifdef CONFIG_RPS |
| @@ -876,28 +864,18 @@ static inline void sock_rps_record_flow(const struct sock *sk) | |||
| 876 | #endif | 864 | #endif |
| 877 | } | 865 | } |
| 878 | 866 | ||
| 879 | static inline void sock_rps_reset_flow(const struct sock *sk) | ||
| 880 | { | ||
| 881 | #ifdef CONFIG_RPS | ||
| 882 | sock_rps_reset_flow_hash(sk->sk_rxhash); | ||
| 883 | #endif | ||
| 884 | } | ||
| 885 | |||
| 886 | static inline void sock_rps_save_rxhash(struct sock *sk, | 867 | static inline void sock_rps_save_rxhash(struct sock *sk, |
| 887 | const struct sk_buff *skb) | 868 | const struct sk_buff *skb) |
| 888 | { | 869 | { |
| 889 | #ifdef CONFIG_RPS | 870 | #ifdef CONFIG_RPS |
| 890 | if (unlikely(sk->sk_rxhash != skb->hash)) { | 871 | if (unlikely(sk->sk_rxhash != skb->hash)) |
| 891 | sock_rps_reset_flow(sk); | ||
| 892 | sk->sk_rxhash = skb->hash; | 872 | sk->sk_rxhash = skb->hash; |
| 893 | } | ||
| 894 | #endif | 873 | #endif |
| 895 | } | 874 | } |
| 896 | 875 | ||
| 897 | static inline void sock_rps_reset_rxhash(struct sock *sk) | 876 | static inline void sock_rps_reset_rxhash(struct sock *sk) |
| 898 | { | 877 | { |
| 899 | #ifdef CONFIG_RPS | 878 | #ifdef CONFIG_RPS |
| 900 | sock_rps_reset_flow(sk); | ||
| 901 | sk->sk_rxhash = 0; | 879 | sk->sk_rxhash = 0; |
| 902 | #endif | 880 | #endif |
| 903 | } | 881 | } |
| @@ -1374,29 +1352,6 @@ void sk_prot_clear_portaddr_nulls(struct sock *sk, int size); | |||
| 1374 | #define SOCK_BINDADDR_LOCK 4 | 1352 | #define SOCK_BINDADDR_LOCK 4 |
| 1375 | #define SOCK_BINDPORT_LOCK 8 | 1353 | #define SOCK_BINDPORT_LOCK 8 |
| 1376 | 1354 | ||
| 1377 | /* sock_iocb: used to kick off async processing of socket ios */ | ||
| 1378 | struct sock_iocb { | ||
| 1379 | struct list_head list; | ||
| 1380 | |||
| 1381 | int flags; | ||
| 1382 | int size; | ||
| 1383 | struct socket *sock; | ||
| 1384 | struct sock *sk; | ||
| 1385 | struct scm_cookie *scm; | ||
| 1386 | struct msghdr *msg, async_msg; | ||
| 1387 | struct kiocb *kiocb; | ||
| 1388 | }; | ||
| 1389 | |||
| 1390 | static inline struct sock_iocb *kiocb_to_siocb(struct kiocb *iocb) | ||
| 1391 | { | ||
| 1392 | return (struct sock_iocb *)iocb->private; | ||
| 1393 | } | ||
| 1394 | |||
| 1395 | static inline struct kiocb *siocb_to_kiocb(struct sock_iocb *si) | ||
| 1396 | { | ||
| 1397 | return si->kiocb; | ||
| 1398 | } | ||
| 1399 | |||
| 1400 | struct socket_alloc { | 1355 | struct socket_alloc { |
| 1401 | struct socket socket; | 1356 | struct socket socket; |
| 1402 | struct inode vfs_inode; | 1357 | struct inode vfs_inode; |
| @@ -1826,27 +1781,25 @@ static inline void sk_nocaps_add(struct sock *sk, netdev_features_t flags) | |||
| 1826 | } | 1781 | } |
| 1827 | 1782 | ||
| 1828 | static inline int skb_do_copy_data_nocache(struct sock *sk, struct sk_buff *skb, | 1783 | static inline int skb_do_copy_data_nocache(struct sock *sk, struct sk_buff *skb, |
| 1829 | char __user *from, char *to, | 1784 | struct iov_iter *from, char *to, |
| 1830 | int copy, int offset) | 1785 | int copy, int offset) |
| 1831 | { | 1786 | { |
| 1832 | if (skb->ip_summed == CHECKSUM_NONE) { | 1787 | if (skb->ip_summed == CHECKSUM_NONE) { |
| 1833 | int err = 0; | 1788 | __wsum csum = 0; |
| 1834 | __wsum csum = csum_and_copy_from_user(from, to, copy, 0, &err); | 1789 | if (csum_and_copy_from_iter(to, copy, &csum, from) != copy) |
| 1835 | if (err) | 1790 | return -EFAULT; |
| 1836 | return err; | ||
| 1837 | skb->csum = csum_block_add(skb->csum, csum, offset); | 1791 | skb->csum = csum_block_add(skb->csum, csum, offset); |
| 1838 | } else if (sk->sk_route_caps & NETIF_F_NOCACHE_COPY) { | 1792 | } else if (sk->sk_route_caps & NETIF_F_NOCACHE_COPY) { |
| 1839 | if (!access_ok(VERIFY_READ, from, copy) || | 1793 | if (copy_from_iter_nocache(to, copy, from) != copy) |
| 1840 | __copy_from_user_nocache(to, from, copy)) | ||
| 1841 | return -EFAULT; | 1794 | return -EFAULT; |
| 1842 | } else if (copy_from_user(to, from, copy)) | 1795 | } else if (copy_from_iter(to, copy, from) != copy) |
| 1843 | return -EFAULT; | 1796 | return -EFAULT; |
| 1844 | 1797 | ||
| 1845 | return 0; | 1798 | return 0; |
| 1846 | } | 1799 | } |
| 1847 | 1800 | ||
| 1848 | static inline int skb_add_data_nocache(struct sock *sk, struct sk_buff *skb, | 1801 | static inline int skb_add_data_nocache(struct sock *sk, struct sk_buff *skb, |
| 1849 | char __user *from, int copy) | 1802 | struct iov_iter *from, int copy) |
| 1850 | { | 1803 | { |
| 1851 | int err, offset = skb->len; | 1804 | int err, offset = skb->len; |
| 1852 | 1805 | ||
| @@ -1858,7 +1811,7 @@ static inline int skb_add_data_nocache(struct sock *sk, struct sk_buff *skb, | |||
| 1858 | return err; | 1811 | return err; |
| 1859 | } | 1812 | } |
| 1860 | 1813 | ||
| 1861 | static inline int skb_copy_to_page_nocache(struct sock *sk, char __user *from, | 1814 | static inline int skb_copy_to_page_nocache(struct sock *sk, struct iov_iter *from, |
| 1862 | struct sk_buff *skb, | 1815 | struct sk_buff *skb, |
| 1863 | struct page *page, | 1816 | struct page *page, |
| 1864 | int off, int copy) | 1817 | int off, int copy) |
| @@ -2262,6 +2215,7 @@ bool sk_net_capable(const struct sock *sk, int cap); | |||
| 2262 | extern __u32 sysctl_wmem_max; | 2215 | extern __u32 sysctl_wmem_max; |
| 2263 | extern __u32 sysctl_rmem_max; | 2216 | extern __u32 sysctl_rmem_max; |
| 2264 | 2217 | ||
| 2218 | extern int sysctl_tstamp_allow_data; | ||
| 2265 | extern int sysctl_optmem_max; | 2219 | extern int sysctl_optmem_max; |
| 2266 | 2220 | ||
| 2267 | extern __u32 sysctl_wmem_default; | 2221 | extern __u32 sysctl_wmem_default; |
diff --git a/include/net/switchdev.h b/include/net/switchdev.h index 8a6d1641fd9b..cfcdac2e5d25 100644 --- a/include/net/switchdev.h +++ b/include/net/switchdev.h | |||
| @@ -11,13 +11,46 @@ | |||
| 11 | #define _LINUX_SWITCHDEV_H_ | 11 | #define _LINUX_SWITCHDEV_H_ |
| 12 | 12 | ||
| 13 | #include <linux/netdevice.h> | 13 | #include <linux/netdevice.h> |
| 14 | #include <linux/notifier.h> | ||
| 15 | |||
| 16 | enum netdev_switch_notifier_type { | ||
| 17 | NETDEV_SWITCH_FDB_ADD = 1, | ||
| 18 | NETDEV_SWITCH_FDB_DEL, | ||
| 19 | }; | ||
| 20 | |||
| 21 | struct netdev_switch_notifier_info { | ||
| 22 | struct net_device *dev; | ||
| 23 | }; | ||
| 24 | |||
| 25 | struct netdev_switch_notifier_fdb_info { | ||
| 26 | struct netdev_switch_notifier_info info; /* must be first */ | ||
| 27 | const unsigned char *addr; | ||
| 28 | u16 vid; | ||
| 29 | }; | ||
| 30 | |||
| 31 | static inline struct net_device * | ||
| 32 | netdev_switch_notifier_info_to_dev(const struct netdev_switch_notifier_info *info) | ||
| 33 | { | ||
| 34 | return info->dev; | ||
| 35 | } | ||
| 14 | 36 | ||
| 15 | #ifdef CONFIG_NET_SWITCHDEV | 37 | #ifdef CONFIG_NET_SWITCHDEV |
| 16 | 38 | ||
| 17 | int netdev_switch_parent_id_get(struct net_device *dev, | 39 | int netdev_switch_parent_id_get(struct net_device *dev, |
| 18 | struct netdev_phys_item_id *psid); | 40 | struct netdev_phys_item_id *psid); |
| 19 | int netdev_switch_port_stp_update(struct net_device *dev, u8 state); | 41 | int netdev_switch_port_stp_update(struct net_device *dev, u8 state); |
| 20 | 42 | int register_netdev_switch_notifier(struct notifier_block *nb); | |
| 43 | int unregister_netdev_switch_notifier(struct notifier_block *nb); | ||
| 44 | int call_netdev_switch_notifiers(unsigned long val, struct net_device *dev, | ||
| 45 | struct netdev_switch_notifier_info *info); | ||
| 46 | int netdev_switch_port_bridge_setlink(struct net_device *dev, | ||
| 47 | struct nlmsghdr *nlh, u16 flags); | ||
| 48 | int netdev_switch_port_bridge_dellink(struct net_device *dev, | ||
| 49 | struct nlmsghdr *nlh, u16 flags); | ||
| 50 | int ndo_dflt_netdev_switch_port_bridge_dellink(struct net_device *dev, | ||
| 51 | struct nlmsghdr *nlh, u16 flags); | ||
| 52 | int ndo_dflt_netdev_switch_port_bridge_setlink(struct net_device *dev, | ||
| 53 | struct nlmsghdr *nlh, u16 flags); | ||
| 21 | #else | 54 | #else |
| 22 | 55 | ||
| 23 | static inline int netdev_switch_parent_id_get(struct net_device *dev, | 56 | static inline int netdev_switch_parent_id_get(struct net_device *dev, |
| @@ -32,6 +65,50 @@ static inline int netdev_switch_port_stp_update(struct net_device *dev, | |||
| 32 | return -EOPNOTSUPP; | 65 | return -EOPNOTSUPP; |
| 33 | } | 66 | } |
| 34 | 67 | ||
| 68 | static inline int register_netdev_switch_notifier(struct notifier_block *nb) | ||
| 69 | { | ||
| 70 | return 0; | ||
| 71 | } | ||
| 72 | |||
| 73 | static inline int unregister_netdev_switch_notifier(struct notifier_block *nb) | ||
| 74 | { | ||
| 75 | return 0; | ||
| 76 | } | ||
| 77 | |||
| 78 | static inline int call_netdev_switch_notifiers(unsigned long val, struct net_device *dev, | ||
| 79 | struct netdev_switch_notifier_info *info) | ||
| 80 | { | ||
| 81 | return NOTIFY_DONE; | ||
| 82 | } | ||
| 83 | |||
| 84 | static inline int netdev_switch_port_bridge_setlink(struct net_device *dev, | ||
| 85 | struct nlmsghdr *nlh, | ||
| 86 | u16 flags) | ||
| 87 | { | ||
| 88 | return -EOPNOTSUPP; | ||
| 89 | } | ||
| 90 | |||
| 91 | static inline int netdev_switch_port_bridge_dellink(struct net_device *dev, | ||
| 92 | struct nlmsghdr *nlh, | ||
| 93 | u16 flags) | ||
| 94 | { | ||
| 95 | return -EOPNOTSUPP; | ||
| 96 | } | ||
| 97 | |||
| 98 | static inline int ndo_dflt_netdev_switch_port_bridge_dellink(struct net_device *dev, | ||
| 99 | struct nlmsghdr *nlh, | ||
| 100 | u16 flags) | ||
| 101 | { | ||
| 102 | return 0; | ||
| 103 | } | ||
| 104 | |||
| 105 | static inline int ndo_dflt_netdev_switch_port_bridge_setlink(struct net_device *dev, | ||
| 106 | struct nlmsghdr *nlh, | ||
| 107 | u16 flags) | ||
| 108 | { | ||
| 109 | return 0; | ||
| 110 | } | ||
| 111 | |||
| 35 | #endif | 112 | #endif |
| 36 | 113 | ||
| 37 | #endif /* _LINUX_SWITCHDEV_H_ */ | 114 | #endif /* _LINUX_SWITCHDEV_H_ */ |
diff --git a/include/net/tc_act/tc_bpf.h b/include/net/tc_act/tc_bpf.h new file mode 100644 index 000000000000..86a070ffc930 --- /dev/null +++ b/include/net/tc_act/tc_bpf.h | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2015 Jiri Pirko <jiri@resnulli.us> | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef __NET_TC_BPF_H | ||
| 11 | #define __NET_TC_BPF_H | ||
| 12 | |||
| 13 | #include <linux/filter.h> | ||
| 14 | #include <net/act_api.h> | ||
| 15 | |||
| 16 | struct tcf_bpf { | ||
| 17 | struct tcf_common common; | ||
| 18 | struct bpf_prog *filter; | ||
| 19 | struct sock_filter *bpf_ops; | ||
| 20 | u16 bpf_num_ops; | ||
| 21 | }; | ||
| 22 | #define to_bpf(a) \ | ||
| 23 | container_of(a->priv, struct tcf_bpf, common) | ||
| 24 | |||
| 25 | #endif /* __NET_TC_BPF_H */ | ||
diff --git a/include/net/tc_act/tc_connmark.h b/include/net/tc_act/tc_connmark.h new file mode 100644 index 000000000000..5c1104c2e24f --- /dev/null +++ b/include/net/tc_act/tc_connmark.h | |||
| @@ -0,0 +1,14 @@ | |||
| 1 | #ifndef __NET_TC_CONNMARK_H | ||
| 2 | #define __NET_TC_CONNMARK_H | ||
| 3 | |||
| 4 | #include <net/act_api.h> | ||
| 5 | |||
| 6 | struct tcf_connmark_info { | ||
| 7 | struct tcf_common common; | ||
| 8 | u16 zone; | ||
| 9 | }; | ||
| 10 | |||
| 11 | #define to_connmark(a) \ | ||
| 12 | container_of(a->priv, struct tcf_connmark_info, common) | ||
| 13 | |||
| 14 | #endif /* __NET_TC_CONNMARK_H */ | ||
diff --git a/include/net/tcp.h b/include/net/tcp.h index 9d9111ef43ae..8d6b983d5099 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -262,8 +262,6 @@ extern int sysctl_tcp_low_latency; | |||
| 262 | extern int sysctl_tcp_nometrics_save; | 262 | extern int sysctl_tcp_nometrics_save; |
| 263 | extern int sysctl_tcp_moderate_rcvbuf; | 263 | extern int sysctl_tcp_moderate_rcvbuf; |
| 264 | extern int sysctl_tcp_tso_win_divisor; | 264 | extern int sysctl_tcp_tso_win_divisor; |
| 265 | extern int sysctl_tcp_mtu_probing; | ||
| 266 | extern int sysctl_tcp_base_mss; | ||
| 267 | extern int sysctl_tcp_workaround_signed_windows; | 265 | extern int sysctl_tcp_workaround_signed_windows; |
| 268 | extern int sysctl_tcp_slow_start_after_idle; | 266 | extern int sysctl_tcp_slow_start_after_idle; |
| 269 | extern int sysctl_tcp_thin_linear_timeouts; | 267 | extern int sysctl_tcp_thin_linear_timeouts; |
| @@ -274,6 +272,7 @@ extern int sysctl_tcp_challenge_ack_limit; | |||
| 274 | extern unsigned int sysctl_tcp_notsent_lowat; | 272 | extern unsigned int sysctl_tcp_notsent_lowat; |
| 275 | extern int sysctl_tcp_min_tso_segs; | 273 | extern int sysctl_tcp_min_tso_segs; |
| 276 | extern int sysctl_tcp_autocorking; | 274 | extern int sysctl_tcp_autocorking; |
| 275 | extern int sysctl_tcp_invalid_ratelimit; | ||
| 277 | 276 | ||
| 278 | extern atomic_long_t tcp_memory_allocated; | 277 | extern atomic_long_t tcp_memory_allocated; |
| 279 | extern struct percpu_counter tcp_sockets_allocated; | 278 | extern struct percpu_counter tcp_sockets_allocated; |
| @@ -448,6 +447,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb); | |||
| 448 | struct sock *tcp_create_openreq_child(struct sock *sk, | 447 | struct sock *tcp_create_openreq_child(struct sock *sk, |
| 449 | struct request_sock *req, | 448 | struct request_sock *req, |
| 450 | struct sk_buff *skb); | 449 | struct sk_buff *skb); |
| 450 | void tcp_ca_openreq_child(struct sock *sk, const struct dst_entry *dst); | ||
| 451 | struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | 451 | struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, |
| 452 | struct request_sock *req, | 452 | struct request_sock *req, |
| 453 | struct dst_entry *dst); | 453 | struct dst_entry *dst); |
| @@ -636,6 +636,11 @@ static inline u32 tcp_rto_min_us(struct sock *sk) | |||
| 636 | return jiffies_to_usecs(tcp_rto_min(sk)); | 636 | return jiffies_to_usecs(tcp_rto_min(sk)); |
| 637 | } | 637 | } |
| 638 | 638 | ||
| 639 | static inline bool tcp_ca_dst_locked(const struct dst_entry *dst) | ||
| 640 | { | ||
| 641 | return dst_metric_locked(dst, RTAX_CC_ALGO); | ||
| 642 | } | ||
| 643 | |||
| 639 | /* Compute the actual receive window we are currently advertising. | 644 | /* Compute the actual receive window we are currently advertising. |
| 640 | * Rcv_nxt can be after the window if our peer push more data | 645 | * Rcv_nxt can be after the window if our peer push more data |
| 641 | * than the offered window. | 646 | * than the offered window. |
| @@ -787,6 +792,8 @@ enum tcp_ca_ack_event_flags { | |||
| 787 | #define TCP_CA_MAX 128 | 792 | #define TCP_CA_MAX 128 |
| 788 | #define TCP_CA_BUF_MAX (TCP_CA_NAME_MAX*TCP_CA_MAX) | 793 | #define TCP_CA_BUF_MAX (TCP_CA_NAME_MAX*TCP_CA_MAX) |
| 789 | 794 | ||
| 795 | #define TCP_CA_UNSPEC 0 | ||
| 796 | |||
| 790 | /* Algorithm can be set on socket without CAP_NET_ADMIN privileges */ | 797 | /* Algorithm can be set on socket without CAP_NET_ADMIN privileges */ |
| 791 | #define TCP_CONG_NON_RESTRICTED 0x1 | 798 | #define TCP_CONG_NON_RESTRICTED 0x1 |
| 792 | /* Requires ECN/ECT set on all packets */ | 799 | /* Requires ECN/ECT set on all packets */ |
| @@ -794,7 +801,8 @@ enum tcp_ca_ack_event_flags { | |||
| 794 | 801 | ||
| 795 | struct tcp_congestion_ops { | 802 | struct tcp_congestion_ops { |
| 796 | struct list_head list; | 803 | struct list_head list; |
| 797 | unsigned long flags; | 804 | u32 key; |
| 805 | u32 flags; | ||
| 798 | 806 | ||
| 799 | /* initialize private data (optional) */ | 807 | /* initialize private data (optional) */ |
| 800 | void (*init)(struct sock *sk); | 808 | void (*init)(struct sock *sk); |
| @@ -841,6 +849,17 @@ u32 tcp_reno_ssthresh(struct sock *sk); | |||
| 841 | void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked); | 849 | void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked); |
| 842 | extern struct tcp_congestion_ops tcp_reno; | 850 | extern struct tcp_congestion_ops tcp_reno; |
| 843 | 851 | ||
| 852 | struct tcp_congestion_ops *tcp_ca_find_key(u32 key); | ||
| 853 | u32 tcp_ca_get_key_by_name(const char *name); | ||
| 854 | #ifdef CONFIG_INET | ||
| 855 | char *tcp_ca_get_name_by_key(u32 key, char *buffer); | ||
| 856 | #else | ||
| 857 | static inline char *tcp_ca_get_name_by_key(u32 key, char *buffer) | ||
| 858 | { | ||
| 859 | return NULL; | ||
| 860 | } | ||
| 861 | #endif | ||
| 862 | |||
| 844 | static inline bool tcp_ca_needs_ecn(const struct sock *sk) | 863 | static inline bool tcp_ca_needs_ecn(const struct sock *sk) |
| 845 | { | 864 | { |
| 846 | const struct inet_connection_sock *icsk = inet_csk(sk); | 865 | const struct inet_connection_sock *icsk = inet_csk(sk); |
| @@ -1124,6 +1143,7 @@ static inline void tcp_openreq_init(struct request_sock *req, | |||
| 1124 | tcp_rsk(req)->rcv_isn = TCP_SKB_CB(skb)->seq; | 1143 | tcp_rsk(req)->rcv_isn = TCP_SKB_CB(skb)->seq; |
| 1125 | tcp_rsk(req)->rcv_nxt = TCP_SKB_CB(skb)->seq + 1; | 1144 | tcp_rsk(req)->rcv_nxt = TCP_SKB_CB(skb)->seq + 1; |
| 1126 | tcp_rsk(req)->snt_synack = tcp_time_stamp; | 1145 | tcp_rsk(req)->snt_synack = tcp_time_stamp; |
| 1146 | tcp_rsk(req)->last_oow_ack_time = 0; | ||
| 1127 | req->mss = rx_opt->mss_clamp; | 1147 | req->mss = rx_opt->mss_clamp; |
| 1128 | req->ts_recent = rx_opt->saw_tstamp ? rx_opt->rcv_tsval : 0; | 1148 | req->ts_recent = rx_opt->saw_tstamp ? rx_opt->rcv_tsval : 0; |
| 1129 | ireq->tstamp_ok = rx_opt->tstamp_ok; | 1149 | ireq->tstamp_ok = rx_opt->tstamp_ok; |
| @@ -1216,6 +1236,37 @@ static inline bool tcp_paws_reject(const struct tcp_options_received *rx_opt, | |||
| 1216 | return true; | 1236 | return true; |
| 1217 | } | 1237 | } |
| 1218 | 1238 | ||
| 1239 | /* Return true if we're currently rate-limiting out-of-window ACKs and | ||
| 1240 | * thus shouldn't send a dupack right now. We rate-limit dupacks in | ||
| 1241 | * response to out-of-window SYNs or ACKs to mitigate ACK loops or DoS | ||
| 1242 | * attacks that send repeated SYNs or ACKs for the same connection. To | ||
| 1243 | * do this, we do not send a duplicate SYNACK or ACK if the remote | ||
| 1244 | * endpoint is sending out-of-window SYNs or pure ACKs at a high rate. | ||
| 1245 | */ | ||
| 1246 | static inline bool tcp_oow_rate_limited(struct net *net, | ||
| 1247 | const struct sk_buff *skb, | ||
| 1248 | int mib_idx, u32 *last_oow_ack_time) | ||
| 1249 | { | ||
| 1250 | /* Data packets without SYNs are not likely part of an ACK loop. */ | ||
| 1251 | if ((TCP_SKB_CB(skb)->seq != TCP_SKB_CB(skb)->end_seq) && | ||
| 1252 | !tcp_hdr(skb)->syn) | ||
| 1253 | goto not_rate_limited; | ||
| 1254 | |||
| 1255 | if (*last_oow_ack_time) { | ||
| 1256 | s32 elapsed = (s32)(tcp_time_stamp - *last_oow_ack_time); | ||
| 1257 | |||
| 1258 | if (0 <= elapsed && elapsed < sysctl_tcp_invalid_ratelimit) { | ||
| 1259 | NET_INC_STATS_BH(net, mib_idx); | ||
| 1260 | return true; /* rate-limited: don't send yet! */ | ||
| 1261 | } | ||
| 1262 | } | ||
| 1263 | |||
| 1264 | *last_oow_ack_time = tcp_time_stamp; | ||
| 1265 | |||
| 1266 | not_rate_limited: | ||
| 1267 | return false; /* not rate-limited: go ahead, send dupack now! */ | ||
| 1268 | } | ||
| 1269 | |||
| 1219 | static inline void tcp_mib_init(struct net *net) | 1270 | static inline void tcp_mib_init(struct net *net) |
| 1220 | { | 1271 | { |
| 1221 | /* See RFC 2012 */ | 1272 | /* See RFC 2012 */ |
| @@ -1693,4 +1744,19 @@ static inline struct ip_options_rcu *tcp_v4_save_options(struct sk_buff *skb) | |||
| 1693 | return dopt; | 1744 | return dopt; |
| 1694 | } | 1745 | } |
| 1695 | 1746 | ||
| 1747 | /* locally generated TCP pure ACKs have skb->truesize == 2 | ||
| 1748 | * (check tcp_send_ack() in net/ipv4/tcp_output.c ) | ||
| 1749 | * This is much faster than dissecting the packet to find out. | ||
| 1750 | * (Think of GRE encapsulations, IPv4, IPv6, ...) | ||
| 1751 | */ | ||
| 1752 | static inline bool skb_is_tcp_pure_ack(const struct sk_buff *skb) | ||
| 1753 | { | ||
| 1754 | return skb->truesize == 2; | ||
| 1755 | } | ||
| 1756 | |||
| 1757 | static inline void skb_set_tcp_pure_ack(struct sk_buff *skb) | ||
| 1758 | { | ||
| 1759 | skb->truesize = 2; | ||
| 1760 | } | ||
| 1761 | |||
| 1696 | #endif /* _TCP_H */ | 1762 | #endif /* _TCP_H */ |
diff --git a/include/net/udp_tunnel.h b/include/net/udp_tunnel.h index 2a50a70ef587..1a20d33d56bc 100644 --- a/include/net/udp_tunnel.h +++ b/include/net/udp_tunnel.h | |||
| @@ -77,17 +77,17 @@ void setup_udp_tunnel_sock(struct net *net, struct socket *sock, | |||
| 77 | struct udp_tunnel_sock_cfg *sock_cfg); | 77 | struct udp_tunnel_sock_cfg *sock_cfg); |
| 78 | 78 | ||
| 79 | /* Transmit the skb using UDP encapsulation. */ | 79 | /* Transmit the skb using UDP encapsulation. */ |
| 80 | int udp_tunnel_xmit_skb(struct socket *sock, struct rtable *rt, | 80 | int udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb, |
| 81 | struct sk_buff *skb, __be32 src, __be32 dst, | 81 | __be32 src, __be32 dst, __u8 tos, __u8 ttl, |
| 82 | __u8 tos, __u8 ttl, __be16 df, __be16 src_port, | 82 | __be16 df, __be16 src_port, __be16 dst_port, |
| 83 | __be16 dst_port, bool xnet); | 83 | bool xnet, bool nocheck); |
| 84 | 84 | ||
| 85 | #if IS_ENABLED(CONFIG_IPV6) | 85 | #if IS_ENABLED(CONFIG_IPV6) |
| 86 | int udp_tunnel6_xmit_skb(struct socket *sock, struct dst_entry *dst, | 86 | int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sk_buff *skb, |
| 87 | struct sk_buff *skb, struct net_device *dev, | 87 | struct net_device *dev, struct in6_addr *saddr, |
| 88 | struct in6_addr *saddr, struct in6_addr *daddr, | 88 | struct in6_addr *daddr, |
| 89 | __u8 prio, __u8 ttl, __be16 src_port, | 89 | __u8 prio, __u8 ttl, __be16 src_port, |
| 90 | __be16 dst_port); | 90 | __be16 dst_port, bool nocheck); |
| 91 | #endif | 91 | #endif |
| 92 | 92 | ||
| 93 | void udp_tunnel_sock_release(struct socket *sock); | 93 | void udp_tunnel_sock_release(struct socket *sock); |
diff --git a/include/net/udplite.h b/include/net/udplite.h index ae7c8d1fbcad..80761938b9a7 100644 --- a/include/net/udplite.h +++ b/include/net/udplite.h | |||
| @@ -20,8 +20,7 @@ static __inline__ int udplite_getfrag(void *from, char *to, int offset, | |||
| 20 | int len, int odd, struct sk_buff *skb) | 20 | int len, int odd, struct sk_buff *skb) |
| 21 | { | 21 | { |
| 22 | struct msghdr *msg = from; | 22 | struct msghdr *msg = from; |
| 23 | /* XXX: stripping const */ | 23 | return copy_from_iter(to, len, &msg->msg_iter) != len ? -EFAULT : 0; |
| 24 | return memcpy_fromiovecend(to, (struct iovec *)msg->msg_iter.iov, offset, len); | ||
| 25 | } | 24 | } |
| 26 | 25 | ||
| 27 | /* Designate sk as UDP-Lite socket */ | 26 | /* Designate sk as UDP-Lite socket */ |
diff --git a/include/net/vxlan.h b/include/net/vxlan.h index 903461aa5644..2927d6244481 100644 --- a/include/net/vxlan.h +++ b/include/net/vxlan.h | |||
| @@ -11,14 +11,96 @@ | |||
| 11 | #define VNI_HASH_BITS 10 | 11 | #define VNI_HASH_BITS 10 |
| 12 | #define VNI_HASH_SIZE (1<<VNI_HASH_BITS) | 12 | #define VNI_HASH_SIZE (1<<VNI_HASH_BITS) |
| 13 | 13 | ||
| 14 | /* VXLAN protocol header */ | 14 | /* |
| 15 | * VXLAN Group Based Policy Extension: | ||
| 16 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 17 | * |1|-|-|-|1|-|-|-|R|D|R|R|A|R|R|R| Group Policy ID | | ||
| 18 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 19 | * | VXLAN Network Identifier (VNI) | Reserved | | ||
| 20 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 21 | * | ||
| 22 | * D = Don't Learn bit. When set, this bit indicates that the egress | ||
| 23 | * VTEP MUST NOT learn the source address of the encapsulated frame. | ||
| 24 | * | ||
| 25 | * A = Indicates that the group policy has already been applied to | ||
| 26 | * this packet. Policies MUST NOT be applied by devices when the | ||
| 27 | * A bit is set. | ||
| 28 | * | ||
| 29 | * [0] https://tools.ietf.org/html/draft-smith-vxlan-group-policy | ||
| 30 | */ | ||
| 31 | struct vxlanhdr_gbp { | ||
| 32 | __u8 vx_flags; | ||
| 33 | #ifdef __LITTLE_ENDIAN_BITFIELD | ||
| 34 | __u8 reserved_flags1:3, | ||
| 35 | policy_applied:1, | ||
| 36 | reserved_flags2:2, | ||
| 37 | dont_learn:1, | ||
| 38 | reserved_flags3:1; | ||
| 39 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
| 40 | __u8 reserved_flags1:1, | ||
| 41 | dont_learn:1, | ||
| 42 | reserved_flags2:2, | ||
| 43 | policy_applied:1, | ||
| 44 | reserved_flags3:3; | ||
| 45 | #else | ||
| 46 | #error "Please fix <asm/byteorder.h>" | ||
| 47 | #endif | ||
| 48 | __be16 policy_id; | ||
| 49 | __be32 vx_vni; | ||
| 50 | }; | ||
| 51 | |||
| 52 | #define VXLAN_GBP_USED_BITS (VXLAN_HF_GBP | 0xFFFFFF) | ||
| 53 | |||
| 54 | /* skb->mark mapping | ||
| 55 | * | ||
| 56 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 57 | * |R|R|R|R|R|R|R|R|R|D|R|R|A|R|R|R| Group Policy ID | | ||
| 58 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 59 | */ | ||
| 60 | #define VXLAN_GBP_DONT_LEARN (BIT(6) << 16) | ||
| 61 | #define VXLAN_GBP_POLICY_APPLIED (BIT(3) << 16) | ||
| 62 | #define VXLAN_GBP_ID_MASK (0xFFFF) | ||
| 63 | |||
| 64 | /* VXLAN protocol header: | ||
| 65 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 66 | * |G|R|R|R|I|R|R|C| Reserved | | ||
| 67 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 68 | * | VXLAN Network Identifier (VNI) | Reserved | | ||
| 69 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| 70 | * | ||
| 71 | * G = 1 Group Policy (VXLAN-GBP) | ||
| 72 | * I = 1 VXLAN Network Identifier (VNI) present | ||
| 73 | * C = 1 Remote checksum offload (RCO) | ||
| 74 | */ | ||
| 15 | struct vxlanhdr { | 75 | struct vxlanhdr { |
| 16 | __be32 vx_flags; | 76 | __be32 vx_flags; |
| 17 | __be32 vx_vni; | 77 | __be32 vx_vni; |
| 18 | }; | 78 | }; |
| 19 | 79 | ||
| 80 | /* VXLAN header flags. */ | ||
| 81 | #define VXLAN_HF_RCO BIT(24) | ||
| 82 | #define VXLAN_HF_VNI BIT(27) | ||
| 83 | #define VXLAN_HF_GBP BIT(31) | ||
| 84 | |||
| 85 | /* Remote checksum offload header option */ | ||
| 86 | #define VXLAN_RCO_MASK 0x7f /* Last byte of vni field */ | ||
| 87 | #define VXLAN_RCO_UDP 0x80 /* Indicate UDP RCO (TCP when not set *) */ | ||
| 88 | #define VXLAN_RCO_SHIFT 1 /* Left shift of start */ | ||
| 89 | #define VXLAN_RCO_SHIFT_MASK ((1 << VXLAN_RCO_SHIFT) - 1) | ||
| 90 | #define VXLAN_MAX_REMCSUM_START (VXLAN_RCO_MASK << VXLAN_RCO_SHIFT) | ||
| 91 | |||
| 92 | #define VXLAN_N_VID (1u << 24) | ||
| 93 | #define VXLAN_VID_MASK (VXLAN_N_VID - 1) | ||
| 94 | #define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr)) | ||
| 95 | |||
| 96 | struct vxlan_metadata { | ||
| 97 | __be32 vni; | ||
| 98 | u32 gbp; | ||
| 99 | }; | ||
| 100 | |||
| 20 | struct vxlan_sock; | 101 | struct vxlan_sock; |
| 21 | typedef void (vxlan_rcv_t)(struct vxlan_sock *vh, struct sk_buff *skb, __be32 key); | 102 | typedef void (vxlan_rcv_t)(struct vxlan_sock *vh, struct sk_buff *skb, |
| 103 | struct vxlan_metadata *md); | ||
| 22 | 104 | ||
| 23 | /* per UDP socket information */ | 105 | /* per UDP socket information */ |
| 24 | struct vxlan_sock { | 106 | struct vxlan_sock { |
| @@ -31,6 +113,7 @@ struct vxlan_sock { | |||
| 31 | struct hlist_head vni_list[VNI_HASH_SIZE]; | 113 | struct hlist_head vni_list[VNI_HASH_SIZE]; |
| 32 | atomic_t refcnt; | 114 | atomic_t refcnt; |
| 33 | struct udp_offload udp_offloads; | 115 | struct udp_offload udp_offloads; |
| 116 | u32 flags; | ||
| 34 | }; | 117 | }; |
| 35 | 118 | ||
| 36 | #define VXLAN_F_LEARN 0x01 | 119 | #define VXLAN_F_LEARN 0x01 |
| @@ -42,6 +125,16 @@ struct vxlan_sock { | |||
| 42 | #define VXLAN_F_UDP_CSUM 0x40 | 125 | #define VXLAN_F_UDP_CSUM 0x40 |
| 43 | #define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80 | 126 | #define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80 |
| 44 | #define VXLAN_F_UDP_ZERO_CSUM6_RX 0x100 | 127 | #define VXLAN_F_UDP_ZERO_CSUM6_RX 0x100 |
| 128 | #define VXLAN_F_REMCSUM_TX 0x200 | ||
| 129 | #define VXLAN_F_REMCSUM_RX 0x400 | ||
| 130 | #define VXLAN_F_GBP 0x800 | ||
| 131 | |||
| 132 | /* Flags that are used in the receive patch. These flags must match in | ||
| 133 | * order for a socket to be shareable | ||
| 134 | */ | ||
| 135 | #define VXLAN_F_RCV_FLAGS (VXLAN_F_GBP | \ | ||
| 136 | VXLAN_F_UDP_ZERO_CSUM6_RX | \ | ||
| 137 | VXLAN_F_REMCSUM_RX) | ||
| 45 | 138 | ||
| 46 | struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port, | 139 | struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port, |
| 47 | vxlan_rcv_t *rcv, void *data, | 140 | vxlan_rcv_t *rcv, void *data, |
| @@ -49,10 +142,10 @@ struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port, | |||
| 49 | 142 | ||
| 50 | void vxlan_sock_release(struct vxlan_sock *vs); | 143 | void vxlan_sock_release(struct vxlan_sock *vs); |
| 51 | 144 | ||
| 52 | int vxlan_xmit_skb(struct vxlan_sock *vs, | 145 | int vxlan_xmit_skb(struct rtable *rt, struct sk_buff *skb, |
| 53 | struct rtable *rt, struct sk_buff *skb, | ||
| 54 | __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, | 146 | __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, |
| 55 | __be16 src_port, __be16 dst_port, __be32 vni, bool xnet); | 147 | __be16 src_port, __be16 dst_port, struct vxlan_metadata *md, |
| 148 | bool xnet, u32 vxflags); | ||
| 56 | 149 | ||
| 57 | static inline netdev_features_t vxlan_features_check(struct sk_buff *skb, | 150 | static inline netdev_features_t vxlan_features_check(struct sk_buff *skb, |
| 58 | netdev_features_t features) | 151 | netdev_features_t features) |
diff --git a/include/trace/events/net.h b/include/trace/events/net.h index 1de256b35807..49cc7c3de252 100644 --- a/include/trace/events/net.h +++ b/include/trace/events/net.h | |||
| @@ -40,9 +40,9 @@ TRACE_EVENT(net_dev_start_xmit, | |||
| 40 | __assign_str(name, dev->name); | 40 | __assign_str(name, dev->name); |
| 41 | __entry->queue_mapping = skb->queue_mapping; | 41 | __entry->queue_mapping = skb->queue_mapping; |
| 42 | __entry->skbaddr = skb; | 42 | __entry->skbaddr = skb; |
| 43 | __entry->vlan_tagged = vlan_tx_tag_present(skb); | 43 | __entry->vlan_tagged = skb_vlan_tag_present(skb); |
| 44 | __entry->vlan_proto = ntohs(skb->vlan_proto); | 44 | __entry->vlan_proto = ntohs(skb->vlan_proto); |
| 45 | __entry->vlan_tci = vlan_tx_tag_get(skb); | 45 | __entry->vlan_tci = skb_vlan_tag_get(skb); |
| 46 | __entry->protocol = ntohs(skb->protocol); | 46 | __entry->protocol = ntohs(skb->protocol); |
| 47 | __entry->ip_summed = skb->ip_summed; | 47 | __entry->ip_summed = skb->ip_summed; |
| 48 | __entry->len = skb->len; | 48 | __entry->len = skb->len; |
| @@ -174,9 +174,9 @@ DECLARE_EVENT_CLASS(net_dev_rx_verbose_template, | |||
| 174 | #endif | 174 | #endif |
| 175 | __entry->queue_mapping = skb->queue_mapping; | 175 | __entry->queue_mapping = skb->queue_mapping; |
| 176 | __entry->skbaddr = skb; | 176 | __entry->skbaddr = skb; |
| 177 | __entry->vlan_tagged = vlan_tx_tag_present(skb); | 177 | __entry->vlan_tagged = skb_vlan_tag_present(skb); |
| 178 | __entry->vlan_proto = ntohs(skb->vlan_proto); | 178 | __entry->vlan_proto = ntohs(skb->vlan_proto); |
| 179 | __entry->vlan_tci = vlan_tx_tag_get(skb); | 179 | __entry->vlan_tci = skb_vlan_tag_get(skb); |
| 180 | __entry->protocol = ntohs(skb->protocol); | 180 | __entry->protocol = ntohs(skb->protocol); |
| 181 | __entry->ip_summed = skb->ip_summed; | 181 | __entry->ip_summed = skb->ip_summed; |
| 182 | __entry->hash = skb->hash; | 182 | __entry->hash = skb->hash; |
diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index 00b100023c47..14b7b6e44c77 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild | |||
| @@ -283,6 +283,7 @@ header-y += net.h | |||
| 283 | header-y += netlink_diag.h | 283 | header-y += netlink_diag.h |
| 284 | header-y += netlink.h | 284 | header-y += netlink.h |
| 285 | header-y += netrom.h | 285 | header-y += netrom.h |
| 286 | header-y += net_namespace.h | ||
| 286 | header-y += net_tstamp.h | 287 | header-y += net_tstamp.h |
| 287 | header-y += nfc.h | 288 | header-y += nfc.h |
| 288 | header-y += nfs2.h | 289 | header-y += nfs2.h |
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h index 5f66d9c2889d..2e49fc880d29 100644 --- a/include/uapi/linux/ethtool.h +++ b/include/uapi/linux/ethtool.h | |||
| @@ -139,6 +139,7 @@ static inline __u32 ethtool_cmd_speed(const struct ethtool_cmd *ep) | |||
| 139 | 139 | ||
| 140 | #define ETHTOOL_FWVERS_LEN 32 | 140 | #define ETHTOOL_FWVERS_LEN 32 |
| 141 | #define ETHTOOL_BUSINFO_LEN 32 | 141 | #define ETHTOOL_BUSINFO_LEN 32 |
| 142 | #define ETHTOOL_EROMVERS_LEN 32 | ||
| 142 | 143 | ||
| 143 | /** | 144 | /** |
| 144 | * struct ethtool_drvinfo - general driver and device information | 145 | * struct ethtool_drvinfo - general driver and device information |
| @@ -148,6 +149,7 @@ static inline __u32 ethtool_cmd_speed(const struct ethtool_cmd *ep) | |||
| 148 | * not be an empty string. | 149 | * not be an empty string. |
| 149 | * @version: Driver version string; may be an empty string | 150 | * @version: Driver version string; may be an empty string |
| 150 | * @fw_version: Firmware version string; may be an empty string | 151 | * @fw_version: Firmware version string; may be an empty string |
| 152 | * @erom_version: Expansion ROM version string; may be an empty string | ||
| 151 | * @bus_info: Device bus address. This should match the dev_name() | 153 | * @bus_info: Device bus address. This should match the dev_name() |
| 152 | * string for the underlying bus device, if there is one. May be | 154 | * string for the underlying bus device, if there is one. May be |
| 153 | * an empty string. | 155 | * an empty string. |
| @@ -176,7 +178,7 @@ struct ethtool_drvinfo { | |||
| 176 | char version[32]; | 178 | char version[32]; |
| 177 | char fw_version[ETHTOOL_FWVERS_LEN]; | 179 | char fw_version[ETHTOOL_FWVERS_LEN]; |
| 178 | char bus_info[ETHTOOL_BUSINFO_LEN]; | 180 | char bus_info[ETHTOOL_BUSINFO_LEN]; |
| 179 | char reserved1[32]; | 181 | char erom_version[ETHTOOL_EROMVERS_LEN]; |
| 180 | char reserved2[12]; | 182 | char reserved2[12]; |
| 181 | __u32 n_priv_flags; | 183 | __u32 n_priv_flags; |
| 182 | __u32 n_stats; | 184 | __u32 n_stats; |
diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h index b03ee8f62d3c..eaaea6208b42 100644 --- a/include/uapi/linux/if_bridge.h +++ b/include/uapi/linux/if_bridge.h | |||
| @@ -125,6 +125,8 @@ enum { | |||
| 125 | #define BRIDGE_VLAN_INFO_MASTER (1<<0) /* Operate on Bridge device as well */ | 125 | #define BRIDGE_VLAN_INFO_MASTER (1<<0) /* Operate on Bridge device as well */ |
| 126 | #define BRIDGE_VLAN_INFO_PVID (1<<1) /* VLAN is PVID, ingress untagged */ | 126 | #define BRIDGE_VLAN_INFO_PVID (1<<1) /* VLAN is PVID, ingress untagged */ |
| 127 | #define BRIDGE_VLAN_INFO_UNTAGGED (1<<2) /* VLAN egresses untagged */ | 127 | #define BRIDGE_VLAN_INFO_UNTAGGED (1<<2) /* VLAN egresses untagged */ |
| 128 | #define BRIDGE_VLAN_INFO_RANGE_BEGIN (1<<3) /* VLAN is start of vlan range */ | ||
| 129 | #define BRIDGE_VLAN_INFO_RANGE_END (1<<4) /* VLAN is end of vlan range */ | ||
| 128 | 130 | ||
| 129 | struct bridge_vlan_info { | 131 | struct bridge_vlan_info { |
| 130 | __u16 flags; | 132 | __u16 flags; |
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index f7d0d2d7173a..0deee3eeddbf 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h | |||
| @@ -146,6 +146,7 @@ enum { | |||
| 146 | IFLA_PHYS_PORT_ID, | 146 | IFLA_PHYS_PORT_ID, |
| 147 | IFLA_CARRIER_CHANGES, | 147 | IFLA_CARRIER_CHANGES, |
| 148 | IFLA_PHYS_SWITCH_ID, | 148 | IFLA_PHYS_SWITCH_ID, |
| 149 | IFLA_LINK_NETNSID, | ||
| 149 | __IFLA_MAX | 150 | __IFLA_MAX |
| 150 | }; | 151 | }; |
| 151 | 152 | ||
| @@ -370,6 +371,9 @@ enum { | |||
| 370 | IFLA_VXLAN_UDP_CSUM, | 371 | IFLA_VXLAN_UDP_CSUM, |
| 371 | IFLA_VXLAN_UDP_ZERO_CSUM6_TX, | 372 | IFLA_VXLAN_UDP_ZERO_CSUM6_TX, |
| 372 | IFLA_VXLAN_UDP_ZERO_CSUM6_RX, | 373 | IFLA_VXLAN_UDP_ZERO_CSUM6_RX, |
| 374 | IFLA_VXLAN_REMCSUM_TX, | ||
| 375 | IFLA_VXLAN_REMCSUM_RX, | ||
| 376 | IFLA_VXLAN_GBP, | ||
| 373 | __IFLA_VXLAN_MAX | 377 | __IFLA_VXLAN_MAX |
| 374 | }; | 378 | }; |
| 375 | #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) | 379 | #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) |
diff --git a/include/uapi/linux/in.h b/include/uapi/linux/in.h index c33a65e3d62c..589ced069e8a 100644 --- a/include/uapi/linux/in.h +++ b/include/uapi/linux/in.h | |||
| @@ -109,6 +109,7 @@ struct in_addr { | |||
| 109 | 109 | ||
| 110 | #define IP_MINTTL 21 | 110 | #define IP_MINTTL 21 |
| 111 | #define IP_NODEFRAG 22 | 111 | #define IP_NODEFRAG 22 |
| 112 | #define IP_CHECKSUM 23 | ||
| 112 | 113 | ||
| 113 | /* IP_MTU_DISCOVER values */ | 114 | /* IP_MTU_DISCOVER values */ |
| 114 | #define IP_PMTUDISC_DONT 0 /* Never send DF frames */ | 115 | #define IP_PMTUDISC_DONT 0 /* Never send DF frames */ |
diff --git a/include/uapi/linux/ipv6.h b/include/uapi/linux/ipv6.h index e863d088b9a5..437a6a4b125a 100644 --- a/include/uapi/linux/ipv6.h +++ b/include/uapi/linux/ipv6.h | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | #ifndef _UAPI_IPV6_H | 1 | #ifndef _UAPI_IPV6_H |
| 2 | #define _UAPI_IPV6_H | 2 | #define _UAPI_IPV6_H |
| 3 | 3 | ||
| 4 | #include <linux/libc-compat.h> | ||
| 4 | #include <linux/types.h> | 5 | #include <linux/types.h> |
| 5 | #include <linux/in6.h> | 6 | #include <linux/in6.h> |
| 6 | #include <asm/byteorder.h> | 7 | #include <asm/byteorder.h> |
| @@ -15,16 +16,19 @@ | |||
| 15 | * *under construction* | 16 | * *under construction* |
| 16 | */ | 17 | */ |
| 17 | 18 | ||
| 18 | 19 | #if __UAPI_DEF_IN6_PKTINFO | |
| 19 | struct in6_pktinfo { | 20 | struct in6_pktinfo { |
| 20 | struct in6_addr ipi6_addr; | 21 | struct in6_addr ipi6_addr; |
| 21 | int ipi6_ifindex; | 22 | int ipi6_ifindex; |
| 22 | }; | 23 | }; |
| 24 | #endif | ||
| 23 | 25 | ||
| 26 | #if __UAPI_DEF_IP6_MTUINFO | ||
| 24 | struct ip6_mtuinfo { | 27 | struct ip6_mtuinfo { |
| 25 | struct sockaddr_in6 ip6m_addr; | 28 | struct sockaddr_in6 ip6m_addr; |
| 26 | __u32 ip6m_mtu; | 29 | __u32 ip6m_mtu; |
| 27 | }; | 30 | }; |
| 31 | #endif | ||
| 28 | 32 | ||
| 29 | struct in6_ifreq { | 33 | struct in6_ifreq { |
| 30 | struct in6_addr ifr6_addr; | 34 | struct in6_addr ifr6_addr; |
| @@ -165,6 +169,7 @@ enum { | |||
| 165 | DEVCONF_SUPPRESS_FRAG_NDISC, | 169 | DEVCONF_SUPPRESS_FRAG_NDISC, |
| 166 | DEVCONF_ACCEPT_RA_FROM_LOCAL, | 170 | DEVCONF_ACCEPT_RA_FROM_LOCAL, |
| 167 | DEVCONF_USE_OPTIMISTIC, | 171 | DEVCONF_USE_OPTIMISTIC, |
| 172 | DEVCONF_ACCEPT_RA_MTU, | ||
| 168 | DEVCONF_MAX | 173 | DEVCONF_MAX |
| 169 | }; | 174 | }; |
| 170 | 175 | ||
diff --git a/include/uapi/linux/l2tp.h b/include/uapi/linux/l2tp.h index 21caa2631c20..347ef22a964e 100644 --- a/include/uapi/linux/l2tp.h +++ b/include/uapi/linux/l2tp.h | |||
| @@ -178,5 +178,6 @@ enum l2tp_seqmode { | |||
| 178 | */ | 178 | */ |
| 179 | #define L2TP_GENL_NAME "l2tp" | 179 | #define L2TP_GENL_NAME "l2tp" |
| 180 | #define L2TP_GENL_VERSION 0x1 | 180 | #define L2TP_GENL_VERSION 0x1 |
| 181 | #define L2TP_GENL_MCGROUP "l2tp" | ||
| 181 | 182 | ||
| 182 | #endif /* _UAPI_LINUX_L2TP_H_ */ | 183 | #endif /* _UAPI_LINUX_L2TP_H_ */ |
diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h index e28807ad17fa..fa673e9cc040 100644 --- a/include/uapi/linux/libc-compat.h +++ b/include/uapi/linux/libc-compat.h | |||
| @@ -70,6 +70,8 @@ | |||
| 70 | #define __UAPI_DEF_IPV6_MREQ 0 | 70 | #define __UAPI_DEF_IPV6_MREQ 0 |
| 71 | #define __UAPI_DEF_IPPROTO_V6 0 | 71 | #define __UAPI_DEF_IPPROTO_V6 0 |
| 72 | #define __UAPI_DEF_IPV6_OPTIONS 0 | 72 | #define __UAPI_DEF_IPV6_OPTIONS 0 |
| 73 | #define __UAPI_DEF_IN6_PKTINFO 0 | ||
| 74 | #define __UAPI_DEF_IP6_MTUINFO 0 | ||
| 73 | 75 | ||
| 74 | #else | 76 | #else |
| 75 | 77 | ||
| @@ -84,6 +86,8 @@ | |||
| 84 | #define __UAPI_DEF_IPV6_MREQ 1 | 86 | #define __UAPI_DEF_IPV6_MREQ 1 |
| 85 | #define __UAPI_DEF_IPPROTO_V6 1 | 87 | #define __UAPI_DEF_IPPROTO_V6 1 |
| 86 | #define __UAPI_DEF_IPV6_OPTIONS 1 | 88 | #define __UAPI_DEF_IPV6_OPTIONS 1 |
| 89 | #define __UAPI_DEF_IN6_PKTINFO 1 | ||
| 90 | #define __UAPI_DEF_IP6_MTUINFO 1 | ||
| 87 | 91 | ||
| 88 | #endif /* _NETINET_IN_H */ | 92 | #endif /* _NETINET_IN_H */ |
| 89 | 93 | ||
| @@ -106,6 +110,8 @@ | |||
| 106 | #define __UAPI_DEF_IPV6_MREQ 1 | 110 | #define __UAPI_DEF_IPV6_MREQ 1 |
| 107 | #define __UAPI_DEF_IPPROTO_V6 1 | 111 | #define __UAPI_DEF_IPPROTO_V6 1 |
| 108 | #define __UAPI_DEF_IPV6_OPTIONS 1 | 112 | #define __UAPI_DEF_IPV6_OPTIONS 1 |
| 113 | #define __UAPI_DEF_IN6_PKTINFO 1 | ||
| 114 | #define __UAPI_DEF_IP6_MTUINFO 1 | ||
| 109 | 115 | ||
| 110 | /* Definitions for xattr.h */ | 116 | /* Definitions for xattr.h */ |
| 111 | #define __UAPI_DEF_XATTR 1 | 117 | #define __UAPI_DEF_XATTR 1 |
diff --git a/include/uapi/linux/neighbour.h b/include/uapi/linux/neighbour.h index f3d77f9f1e0b..3873a35509aa 100644 --- a/include/uapi/linux/neighbour.h +++ b/include/uapi/linux/neighbour.h | |||
| @@ -25,6 +25,7 @@ enum { | |||
| 25 | NDA_VNI, | 25 | NDA_VNI, |
| 26 | NDA_IFINDEX, | 26 | NDA_IFINDEX, |
| 27 | NDA_MASTER, | 27 | NDA_MASTER, |
| 28 | NDA_LINK_NETNSID, | ||
| 28 | __NDA_MAX | 29 | __NDA_MAX |
| 29 | }; | 30 | }; |
| 30 | 31 | ||
diff --git a/include/uapi/linux/net_namespace.h b/include/uapi/linux/net_namespace.h new file mode 100644 index 000000000000..778cd2c3ebf4 --- /dev/null +++ b/include/uapi/linux/net_namespace.h | |||
| @@ -0,0 +1,23 @@ | |||
| 1 | /* Copyright (c) 2015 6WIND S.A. | ||
| 2 | * Author: Nicolas Dichtel <nicolas.dichtel@6wind.com> | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify it | ||
| 5 | * under the terms and conditions of the GNU General Public License, | ||
| 6 | * version 2, as published by the Free Software Foundation. | ||
| 7 | */ | ||
| 8 | #ifndef _UAPI_LINUX_NET_NAMESPACE_H_ | ||
| 9 | #define _UAPI_LINUX_NET_NAMESPACE_H_ | ||
| 10 | |||
| 11 | /* Attributes of RTM_NEWNSID/RTM_GETNSID messages */ | ||
| 12 | enum { | ||
| 13 | NETNSA_NONE, | ||
| 14 | #define NETNSA_NSID_NOT_ASSIGNED -1 | ||
| 15 | NETNSA_NSID, | ||
| 16 | NETNSA_PID, | ||
| 17 | NETNSA_FD, | ||
| 18 | __NETNSA_MAX, | ||
| 19 | }; | ||
| 20 | |||
| 21 | #define NETNSA_MAX (__NETNSA_MAX - 1) | ||
| 22 | |||
| 23 | #endif /* _UAPI_LINUX_NET_NAMESPACE_H_ */ | ||
diff --git a/include/uapi/linux/net_tstamp.h b/include/uapi/linux/net_tstamp.h index edbc888ceb51..6d1abea9746e 100644 --- a/include/uapi/linux/net_tstamp.h +++ b/include/uapi/linux/net_tstamp.h | |||
| @@ -24,8 +24,9 @@ enum { | |||
| 24 | SOF_TIMESTAMPING_TX_SCHED = (1<<8), | 24 | SOF_TIMESTAMPING_TX_SCHED = (1<<8), |
| 25 | SOF_TIMESTAMPING_TX_ACK = (1<<9), | 25 | SOF_TIMESTAMPING_TX_ACK = (1<<9), |
| 26 | SOF_TIMESTAMPING_OPT_CMSG = (1<<10), | 26 | SOF_TIMESTAMPING_OPT_CMSG = (1<<10), |
| 27 | SOF_TIMESTAMPING_OPT_TSONLY = (1<<11), | ||
| 27 | 28 | ||
| 28 | SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_OPT_CMSG, | 29 | SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_OPT_TSONLY, |
| 29 | SOF_TIMESTAMPING_MASK = (SOF_TIMESTAMPING_LAST - 1) | | 30 | SOF_TIMESTAMPING_MASK = (SOF_TIMESTAMPING_LAST - 1) | |
| 30 | SOF_TIMESTAMPING_LAST | 31 | SOF_TIMESTAMPING_LAST |
| 31 | }; | 32 | }; |
diff --git a/include/uapi/linux/nfc.h b/include/uapi/linux/nfc.h index 8119255feae4..c1e2e63cf9b5 100644 --- a/include/uapi/linux/nfc.h +++ b/include/uapi/linux/nfc.h | |||
| @@ -183,6 +183,7 @@ enum nfc_attrs { | |||
| 183 | NFC_ATTR_SE_APDU, | 183 | NFC_ATTR_SE_APDU, |
| 184 | NFC_ATTR_TARGET_ISO15693_DSFID, | 184 | NFC_ATTR_TARGET_ISO15693_DSFID, |
| 185 | NFC_ATTR_TARGET_ISO15693_UID, | 185 | NFC_ATTR_TARGET_ISO15693_UID, |
| 186 | NFC_ATTR_SE_PARAMS, | ||
| 186 | /* private: internal use only */ | 187 | /* private: internal use only */ |
| 187 | __NFC_ATTR_AFTER_LAST | 188 | __NFC_ATTR_AFTER_LAST |
| 188 | }; | 189 | }; |
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index b37bd5a1cb82..68b294e83944 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h | |||
| @@ -29,6 +29,13 @@ | |||
| 29 | 29 | ||
| 30 | #define NL80211_GENL_NAME "nl80211" | 30 | #define NL80211_GENL_NAME "nl80211" |
| 31 | 31 | ||
| 32 | #define NL80211_MULTICAST_GROUP_CONFIG "config" | ||
| 33 | #define NL80211_MULTICAST_GROUP_SCAN "scan" | ||
| 34 | #define NL80211_MULTICAST_GROUP_REG "regulatory" | ||
| 35 | #define NL80211_MULTICAST_GROUP_MLME "mlme" | ||
| 36 | #define NL80211_MULTICAST_GROUP_VENDOR "vendor" | ||
| 37 | #define NL80211_MULTICAST_GROUP_TESTMODE "testmode" | ||
| 38 | |||
| 32 | /** | 39 | /** |
| 33 | * DOC: Station handling | 40 | * DOC: Station handling |
| 34 | * | 41 | * |
| @@ -173,8 +180,8 @@ | |||
| 173 | * %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME. | 180 | * %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME. |
| 174 | * | 181 | * |
| 175 | * @NL80211_CMD_GET_INTERFACE: Request an interface's configuration; | 182 | * @NL80211_CMD_GET_INTERFACE: Request an interface's configuration; |
| 176 | * either a dump request on a %NL80211_ATTR_WIPHY or a specific get | 183 | * either a dump request for all interfaces or a specific get with a |
| 177 | * on an %NL80211_ATTR_IFINDEX is supported. | 184 | * single %NL80211_ATTR_IFINDEX is supported. |
| 178 | * @NL80211_CMD_SET_INTERFACE: Set type of a virtual interface, requires | 185 | * @NL80211_CMD_SET_INTERFACE: Set type of a virtual interface, requires |
| 179 | * %NL80211_ATTR_IFINDEX and %NL80211_ATTR_IFTYPE. | 186 | * %NL80211_ATTR_IFINDEX and %NL80211_ATTR_IFTYPE. |
| 180 | * @NL80211_CMD_NEW_INTERFACE: Newly created virtual interface or response | 187 | * @NL80211_CMD_NEW_INTERFACE: Newly created virtual interface or response |
| @@ -252,7 +259,18 @@ | |||
| 252 | * %NL80211_ATTR_IFINDEX. | 259 | * %NL80211_ATTR_IFINDEX. |
| 253 | * | 260 | * |
| 254 | * @NL80211_CMD_GET_REG: ask the wireless core to send us its currently set | 261 | * @NL80211_CMD_GET_REG: ask the wireless core to send us its currently set |
| 255 | * regulatory domain. | 262 | * regulatory domain. If %NL80211_ATTR_WIPHY is specified and the device |
| 263 | * has a private regulatory domain, it will be returned. Otherwise, the | ||
| 264 | * global regdomain will be returned. | ||
| 265 | * A device will have a private regulatory domain if it uses the | ||
| 266 | * regulatory_hint() API. Even when a private regdomain is used the channel | ||
| 267 | * information will still be mended according to further hints from | ||
| 268 | * the regulatory core to help with compliance. A dump version of this API | ||
| 269 | * is now available which will returns the global regdomain as well as | ||
| 270 | * all private regdomains of present wiphys (for those that have it). | ||
| 271 | * If a wiphy is self-managed (%NL80211_ATTR_WIPHY_SELF_MANAGED_REG), then | ||
| 272 | * its private regdomain is the only valid one for it. The regulatory | ||
| 273 | * core is not used to help with compliance in this case. | ||
| 256 | * @NL80211_CMD_SET_REG: Set current regulatory domain. CRDA sends this command | 274 | * @NL80211_CMD_SET_REG: Set current regulatory domain. CRDA sends this command |
| 257 | * after being queried by the kernel. CRDA replies by sending a regulatory | 275 | * after being queried by the kernel. CRDA replies by sending a regulatory |
| 258 | * domain structure which consists of %NL80211_ATTR_REG_ALPHA set to our | 276 | * domain structure which consists of %NL80211_ATTR_REG_ALPHA set to our |
| @@ -306,7 +324,9 @@ | |||
| 306 | * if passed, define which channels should be scanned; if not | 324 | * if passed, define which channels should be scanned; if not |
| 307 | * passed, all channels allowed for the current regulatory domain | 325 | * passed, all channels allowed for the current regulatory domain |
| 308 | * are used. Extra IEs can also be passed from the userspace by | 326 | * are used. Extra IEs can also be passed from the userspace by |
| 309 | * using the %NL80211_ATTR_IE attribute. | 327 | * using the %NL80211_ATTR_IE attribute. The first cycle of the |
| 328 | * scheduled scan can be delayed by %NL80211_ATTR_SCHED_SCAN_DELAY | ||
| 329 | * is supplied. | ||
| 310 | * @NL80211_CMD_STOP_SCHED_SCAN: stop a scheduled scan. Returns -ENOENT if | 330 | * @NL80211_CMD_STOP_SCHED_SCAN: stop a scheduled scan. Returns -ENOENT if |
| 311 | * scheduled scan is not running. The caller may assume that as soon | 331 | * scheduled scan is not running. The caller may assume that as soon |
| 312 | * as the call returns, it is safe to start a new scheduled scan again. | 332 | * as the call returns, it is safe to start a new scheduled scan again. |
| @@ -774,6 +794,10 @@ | |||
| 774 | * peer given by %NL80211_ATTR_MAC. Both peers must be on the base channel | 794 | * peer given by %NL80211_ATTR_MAC. Both peers must be on the base channel |
| 775 | * when this command completes. | 795 | * when this command completes. |
| 776 | * | 796 | * |
| 797 | * @NL80211_CMD_WIPHY_REG_CHANGE: Similar to %NL80211_CMD_REG_CHANGE, but used | ||
| 798 | * as an event to indicate changes for devices with wiphy-specific regdom | ||
| 799 | * management. | ||
| 800 | * | ||
| 777 | * @NL80211_CMD_MAX: highest used command number | 801 | * @NL80211_CMD_MAX: highest used command number |
| 778 | * @__NL80211_CMD_AFTER_LAST: internal use | 802 | * @__NL80211_CMD_AFTER_LAST: internal use |
| 779 | */ | 803 | */ |
| @@ -958,6 +982,8 @@ enum nl80211_commands { | |||
| 958 | NL80211_CMD_TDLS_CHANNEL_SWITCH, | 982 | NL80211_CMD_TDLS_CHANNEL_SWITCH, |
| 959 | NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, | 983 | NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, |
| 960 | 984 | ||
| 985 | NL80211_CMD_WIPHY_REG_CHANGE, | ||
| 986 | |||
| 961 | /* add new commands above here */ | 987 | /* add new commands above here */ |
| 962 | 988 | ||
| 963 | /* used to define NL80211_CMD_MAX below */ | 989 | /* used to define NL80211_CMD_MAX below */ |
| @@ -1655,6 +1681,9 @@ enum nl80211_commands { | |||
| 1655 | * @NL80211_ATTR_SOCKET_OWNER: Flag attribute, if set during interface | 1681 | * @NL80211_ATTR_SOCKET_OWNER: Flag attribute, if set during interface |
| 1656 | * creation then the new interface will be owned by the netlink socket | 1682 | * creation then the new interface will be owned by the netlink socket |
| 1657 | * that created it and will be destroyed when the socket is closed. | 1683 | * that created it and will be destroyed when the socket is closed. |
| 1684 | * If set during scheduled scan start then the new scan req will be | ||
| 1685 | * owned by the netlink socket that created it and the scheduled scan will | ||
| 1686 | * be stopped when the socket is closed. | ||
| 1658 | * | 1687 | * |
| 1659 | * @NL80211_ATTR_TDLS_INITIATOR: flag attribute indicating the current end is | 1688 | * @NL80211_ATTR_TDLS_INITIATOR: flag attribute indicating the current end is |
| 1660 | * the TDLS link initiator. | 1689 | * the TDLS link initiator. |
| @@ -1688,6 +1717,29 @@ enum nl80211_commands { | |||
| 1688 | * | 1717 | * |
| 1689 | * @NL80211_ATTR_MAC_MASK: MAC address mask | 1718 | * @NL80211_ATTR_MAC_MASK: MAC address mask |
| 1690 | * | 1719 | * |
| 1720 | * @NL80211_ATTR_WIPHY_SELF_MANAGED_REG: flag attribute indicating this device | ||
| 1721 | * is self-managing its regulatory information and any regulatory domain | ||
| 1722 | * obtained from it is coming from the device's wiphy and not the global | ||
| 1723 | * cfg80211 regdomain. | ||
| 1724 | * | ||
| 1725 | * @NL80211_ATTR_EXT_FEATURES: extended feature flags contained in a byte | ||
| 1726 | * array. The feature flags are identified by their bit index (see &enum | ||
| 1727 | * nl80211_ext_feature_index). The bit index is ordered starting at the | ||
| 1728 | * least-significant bit of the first byte in the array, ie. bit index 0 | ||
| 1729 | * is located at bit 0 of byte 0. bit index 25 would be located at bit 1 | ||
| 1730 | * of byte 3 (u8 array). | ||
| 1731 | * | ||
| 1732 | * @NL80211_ATTR_SURVEY_RADIO_STATS: Request overall radio statistics to be | ||
| 1733 | * returned along with other survey data. If set, @NL80211_CMD_GET_SURVEY | ||
| 1734 | * may return a survey entry without a channel indicating global radio | ||
| 1735 | * statistics (only some values are valid and make sense.) | ||
| 1736 | * For devices that don't return such an entry even then, the information | ||
| 1737 | * should be contained in the result as the sum of the respective counters | ||
| 1738 | * over all channels. | ||
| 1739 | * | ||
| 1740 | * @NL80211_ATTR_SCHED_SCAN_DELAY: delay before a scheduled scan (or a | ||
| 1741 | * WoWLAN net-detect scan) is started, u32 in seconds. | ||
| 1742 | * | ||
| 1691 | * @NUM_NL80211_ATTR: total number of nl80211_attrs available | 1743 | * @NUM_NL80211_ATTR: total number of nl80211_attrs available |
| 1692 | * @NL80211_ATTR_MAX: highest attribute number currently defined | 1744 | * @NL80211_ATTR_MAX: highest attribute number currently defined |
| 1693 | * @__NL80211_ATTR_AFTER_LAST: internal use | 1745 | * @__NL80211_ATTR_AFTER_LAST: internal use |
| @@ -2045,6 +2097,16 @@ enum nl80211_attrs { | |||
| 2045 | 2097 | ||
| 2046 | NL80211_ATTR_MAC_MASK, | 2098 | NL80211_ATTR_MAC_MASK, |
| 2047 | 2099 | ||
| 2100 | NL80211_ATTR_WIPHY_SELF_MANAGED_REG, | ||
| 2101 | |||
| 2102 | NL80211_ATTR_EXT_FEATURES, | ||
| 2103 | |||
| 2104 | NL80211_ATTR_SURVEY_RADIO_STATS, | ||
| 2105 | |||
| 2106 | NL80211_ATTR_NETNS_FD, | ||
| 2107 | |||
| 2108 | NL80211_ATTR_SCHED_SCAN_DELAY, | ||
| 2109 | |||
| 2048 | /* add attributes here, update the policy in nl80211.c */ | 2110 | /* add attributes here, update the policy in nl80211.c */ |
| 2049 | 2111 | ||
| 2050 | __NL80211_ATTR_AFTER_LAST, | 2112 | __NL80211_ATTR_AFTER_LAST, |
| @@ -2085,7 +2147,7 @@ enum nl80211_attrs { | |||
| 2085 | 2147 | ||
| 2086 | #define NL80211_MAX_SUPP_RATES 32 | 2148 | #define NL80211_MAX_SUPP_RATES 32 |
| 2087 | #define NL80211_MAX_SUPP_HT_RATES 77 | 2149 | #define NL80211_MAX_SUPP_HT_RATES 77 |
| 2088 | #define NL80211_MAX_SUPP_REG_RULES 32 | 2150 | #define NL80211_MAX_SUPP_REG_RULES 64 |
| 2089 | #define NL80211_TKIP_DATA_OFFSET_ENCR_KEY 0 | 2151 | #define NL80211_TKIP_DATA_OFFSET_ENCR_KEY 0 |
| 2090 | #define NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY 16 | 2152 | #define NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY 16 |
| 2091 | #define NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY 24 | 2153 | #define NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY 24 |
| @@ -2225,8 +2287,15 @@ struct nl80211_sta_flag_update { | |||
| 2225 | * @NL80211_RATE_INFO_VHT_MCS: MCS index for VHT (u8) | 2287 | * @NL80211_RATE_INFO_VHT_MCS: MCS index for VHT (u8) |
| 2226 | * @NL80211_RATE_INFO_VHT_NSS: number of streams in VHT (u8) | 2288 | * @NL80211_RATE_INFO_VHT_NSS: number of streams in VHT (u8) |
| 2227 | * @NL80211_RATE_INFO_80_MHZ_WIDTH: 80 MHz VHT rate | 2289 | * @NL80211_RATE_INFO_80_MHZ_WIDTH: 80 MHz VHT rate |
| 2228 | * @NL80211_RATE_INFO_80P80_MHZ_WIDTH: 80+80 MHz VHT rate | 2290 | * @NL80211_RATE_INFO_80P80_MHZ_WIDTH: unused - 80+80 is treated the |
| 2291 | * same as 160 for purposes of the bitrates | ||
| 2229 | * @NL80211_RATE_INFO_160_MHZ_WIDTH: 160 MHz VHT rate | 2292 | * @NL80211_RATE_INFO_160_MHZ_WIDTH: 160 MHz VHT rate |
| 2293 | * @NL80211_RATE_INFO_10_MHZ_WIDTH: 10 MHz width - note that this is | ||
| 2294 | * a legacy rate and will be reported as the actual bitrate, i.e. | ||
| 2295 | * half the base (20 MHz) rate | ||
| 2296 | * @NL80211_RATE_INFO_5_MHZ_WIDTH: 5 MHz width - note that this is | ||
| 2297 | * a legacy rate and will be reported as the actual bitrate, i.e. | ||
| 2298 | * a quarter of the base (20 MHz) rate | ||
| 2230 | * @__NL80211_RATE_INFO_AFTER_LAST: internal use | 2299 | * @__NL80211_RATE_INFO_AFTER_LAST: internal use |
| 2231 | */ | 2300 | */ |
| 2232 | enum nl80211_rate_info { | 2301 | enum nl80211_rate_info { |
| @@ -2241,6 +2310,8 @@ enum nl80211_rate_info { | |||
| 2241 | NL80211_RATE_INFO_80_MHZ_WIDTH, | 2310 | NL80211_RATE_INFO_80_MHZ_WIDTH, |
| 2242 | NL80211_RATE_INFO_80P80_MHZ_WIDTH, | 2311 | NL80211_RATE_INFO_80P80_MHZ_WIDTH, |
| 2243 | NL80211_RATE_INFO_160_MHZ_WIDTH, | 2312 | NL80211_RATE_INFO_160_MHZ_WIDTH, |
| 2313 | NL80211_RATE_INFO_10_MHZ_WIDTH, | ||
| 2314 | NL80211_RATE_INFO_5_MHZ_WIDTH, | ||
| 2244 | 2315 | ||
| 2245 | /* keep last */ | 2316 | /* keep last */ |
| 2246 | __NL80211_RATE_INFO_AFTER_LAST, | 2317 | __NL80211_RATE_INFO_AFTER_LAST, |
| @@ -2285,18 +2356,24 @@ enum nl80211_sta_bss_param { | |||
| 2285 | * | 2356 | * |
| 2286 | * @__NL80211_STA_INFO_INVALID: attribute number 0 is reserved | 2357 | * @__NL80211_STA_INFO_INVALID: attribute number 0 is reserved |
| 2287 | * @NL80211_STA_INFO_INACTIVE_TIME: time since last activity (u32, msecs) | 2358 | * @NL80211_STA_INFO_INACTIVE_TIME: time since last activity (u32, msecs) |
| 2288 | * @NL80211_STA_INFO_RX_BYTES: total received bytes (u32, from this station) | 2359 | * @NL80211_STA_INFO_RX_BYTES: total received bytes (MPDU length) |
| 2289 | * @NL80211_STA_INFO_TX_BYTES: total transmitted bytes (u32, to this station) | 2360 | * (u32, from this station) |
| 2290 | * @NL80211_STA_INFO_RX_BYTES64: total received bytes (u64, from this station) | 2361 | * @NL80211_STA_INFO_TX_BYTES: total transmitted bytes (MPDU length) |
| 2291 | * @NL80211_STA_INFO_TX_BYTES64: total transmitted bytes (u64, to this station) | 2362 | * (u32, to this station) |
| 2363 | * @NL80211_STA_INFO_RX_BYTES64: total received bytes (MPDU length) | ||
| 2364 | * (u64, from this station) | ||
| 2365 | * @NL80211_STA_INFO_TX_BYTES64: total transmitted bytes (MPDU length) | ||
| 2366 | * (u64, to this station) | ||
| 2292 | * @NL80211_STA_INFO_SIGNAL: signal strength of last received PPDU (u8, dBm) | 2367 | * @NL80211_STA_INFO_SIGNAL: signal strength of last received PPDU (u8, dBm) |
| 2293 | * @NL80211_STA_INFO_TX_BITRATE: current unicast tx rate, nested attribute | 2368 | * @NL80211_STA_INFO_TX_BITRATE: current unicast tx rate, nested attribute |
| 2294 | * containing info as possible, see &enum nl80211_rate_info | 2369 | * containing info as possible, see &enum nl80211_rate_info |
| 2295 | * @NL80211_STA_INFO_RX_PACKETS: total received packet (u32, from this station) | 2370 | * @NL80211_STA_INFO_RX_PACKETS: total received packet (MSDUs and MMPDUs) |
| 2296 | * @NL80211_STA_INFO_TX_PACKETS: total transmitted packets (u32, to this | 2371 | * (u32, from this station) |
| 2297 | * station) | 2372 | * @NL80211_STA_INFO_TX_PACKETS: total transmitted packets (MSDUs and MMPDUs) |
| 2298 | * @NL80211_STA_INFO_TX_RETRIES: total retries (u32, to this station) | 2373 | * (u32, to this station) |
| 2299 | * @NL80211_STA_INFO_TX_FAILED: total failed packets (u32, to this station) | 2374 | * @NL80211_STA_INFO_TX_RETRIES: total retries (MPDUs) (u32, to this station) |
| 2375 | * @NL80211_STA_INFO_TX_FAILED: total failed packets (MPDUs) | ||
| 2376 | * (u32, to this station) | ||
| 2300 | * @NL80211_STA_INFO_SIGNAL_AVG: signal strength average (u8, dBm) | 2377 | * @NL80211_STA_INFO_SIGNAL_AVG: signal strength average (u8, dBm) |
| 2301 | * @NL80211_STA_INFO_LLID: the station's mesh LLID | 2378 | * @NL80211_STA_INFO_LLID: the station's mesh LLID |
| 2302 | * @NL80211_STA_INFO_PLID: the station's mesh PLID | 2379 | * @NL80211_STA_INFO_PLID: the station's mesh PLID |
| @@ -2320,6 +2397,16 @@ enum nl80211_sta_bss_param { | |||
| 2320 | * Same format as NL80211_STA_INFO_CHAIN_SIGNAL. | 2397 | * Same format as NL80211_STA_INFO_CHAIN_SIGNAL. |
| 2321 | * @NL80211_STA_EXPECTED_THROUGHPUT: expected throughput considering also the | 2398 | * @NL80211_STA_EXPECTED_THROUGHPUT: expected throughput considering also the |
| 2322 | * 802.11 header (u32, kbps) | 2399 | * 802.11 header (u32, kbps) |
| 2400 | * @NL80211_STA_INFO_RX_DROP_MISC: RX packets dropped for unspecified reasons | ||
| 2401 | * (u64) | ||
| 2402 | * @NL80211_STA_INFO_BEACON_RX: number of beacons received from this peer (u64) | ||
| 2403 | * @NL80211_STA_INFO_BEACON_SIGNAL_AVG: signal strength average | ||
| 2404 | * for beacons only (u8, dBm) | ||
| 2405 | * @NL80211_STA_INFO_TID_STATS: per-TID statistics (see &enum nl80211_tid_stats) | ||
| 2406 | * This is a nested attribute where each the inner attribute number is the | ||
| 2407 | * TID+1 and the special TID 16 (i.e. value 17) is used for non-QoS frames; | ||
| 2408 | * each one of those is again nested with &enum nl80211_tid_stats | ||
| 2409 | * attributes carrying the actual values. | ||
| 2323 | * @__NL80211_STA_INFO_AFTER_LAST: internal | 2410 | * @__NL80211_STA_INFO_AFTER_LAST: internal |
| 2324 | * @NL80211_STA_INFO_MAX: highest possible station info attribute | 2411 | * @NL80211_STA_INFO_MAX: highest possible station info attribute |
| 2325 | */ | 2412 | */ |
| @@ -2352,6 +2439,10 @@ enum nl80211_sta_info { | |||
| 2352 | NL80211_STA_INFO_CHAIN_SIGNAL, | 2439 | NL80211_STA_INFO_CHAIN_SIGNAL, |
| 2353 | NL80211_STA_INFO_CHAIN_SIGNAL_AVG, | 2440 | NL80211_STA_INFO_CHAIN_SIGNAL_AVG, |
| 2354 | NL80211_STA_INFO_EXPECTED_THROUGHPUT, | 2441 | NL80211_STA_INFO_EXPECTED_THROUGHPUT, |
| 2442 | NL80211_STA_INFO_RX_DROP_MISC, | ||
| 2443 | NL80211_STA_INFO_BEACON_RX, | ||
| 2444 | NL80211_STA_INFO_BEACON_SIGNAL_AVG, | ||
| 2445 | NL80211_STA_INFO_TID_STATS, | ||
| 2355 | 2446 | ||
| 2356 | /* keep last */ | 2447 | /* keep last */ |
| 2357 | __NL80211_STA_INFO_AFTER_LAST, | 2448 | __NL80211_STA_INFO_AFTER_LAST, |
| @@ -2359,6 +2450,31 @@ enum nl80211_sta_info { | |||
| 2359 | }; | 2450 | }; |
| 2360 | 2451 | ||
| 2361 | /** | 2452 | /** |
| 2453 | * enum nl80211_tid_stats - per TID statistics attributes | ||
| 2454 | * @__NL80211_TID_STATS_INVALID: attribute number 0 is reserved | ||
| 2455 | * @NL80211_TID_STATS_RX_MSDU: number of MSDUs received (u64) | ||
| 2456 | * @NL80211_TID_STATS_TX_MSDU: number of MSDUs transmitted (or | ||
| 2457 | * attempted to transmit; u64) | ||
| 2458 | * @NL80211_TID_STATS_TX_MSDU_RETRIES: number of retries for | ||
| 2459 | * transmitted MSDUs (not counting the first attempt; u64) | ||
| 2460 | * @NL80211_TID_STATS_TX_MSDU_FAILED: number of failed transmitted | ||
| 2461 | * MSDUs (u64) | ||
| 2462 | * @NUM_NL80211_TID_STATS: number of attributes here | ||
| 2463 | * @NL80211_TID_STATS_MAX: highest numbered attribute here | ||
| 2464 | */ | ||
| 2465 | enum nl80211_tid_stats { | ||
| 2466 | __NL80211_TID_STATS_INVALID, | ||
| 2467 | NL80211_TID_STATS_RX_MSDU, | ||
| 2468 | NL80211_TID_STATS_TX_MSDU, | ||
| 2469 | NL80211_TID_STATS_TX_MSDU_RETRIES, | ||
| 2470 | NL80211_TID_STATS_TX_MSDU_FAILED, | ||
| 2471 | |||
| 2472 | /* keep last */ | ||
| 2473 | NUM_NL80211_TID_STATS, | ||
| 2474 | NL80211_TID_STATS_MAX = NUM_NL80211_TID_STATS - 1 | ||
| 2475 | }; | ||
| 2476 | |||
| 2477 | /** | ||
| 2362 | * enum nl80211_mpath_flags - nl80211 mesh path flags | 2478 | * enum nl80211_mpath_flags - nl80211 mesh path flags |
| 2363 | * | 2479 | * |
| 2364 | * @NL80211_MPATH_FLAG_ACTIVE: the mesh path is active | 2480 | * @NL80211_MPATH_FLAG_ACTIVE: the mesh path is active |
| @@ -2772,16 +2888,18 @@ enum nl80211_user_reg_hint_type { | |||
| 2772 | * @NL80211_SURVEY_INFO_FREQUENCY: center frequency of channel | 2888 | * @NL80211_SURVEY_INFO_FREQUENCY: center frequency of channel |
| 2773 | * @NL80211_SURVEY_INFO_NOISE: noise level of channel (u8, dBm) | 2889 | * @NL80211_SURVEY_INFO_NOISE: noise level of channel (u8, dBm) |
| 2774 | * @NL80211_SURVEY_INFO_IN_USE: channel is currently being used | 2890 | * @NL80211_SURVEY_INFO_IN_USE: channel is currently being used |
| 2775 | * @NL80211_SURVEY_INFO_CHANNEL_TIME: amount of time (in ms) that the radio | 2891 | * @NL80211_SURVEY_INFO_TIME: amount of time (in ms) that the radio |
| 2776 | * spent on this channel | 2892 | * was turned on (on channel or globally) |
| 2777 | * @NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY: amount of the time the primary | 2893 | * @NL80211_SURVEY_INFO_TIME_BUSY: amount of the time the primary |
| 2778 | * channel was sensed busy (either due to activity or energy detect) | 2894 | * channel was sensed busy (either due to activity or energy detect) |
| 2779 | * @NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY: amount of time the extension | 2895 | * @NL80211_SURVEY_INFO_TIME_EXT_BUSY: amount of time the extension |
| 2780 | * channel was sensed busy | 2896 | * channel was sensed busy |
| 2781 | * @NL80211_SURVEY_INFO_CHANNEL_TIME_RX: amount of time the radio spent | 2897 | * @NL80211_SURVEY_INFO_TIME_RX: amount of time the radio spent |
| 2782 | * receiving data | 2898 | * receiving data (on channel or globally) |
| 2783 | * @NL80211_SURVEY_INFO_CHANNEL_TIME_TX: amount of time the radio spent | 2899 | * @NL80211_SURVEY_INFO_TIME_TX: amount of time the radio spent |
| 2784 | * transmitting data | 2900 | * transmitting data (on channel or globally) |
| 2901 | * @NL80211_SURVEY_INFO_TIME_SCAN: time the radio spent for scan | ||
| 2902 | * (on this channel or globally) | ||
| 2785 | * @NL80211_SURVEY_INFO_MAX: highest survey info attribute number | 2903 | * @NL80211_SURVEY_INFO_MAX: highest survey info attribute number |
| 2786 | * currently defined | 2904 | * currently defined |
| 2787 | * @__NL80211_SURVEY_INFO_AFTER_LAST: internal use | 2905 | * @__NL80211_SURVEY_INFO_AFTER_LAST: internal use |
| @@ -2791,17 +2909,25 @@ enum nl80211_survey_info { | |||
| 2791 | NL80211_SURVEY_INFO_FREQUENCY, | 2909 | NL80211_SURVEY_INFO_FREQUENCY, |
| 2792 | NL80211_SURVEY_INFO_NOISE, | 2910 | NL80211_SURVEY_INFO_NOISE, |
| 2793 | NL80211_SURVEY_INFO_IN_USE, | 2911 | NL80211_SURVEY_INFO_IN_USE, |
| 2794 | NL80211_SURVEY_INFO_CHANNEL_TIME, | 2912 | NL80211_SURVEY_INFO_TIME, |
| 2795 | NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY, | 2913 | NL80211_SURVEY_INFO_TIME_BUSY, |
| 2796 | NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY, | 2914 | NL80211_SURVEY_INFO_TIME_EXT_BUSY, |
| 2797 | NL80211_SURVEY_INFO_CHANNEL_TIME_RX, | 2915 | NL80211_SURVEY_INFO_TIME_RX, |
| 2798 | NL80211_SURVEY_INFO_CHANNEL_TIME_TX, | 2916 | NL80211_SURVEY_INFO_TIME_TX, |
| 2917 | NL80211_SURVEY_INFO_TIME_SCAN, | ||
| 2799 | 2918 | ||
| 2800 | /* keep last */ | 2919 | /* keep last */ |
| 2801 | __NL80211_SURVEY_INFO_AFTER_LAST, | 2920 | __NL80211_SURVEY_INFO_AFTER_LAST, |
| 2802 | NL80211_SURVEY_INFO_MAX = __NL80211_SURVEY_INFO_AFTER_LAST - 1 | 2921 | NL80211_SURVEY_INFO_MAX = __NL80211_SURVEY_INFO_AFTER_LAST - 1 |
| 2803 | }; | 2922 | }; |
| 2804 | 2923 | ||
| 2924 | /* keep old names for compatibility */ | ||
| 2925 | #define NL80211_SURVEY_INFO_CHANNEL_TIME NL80211_SURVEY_INFO_TIME | ||
| 2926 | #define NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY NL80211_SURVEY_INFO_TIME_BUSY | ||
| 2927 | #define NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY NL80211_SURVEY_INFO_TIME_EXT_BUSY | ||
| 2928 | #define NL80211_SURVEY_INFO_CHANNEL_TIME_RX NL80211_SURVEY_INFO_TIME_RX | ||
| 2929 | #define NL80211_SURVEY_INFO_CHANNEL_TIME_TX NL80211_SURVEY_INFO_TIME_TX | ||
| 2930 | |||
| 2805 | /** | 2931 | /** |
| 2806 | * enum nl80211_mntr_flags - monitor configuration flags | 2932 | * enum nl80211_mntr_flags - monitor configuration flags |
| 2807 | * | 2933 | * |
| @@ -3238,6 +3364,9 @@ enum nl80211_bss { | |||
| 3238 | /** | 3364 | /** |
| 3239 | * enum nl80211_bss_status - BSS "status" | 3365 | * enum nl80211_bss_status - BSS "status" |
| 3240 | * @NL80211_BSS_STATUS_AUTHENTICATED: Authenticated with this BSS. | 3366 | * @NL80211_BSS_STATUS_AUTHENTICATED: Authenticated with this BSS. |
| 3367 | * Note that this is no longer used since cfg80211 no longer | ||
| 3368 | * keeps track of whether or not authentication was done with | ||
| 3369 | * a given BSS. | ||
| 3241 | * @NL80211_BSS_STATUS_ASSOCIATED: Associated with this BSS. | 3370 | * @NL80211_BSS_STATUS_ASSOCIATED: Associated with this BSS. |
| 3242 | * @NL80211_BSS_STATUS_IBSS_JOINED: Joined to this IBSS. | 3371 | * @NL80211_BSS_STATUS_IBSS_JOINED: Joined to this IBSS. |
| 3243 | * | 3372 | * |
| @@ -3621,9 +3750,12 @@ struct nl80211_pattern_support { | |||
| 3621 | * @NL80211_WOWLAN_TRIG_NET_DETECT: wake up when a configured network | 3750 | * @NL80211_WOWLAN_TRIG_NET_DETECT: wake up when a configured network |
| 3622 | * is detected. This is a nested attribute that contains the | 3751 | * is detected. This is a nested attribute that contains the |
| 3623 | * same attributes used with @NL80211_CMD_START_SCHED_SCAN. It | 3752 | * same attributes used with @NL80211_CMD_START_SCHED_SCAN. It |
| 3624 | * specifies how the scan is performed (e.g. the interval and the | 3753 | * specifies how the scan is performed (e.g. the interval, the |
| 3625 | * channels to scan) as well as the scan results that will | 3754 | * channels to scan and the initial delay) as well as the scan |
| 3626 | * trigger a wake (i.e. the matchsets). | 3755 | * results that will trigger a wake (i.e. the matchsets). This |
| 3756 | * attribute is also sent in a response to | ||
| 3757 | * @NL80211_CMD_GET_WIPHY, indicating the number of match sets | ||
| 3758 | * supported by the driver (u32). | ||
| 3627 | * @NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS: nested attribute | 3759 | * @NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS: nested attribute |
| 3628 | * containing an array with information about what triggered the | 3760 | * containing an array with information about what triggered the |
| 3629 | * wake up. If no elements are present in the array, it means | 3761 | * wake up. If no elements are present in the array, it means |
| @@ -4194,6 +4326,19 @@ enum nl80211_feature_flags { | |||
| 4194 | }; | 4326 | }; |
| 4195 | 4327 | ||
| 4196 | /** | 4328 | /** |
| 4329 | * enum nl80211_ext_feature_index - bit index of extended features. | ||
| 4330 | * | ||
| 4331 | * @NUM_NL80211_EXT_FEATURES: number of extended features. | ||
| 4332 | * @MAX_NL80211_EXT_FEATURES: highest extended feature index. | ||
| 4333 | */ | ||
| 4334 | enum nl80211_ext_feature_index { | ||
| 4335 | |||
| 4336 | /* add new features before the definition below */ | ||
| 4337 | NUM_NL80211_EXT_FEATURES, | ||
| 4338 | MAX_NL80211_EXT_FEATURES = NUM_NL80211_EXT_FEATURES - 1 | ||
| 4339 | }; | ||
| 4340 | |||
| 4341 | /** | ||
| 4197 | * enum nl80211_probe_resp_offload_support_attr - optional supported | 4342 | * enum nl80211_probe_resp_offload_support_attr - optional supported |
| 4198 | * protocols for probe-response offloading by the driver/FW. | 4343 | * protocols for probe-response offloading by the driver/FW. |
| 4199 | * To be used with the %NL80211_ATTR_PROBE_RESP_OFFLOAD attribute. | 4344 | * To be used with the %NL80211_ATTR_PROBE_RESP_OFFLOAD attribute. |
diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h index f714e8633352..bbd49a0c46c7 100644 --- a/include/uapi/linux/openvswitch.h +++ b/include/uapi/linux/openvswitch.h | |||
| @@ -252,11 +252,21 @@ enum ovs_vport_attr { | |||
| 252 | 252 | ||
| 253 | #define OVS_VPORT_ATTR_MAX (__OVS_VPORT_ATTR_MAX - 1) | 253 | #define OVS_VPORT_ATTR_MAX (__OVS_VPORT_ATTR_MAX - 1) |
| 254 | 254 | ||
| 255 | enum { | ||
| 256 | OVS_VXLAN_EXT_UNSPEC, | ||
| 257 | OVS_VXLAN_EXT_GBP, /* Flag or __u32 */ | ||
| 258 | __OVS_VXLAN_EXT_MAX, | ||
| 259 | }; | ||
| 260 | |||
| 261 | #define OVS_VXLAN_EXT_MAX (__OVS_VXLAN_EXT_MAX - 1) | ||
| 262 | |||
| 263 | |||
| 255 | /* OVS_VPORT_ATTR_OPTIONS attributes for tunnels. | 264 | /* OVS_VPORT_ATTR_OPTIONS attributes for tunnels. |
| 256 | */ | 265 | */ |
| 257 | enum { | 266 | enum { |
| 258 | OVS_TUNNEL_ATTR_UNSPEC, | 267 | OVS_TUNNEL_ATTR_UNSPEC, |
| 259 | OVS_TUNNEL_ATTR_DST_PORT, /* 16-bit UDP port, used by L4 tunnels. */ | 268 | OVS_TUNNEL_ATTR_DST_PORT, /* 16-bit UDP port, used by L4 tunnels. */ |
| 269 | OVS_TUNNEL_ATTR_EXTENSION, | ||
| 260 | __OVS_TUNNEL_ATTR_MAX | 270 | __OVS_TUNNEL_ATTR_MAX |
| 261 | }; | 271 | }; |
| 262 | 272 | ||
| @@ -328,6 +338,7 @@ enum ovs_tunnel_key_attr { | |||
| 328 | OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS, /* Array of Geneve options. */ | 338 | OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS, /* Array of Geneve options. */ |
| 329 | OVS_TUNNEL_KEY_ATTR_TP_SRC, /* be16 src Transport Port. */ | 339 | OVS_TUNNEL_KEY_ATTR_TP_SRC, /* be16 src Transport Port. */ |
| 330 | OVS_TUNNEL_KEY_ATTR_TP_DST, /* be16 dst Transport Port. */ | 340 | OVS_TUNNEL_KEY_ATTR_TP_DST, /* be16 dst Transport Port. */ |
| 341 | OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS, /* Nested OVS_VXLAN_EXT_* */ | ||
| 331 | __OVS_TUNNEL_KEY_ATTR_MAX | 342 | __OVS_TUNNEL_KEY_ATTR_MAX |
| 332 | }; | 343 | }; |
| 333 | 344 | ||
| @@ -448,6 +459,14 @@ struct ovs_key_nd { | |||
| 448 | * a wildcarded match. Omitting attribute is treated as wildcarding all | 459 | * a wildcarded match. Omitting attribute is treated as wildcarding all |
| 449 | * corresponding fields. Optional for all requests. If not present, | 460 | * corresponding fields. Optional for all requests. If not present, |
| 450 | * all flow key bits are exact match bits. | 461 | * all flow key bits are exact match bits. |
| 462 | * @OVS_FLOW_ATTR_UFID: A value between 1-16 octets specifying a unique | ||
| 463 | * identifier for the flow. Causes the flow to be indexed by this value rather | ||
| 464 | * than the value of the %OVS_FLOW_ATTR_KEY attribute. Optional for all | ||
| 465 | * requests. Present in notifications if the flow was created with this | ||
| 466 | * attribute. | ||
| 467 | * @OVS_FLOW_ATTR_UFID_FLAGS: A 32-bit value of OR'd %OVS_UFID_F_* | ||
| 468 | * flags that provide alternative semantics for flow installation and | ||
| 469 | * retrieval. Optional for all requests. | ||
| 451 | * | 470 | * |
| 452 | * These attributes follow the &struct ovs_header within the Generic Netlink | 471 | * These attributes follow the &struct ovs_header within the Generic Netlink |
| 453 | * payload for %OVS_FLOW_* commands. | 472 | * payload for %OVS_FLOW_* commands. |
| @@ -463,12 +482,24 @@ enum ovs_flow_attr { | |||
| 463 | OVS_FLOW_ATTR_MASK, /* Sequence of OVS_KEY_ATTR_* attributes. */ | 482 | OVS_FLOW_ATTR_MASK, /* Sequence of OVS_KEY_ATTR_* attributes. */ |
| 464 | OVS_FLOW_ATTR_PROBE, /* Flow operation is a feature probe, error | 483 | OVS_FLOW_ATTR_PROBE, /* Flow operation is a feature probe, error |
| 465 | * logging should be suppressed. */ | 484 | * logging should be suppressed. */ |
| 485 | OVS_FLOW_ATTR_UFID, /* Variable length unique flow identifier. */ | ||
| 486 | OVS_FLOW_ATTR_UFID_FLAGS,/* u32 of OVS_UFID_F_*. */ | ||
| 466 | __OVS_FLOW_ATTR_MAX | 487 | __OVS_FLOW_ATTR_MAX |
| 467 | }; | 488 | }; |
| 468 | 489 | ||
| 469 | #define OVS_FLOW_ATTR_MAX (__OVS_FLOW_ATTR_MAX - 1) | 490 | #define OVS_FLOW_ATTR_MAX (__OVS_FLOW_ATTR_MAX - 1) |
| 470 | 491 | ||
| 471 | /** | 492 | /** |
| 493 | * Omit attributes for notifications. | ||
| 494 | * | ||
| 495 | * If a datapath request contains an %OVS_UFID_F_OMIT_* flag, then the datapath | ||
| 496 | * may omit the corresponding %OVS_FLOW_ATTR_* from the response. | ||
| 497 | */ | ||
| 498 | #define OVS_UFID_F_OMIT_KEY (1 << 0) | ||
| 499 | #define OVS_UFID_F_OMIT_MASK (1 << 1) | ||
| 500 | #define OVS_UFID_F_OMIT_ACTIONS (1 << 2) | ||
| 501 | |||
| 502 | /** | ||
| 472 | * enum ovs_sample_attr - Attributes for %OVS_ACTION_ATTR_SAMPLE action. | 503 | * enum ovs_sample_attr - Attributes for %OVS_ACTION_ATTR_SAMPLE action. |
| 473 | * @OVS_SAMPLE_ATTR_PROBABILITY: 32-bit fraction of packets to sample with | 504 | * @OVS_SAMPLE_ATTR_PROBABILITY: 32-bit fraction of packets to sample with |
| 474 | * @OVS_ACTION_ATTR_SAMPLE. A value of 0 samples no packets, a value of | 505 | * @OVS_ACTION_ATTR_SAMPLE. A value of 0 samples no packets, a value of |
| @@ -568,6 +599,12 @@ struct ovs_action_hash { | |||
| 568 | * @OVS_ACTION_ATTR_SET: Replaces the contents of an existing header. The | 599 | * @OVS_ACTION_ATTR_SET: Replaces the contents of an existing header. The |
| 569 | * single nested %OVS_KEY_ATTR_* attribute specifies a header to modify and its | 600 | * single nested %OVS_KEY_ATTR_* attribute specifies a header to modify and its |
| 570 | * value. | 601 | * value. |
| 602 | * @OVS_ACTION_ATTR_SET_MASKED: Replaces the contents of an existing header. A | ||
| 603 | * nested %OVS_KEY_ATTR_* attribute specifies a header to modify, its value, | ||
| 604 | * and a mask. For every bit set in the mask, the corresponding bit value | ||
| 605 | * is copied from the value to the packet header field, rest of the bits are | ||
| 606 | * left unchanged. The non-masked value bits must be passed in as zeroes. | ||
| 607 | * Masking is not supported for the %OVS_KEY_ATTR_TUNNEL attribute. | ||
| 571 | * @OVS_ACTION_ATTR_PUSH_VLAN: Push a new outermost 802.1Q header onto the | 608 | * @OVS_ACTION_ATTR_PUSH_VLAN: Push a new outermost 802.1Q header onto the |
| 572 | * packet. | 609 | * packet. |
| 573 | * @OVS_ACTION_ATTR_POP_VLAN: Pop the outermost 802.1Q header off the packet. | 610 | * @OVS_ACTION_ATTR_POP_VLAN: Pop the outermost 802.1Q header off the packet. |
| @@ -586,6 +623,9 @@ struct ovs_action_hash { | |||
| 586 | * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all | 623 | * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all |
| 587 | * fields within a header are modifiable, e.g. the IPv4 protocol and fragment | 624 | * fields within a header are modifiable, e.g. the IPv4 protocol and fragment |
| 588 | * type may not be changed. | 625 | * type may not be changed. |
| 626 | * | ||
| 627 | * @OVS_ACTION_ATTR_SET_TO_MASKED: Kernel internal masked set action translated | ||
| 628 | * from the @OVS_ACTION_ATTR_SET. | ||
| 589 | */ | 629 | */ |
| 590 | 630 | ||
| 591 | enum ovs_action_attr { | 631 | enum ovs_action_attr { |
| @@ -600,8 +640,19 @@ enum ovs_action_attr { | |||
| 600 | OVS_ACTION_ATTR_HASH, /* struct ovs_action_hash. */ | 640 | OVS_ACTION_ATTR_HASH, /* struct ovs_action_hash. */ |
| 601 | OVS_ACTION_ATTR_PUSH_MPLS, /* struct ovs_action_push_mpls. */ | 641 | OVS_ACTION_ATTR_PUSH_MPLS, /* struct ovs_action_push_mpls. */ |
| 602 | OVS_ACTION_ATTR_POP_MPLS, /* __be16 ethertype. */ | 642 | OVS_ACTION_ATTR_POP_MPLS, /* __be16 ethertype. */ |
| 643 | OVS_ACTION_ATTR_SET_MASKED, /* One nested OVS_KEY_ATTR_* including | ||
| 644 | * data immediately followed by a mask. | ||
| 645 | * The data must be zero for the unmasked | ||
| 646 | * bits. */ | ||
| 603 | 647 | ||
| 604 | __OVS_ACTION_ATTR_MAX | 648 | __OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted |
| 649 | * from userspace. */ | ||
| 650 | |||
| 651 | #ifdef __KERNEL__ | ||
| 652 | OVS_ACTION_ATTR_SET_TO_MASKED, /* Kernel module internal masked | ||
| 653 | * set action converted from | ||
| 654 | * OVS_ACTION_ATTR_SET. */ | ||
| 655 | #endif | ||
| 605 | }; | 656 | }; |
| 606 | 657 | ||
| 607 | #define OVS_ACTION_ATTR_MAX (__OVS_ACTION_ATTR_MAX - 1) | 658 | #define OVS_ACTION_ATTR_MAX (__OVS_ACTION_ATTR_MAX - 1) |
diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h index d62316baae94..534b84710745 100644 --- a/include/uapi/linux/pkt_sched.h +++ b/include/uapi/linux/pkt_sched.h | |||
| @@ -774,6 +774,8 @@ enum { | |||
| 774 | 774 | ||
| 775 | TCA_FQ_FLOW_REFILL_DELAY, /* flow credit refill delay in usec */ | 775 | TCA_FQ_FLOW_REFILL_DELAY, /* flow credit refill delay in usec */ |
| 776 | 776 | ||
| 777 | TCA_FQ_ORPHAN_MASK, /* mask applied to orphaned skb hashes */ | ||
| 778 | |||
| 777 | __TCA_FQ_MAX | 779 | __TCA_FQ_MAX |
| 778 | }; | 780 | }; |
| 779 | 781 | ||
diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h index 9c9b8b4480cd..5cc5d66bf519 100644 --- a/include/uapi/linux/rtnetlink.h +++ b/include/uapi/linux/rtnetlink.h | |||
| @@ -132,6 +132,11 @@ enum { | |||
| 132 | RTM_GETMDB = 86, | 132 | RTM_GETMDB = 86, |
| 133 | #define RTM_GETMDB RTM_GETMDB | 133 | #define RTM_GETMDB RTM_GETMDB |
| 134 | 134 | ||
| 135 | RTM_NEWNSID = 88, | ||
| 136 | #define RTM_NEWNSID RTM_NEWNSID | ||
| 137 | RTM_GETNSID = 90, | ||
| 138 | #define RTM_GETNSID RTM_GETNSID | ||
| 139 | |||
| 135 | __RTM_MAX, | 140 | __RTM_MAX, |
| 136 | #define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1) | 141 | #define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1) |
| 137 | }; | 142 | }; |
| @@ -389,6 +394,8 @@ enum { | |||
| 389 | #define RTAX_INITRWND RTAX_INITRWND | 394 | #define RTAX_INITRWND RTAX_INITRWND |
| 390 | RTAX_QUICKACK, | 395 | RTAX_QUICKACK, |
| 391 | #define RTAX_QUICKACK RTAX_QUICKACK | 396 | #define RTAX_QUICKACK RTAX_QUICKACK |
| 397 | RTAX_CC_ALGO, | ||
| 398 | #define RTAX_CC_ALGO RTAX_CC_ALGO | ||
| 392 | __RTAX_MAX | 399 | __RTAX_MAX |
| 393 | }; | 400 | }; |
| 394 | 401 | ||
| @@ -634,6 +641,7 @@ struct tcamsg { | |||
| 634 | /* New extended info filters for IFLA_EXT_MASK */ | 641 | /* New extended info filters for IFLA_EXT_MASK */ |
| 635 | #define RTEXT_FILTER_VF (1 << 0) | 642 | #define RTEXT_FILTER_VF (1 << 0) |
| 636 | #define RTEXT_FILTER_BRVLAN (1 << 1) | 643 | #define RTEXT_FILTER_BRVLAN (1 << 1) |
| 644 | #define RTEXT_FILTER_BRVLAN_COMPRESSED (1 << 2) | ||
| 637 | 645 | ||
| 638 | /* End of information exported to user level */ | 646 | /* End of information exported to user level */ |
| 639 | 647 | ||
diff --git a/include/uapi/linux/snmp.h b/include/uapi/linux/snmp.h index b22224100011..6a6fb747c78d 100644 --- a/include/uapi/linux/snmp.h +++ b/include/uapi/linux/snmp.h | |||
| @@ -270,6 +270,12 @@ enum | |||
| 270 | LINUX_MIB_TCPHYSTARTTRAINCWND, /* TCPHystartTrainCwnd */ | 270 | LINUX_MIB_TCPHYSTARTTRAINCWND, /* TCPHystartTrainCwnd */ |
| 271 | LINUX_MIB_TCPHYSTARTDELAYDETECT, /* TCPHystartDelayDetect */ | 271 | LINUX_MIB_TCPHYSTARTDELAYDETECT, /* TCPHystartDelayDetect */ |
| 272 | LINUX_MIB_TCPHYSTARTDELAYCWND, /* TCPHystartDelayCwnd */ | 272 | LINUX_MIB_TCPHYSTARTDELAYCWND, /* TCPHystartDelayCwnd */ |
| 273 | LINUX_MIB_TCPACKSKIPPEDSYNRECV, /* TCPACKSkippedSynRecv */ | ||
| 274 | LINUX_MIB_TCPACKSKIPPEDPAWS, /* TCPACKSkippedPAWS */ | ||
| 275 | LINUX_MIB_TCPACKSKIPPEDSEQ, /* TCPACKSkippedSeq */ | ||
| 276 | LINUX_MIB_TCPACKSKIPPEDFINWAIT2, /* TCPACKSkippedFinWait2 */ | ||
| 277 | LINUX_MIB_TCPACKSKIPPEDTIMEWAIT, /* TCPACKSkippedTimeWait */ | ||
| 278 | LINUX_MIB_TCPACKSKIPPEDCHALLENGE, /* TCPACKSkippedChallenge */ | ||
| 273 | __LINUX_MIB_MAX | 279 | __LINUX_MIB_MAX |
| 274 | }; | 280 | }; |
| 275 | 281 | ||
diff --git a/include/uapi/linux/tc_act/Kbuild b/include/uapi/linux/tc_act/Kbuild index b057da2b87a4..19d5219b0b99 100644 --- a/include/uapi/linux/tc_act/Kbuild +++ b/include/uapi/linux/tc_act/Kbuild | |||
| @@ -8,3 +8,4 @@ header-y += tc_nat.h | |||
| 8 | header-y += tc_pedit.h | 8 | header-y += tc_pedit.h |
| 9 | header-y += tc_skbedit.h | 9 | header-y += tc_skbedit.h |
| 10 | header-y += tc_vlan.h | 10 | header-y += tc_vlan.h |
| 11 | header-y += tc_bpf.h | ||
diff --git a/include/uapi/linux/tc_act/tc_bpf.h b/include/uapi/linux/tc_act/tc_bpf.h new file mode 100644 index 000000000000..5288bd77e63b --- /dev/null +++ b/include/uapi/linux/tc_act/tc_bpf.h | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2015 Jiri Pirko <jiri@resnulli.us> | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef __LINUX_TC_BPF_H | ||
| 11 | #define __LINUX_TC_BPF_H | ||
| 12 | |||
| 13 | #include <linux/pkt_cls.h> | ||
| 14 | |||
| 15 | #define TCA_ACT_BPF 13 | ||
| 16 | |||
| 17 | struct tc_act_bpf { | ||
| 18 | tc_gen; | ||
| 19 | }; | ||
| 20 | |||
| 21 | enum { | ||
| 22 | TCA_ACT_BPF_UNSPEC, | ||
| 23 | TCA_ACT_BPF_TM, | ||
| 24 | TCA_ACT_BPF_PARMS, | ||
| 25 | TCA_ACT_BPF_OPS_LEN, | ||
| 26 | TCA_ACT_BPF_OPS, | ||
| 27 | __TCA_ACT_BPF_MAX, | ||
| 28 | }; | ||
| 29 | #define TCA_ACT_BPF_MAX (__TCA_ACT_BPF_MAX - 1) | ||
| 30 | |||
| 31 | #endif | ||
diff --git a/include/uapi/linux/tc_act/tc_connmark.h b/include/uapi/linux/tc_act/tc_connmark.h new file mode 100644 index 000000000000..994b0971bce2 --- /dev/null +++ b/include/uapi/linux/tc_act/tc_connmark.h | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | #ifndef __UAPI_TC_CONNMARK_H | ||
| 2 | #define __UAPI_TC_CONNMARK_H | ||
| 3 | |||
| 4 | #include <linux/types.h> | ||
| 5 | #include <linux/pkt_cls.h> | ||
| 6 | |||
| 7 | #define TCA_ACT_CONNMARK 14 | ||
| 8 | |||
| 9 | struct tc_connmark { | ||
| 10 | tc_gen; | ||
| 11 | __u16 zone; | ||
| 12 | }; | ||
| 13 | |||
| 14 | enum { | ||
| 15 | TCA_CONNMARK_UNSPEC, | ||
| 16 | TCA_CONNMARK_PARMS, | ||
| 17 | TCA_CONNMARK_TM, | ||
| 18 | __TCA_CONNMARK_MAX | ||
| 19 | }; | ||
| 20 | #define TCA_CONNMARK_MAX (__TCA_CONNMARK_MAX - 1) | ||
| 21 | |||
| 22 | #endif | ||
diff --git a/include/uapi/linux/tipc_config.h b/include/uapi/linux/tipc_config.h index 876d0a14863c..087b0ef82c07 100644 --- a/include/uapi/linux/tipc_config.h +++ b/include/uapi/linux/tipc_config.h | |||
| @@ -272,6 +272,26 @@ static inline int TLV_CHECK(const void *tlv, __u16 space, __u16 exp_type) | |||
| 272 | (ntohs(((struct tlv_desc *)tlv)->tlv_type) == exp_type); | 272 | (ntohs(((struct tlv_desc *)tlv)->tlv_type) == exp_type); |
| 273 | } | 273 | } |
| 274 | 274 | ||
| 275 | static inline int TLV_GET_LEN(struct tlv_desc *tlv) | ||
| 276 | { | ||
| 277 | return ntohs(tlv->tlv_len); | ||
| 278 | } | ||
| 279 | |||
| 280 | static inline void TLV_SET_LEN(struct tlv_desc *tlv, __u16 len) | ||
| 281 | { | ||
| 282 | tlv->tlv_len = htons(len); | ||
| 283 | } | ||
| 284 | |||
| 285 | static inline int TLV_CHECK_TYPE(struct tlv_desc *tlv, __u16 type) | ||
| 286 | { | ||
| 287 | return (ntohs(tlv->tlv_type) == type); | ||
| 288 | } | ||
| 289 | |||
| 290 | static inline void TLV_SET_TYPE(struct tlv_desc *tlv, __u16 type) | ||
| 291 | { | ||
| 292 | tlv->tlv_type = htons(type); | ||
| 293 | } | ||
| 294 | |||
| 275 | static inline int TLV_SET(void *tlv, __u16 type, void *data, __u16 len) | 295 | static inline int TLV_SET(void *tlv, __u16 type, void *data, __u16 len) |
| 276 | { | 296 | { |
| 277 | struct tlv_desc *tlv_ptr; | 297 | struct tlv_desc *tlv_ptr; |
diff --git a/include/xen/page.h b/include/xen/page.h index 12765b6f9517..c5ed20bb3fe9 100644 --- a/include/xen/page.h +++ b/include/xen/page.h | |||
| @@ -3,6 +3,11 @@ | |||
| 3 | 3 | ||
| 4 | #include <asm/xen/page.h> | 4 | #include <asm/xen/page.h> |
| 5 | 5 | ||
| 6 | static inline unsigned long page_to_mfn(struct page *page) | ||
| 7 | { | ||
| 8 | return pfn_to_mfn(page_to_pfn(page)); | ||
| 9 | } | ||
| 10 | |||
| 6 | struct xen_memory_region { | 11 | struct xen_memory_region { |
| 7 | phys_addr_t start; | 12 | phys_addr_t start; |
| 8 | phys_addr_t size; | 13 | phys_addr_t size; |
