Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Resolve conflict between commit264640fc2c
("ipv6: distinguish frag queues by device for multicast and link-local packets") from the net tree and commit029f7f3b87
("netfilter: ipv6: nf_defrag: avoid/free clone operations") from the nf-next tree. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Conflicts: net/ipv6/netfilter/nf_conntrack_reasm.c
This commit is contained in:
@@ -62,6 +62,7 @@ struct unix_sock {
|
||||
#define UNIX_GC_CANDIDATE 0
|
||||
#define UNIX_GC_MAYBE_CYCLE 1
|
||||
struct socket_wq peer_wq;
|
||||
wait_queue_t peer_wake;
|
||||
};
|
||||
|
||||
static inline struct unix_sock *unix_sk(const struct sock *sk)
|
||||
|
@@ -29,6 +29,8 @@
|
||||
#include <net/sock.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
#define BT_SUBSYS_VERSION "2.21"
|
||||
|
||||
#ifndef AF_BLUETOOTH
|
||||
#define AF_BLUETOOTH 31
|
||||
#define PF_BLUETOOTH AF_BLUETOOTH
|
||||
@@ -296,12 +298,17 @@ typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status, u16 opcode);
|
||||
typedef void (*hci_req_complete_skb_t)(struct hci_dev *hdev, u8 status,
|
||||
u16 opcode, struct sk_buff *skb);
|
||||
|
||||
#define HCI_REQ_START BIT(0)
|
||||
#define HCI_REQ_SKB BIT(1)
|
||||
|
||||
struct hci_ctrl {
|
||||
__u16 opcode;
|
||||
bool req_start;
|
||||
u8 req_flags;
|
||||
u8 req_event;
|
||||
hci_req_complete_t req_complete;
|
||||
hci_req_complete_skb_t req_complete_skb;
|
||||
union {
|
||||
hci_req_complete_t req_complete;
|
||||
hci_req_complete_skb_t req_complete_skb;
|
||||
};
|
||||
};
|
||||
|
||||
struct bt_skb_cb {
|
||||
@@ -316,15 +323,17 @@ struct bt_skb_cb {
|
||||
};
|
||||
#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
|
||||
|
||||
#define hci_skb_pkt_type(skb) bt_cb((skb))->pkt_type
|
||||
#define hci_skb_expect(skb) bt_cb((skb))->expect
|
||||
#define hci_skb_opcode(skb) bt_cb((skb))->hci.opcode
|
||||
|
||||
static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = alloc_skb(len + BT_SKB_RESERVE, how);
|
||||
if (skb) {
|
||||
if (skb)
|
||||
skb_reserve(skb, BT_SKB_RESERVE);
|
||||
bt_cb(skb)->incoming = 0;
|
||||
}
|
||||
return skb;
|
||||
}
|
||||
|
||||
@@ -334,10 +343,8 @@ static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk,
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err);
|
||||
if (skb) {
|
||||
if (skb)
|
||||
skb_reserve(skb, BT_SKB_RESERVE);
|
||||
bt_cb(skb)->incoming = 0;
|
||||
}
|
||||
|
||||
if (!skb && *err)
|
||||
return NULL;
|
||||
|
@@ -452,7 +452,8 @@ enum {
|
||||
#define HCI_ERROR_REMOTE_POWER_OFF 0x15
|
||||
#define HCI_ERROR_LOCAL_HOST_TERM 0x16
|
||||
#define HCI_ERROR_PAIRING_NOT_ALLOWED 0x18
|
||||
#define HCI_ERROR_INVALID_LL_PARAMS 0x1E
|
||||
#define HCI_ERROR_INVALID_LL_PARAMS 0x1e
|
||||
#define HCI_ERROR_UNSPECIFIED 0x1f
|
||||
#define HCI_ERROR_ADVERTISING_TIMEOUT 0x3c
|
||||
|
||||
/* Flow control modes */
|
||||
|
@@ -327,6 +327,11 @@ struct hci_dev {
|
||||
struct work_struct cmd_work;
|
||||
struct work_struct tx_work;
|
||||
|
||||
struct work_struct discov_update;
|
||||
struct work_struct bg_scan_update;
|
||||
struct delayed_work le_scan_disable;
|
||||
struct delayed_work le_scan_restart;
|
||||
|
||||
struct sk_buff_head rx_q;
|
||||
struct sk_buff_head raw_q;
|
||||
struct sk_buff_head cmd_q;
|
||||
@@ -370,9 +375,6 @@ struct hci_dev {
|
||||
|
||||
DECLARE_BITMAP(dev_flags, __HCI_NUM_FLAGS);
|
||||
|
||||
struct delayed_work le_scan_disable;
|
||||
struct delayed_work le_scan_restart;
|
||||
|
||||
__s8 adv_tx_power;
|
||||
__u8 adv_data[HCI_MAX_AD_LENGTH];
|
||||
__u8 adv_data_len;
|
||||
@@ -875,7 +877,7 @@ struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle);
|
||||
|
||||
struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst,
|
||||
u8 dst_type, u8 sec_level,
|
||||
u16 conn_timeout, u8 role);
|
||||
u16 conn_timeout);
|
||||
struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
|
||||
u8 dst_type, u8 sec_level, u16 conn_timeout,
|
||||
u8 role);
|
||||
@@ -1036,7 +1038,6 @@ struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev,
|
||||
struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev,
|
||||
bdaddr_t *addr, u8 addr_type);
|
||||
void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type);
|
||||
void hci_conn_params_clear_all(struct hci_dev *hdev);
|
||||
void hci_conn_params_clear_disabled(struct hci_dev *hdev);
|
||||
|
||||
struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list,
|
||||
@@ -1473,6 +1474,8 @@ void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
|
||||
void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
|
||||
u8 status);
|
||||
void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status);
|
||||
void mgmt_start_discovery_complete(struct hci_dev *hdev, u8 status);
|
||||
void mgmt_stop_discovery_complete(struct hci_dev *hdev, u8 status);
|
||||
void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
|
||||
u8 addr_type, u8 *dev_class, s8 rssi, u32 flags,
|
||||
u8 *eir, u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len);
|
||||
|
@@ -43,6 +43,8 @@ struct hci_mon_hdr {
|
||||
#define HCI_MON_CLOSE_INDEX 9
|
||||
#define HCI_MON_INDEX_INFO 10
|
||||
#define HCI_MON_VENDOR_DIAG 11
|
||||
#define HCI_MON_SYSTEM_NOTE 12
|
||||
#define HCI_MON_USER_LOGGING 13
|
||||
|
||||
struct hci_mon_new_index {
|
||||
__u8 type;
|
||||
|
@@ -45,6 +45,7 @@ struct sockaddr_hci {
|
||||
#define HCI_CHANNEL_USER 1
|
||||
#define HCI_CHANNEL_MONITOR 2
|
||||
#define HCI_CHANNEL_CONTROL 3
|
||||
#define HCI_CHANNEL_LOGGING 4
|
||||
|
||||
struct hci_filter {
|
||||
unsigned long type_mask;
|
||||
|
@@ -571,6 +571,19 @@ struct mgmt_rp_remove_advertising {
|
||||
__u8 instance;
|
||||
} __packed;
|
||||
|
||||
#define MGMT_OP_GET_ADV_SIZE_INFO 0x0040
|
||||
struct mgmt_cp_get_adv_size_info {
|
||||
__u8 instance;
|
||||
__le32 flags;
|
||||
} __packed;
|
||||
#define MGMT_GET_ADV_SIZE_INFO_SIZE 5
|
||||
struct mgmt_rp_get_adv_size_info {
|
||||
__u8 instance;
|
||||
__le32 flags;
|
||||
__u8 max_adv_data_len;
|
||||
__u8 max_scan_rsp_len;
|
||||
} __packed;
|
||||
|
||||
#define MGMT_EV_CMD_COMPLETE 0x0001
|
||||
struct mgmt_ev_cmd_complete {
|
||||
__le16 opcode;
|
||||
|
@@ -165,7 +165,8 @@ struct slave {
|
||||
u8 backup:1, /* indicates backup slave. Value corresponds with
|
||||
BOND_STATE_ACTIVE and BOND_STATE_BACKUP */
|
||||
inactive:1, /* indicates inactive slave */
|
||||
should_notify:1; /* indicateds whether the state changed */
|
||||
should_notify:1, /* indicates whether the state changed */
|
||||
should_notify_link:1; /* indicates whether the link changed */
|
||||
u8 duplex;
|
||||
u32 original_mtu;
|
||||
u32 link_failure_count;
|
||||
@@ -246,6 +247,7 @@ struct bonding {
|
||||
((struct slave *) rtnl_dereference(dev->rx_handler_data))
|
||||
|
||||
void bond_queue_slave_event(struct slave *slave);
|
||||
void bond_lower_state_changed(struct slave *slave);
|
||||
|
||||
struct bond_vlan_tag {
|
||||
__be16 vlan_proto;
|
||||
@@ -327,6 +329,7 @@ static inline void bond_set_active_slave(struct slave *slave)
|
||||
if (slave->backup) {
|
||||
slave->backup = 0;
|
||||
bond_queue_slave_event(slave);
|
||||
bond_lower_state_changed(slave);
|
||||
rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC);
|
||||
}
|
||||
}
|
||||
@@ -336,6 +339,7 @@ static inline void bond_set_backup_slave(struct slave *slave)
|
||||
if (!slave->backup) {
|
||||
slave->backup = 1;
|
||||
bond_queue_slave_event(slave);
|
||||
bond_lower_state_changed(slave);
|
||||
rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC);
|
||||
}
|
||||
}
|
||||
@@ -348,6 +352,7 @@ static inline void bond_set_slave_state(struct slave *slave,
|
||||
|
||||
slave->backup = slave_state;
|
||||
if (notify) {
|
||||
bond_lower_state_changed(slave);
|
||||
rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC);
|
||||
bond_queue_slave_event(slave);
|
||||
slave->should_notify = 0;
|
||||
@@ -379,6 +384,7 @@ static inline void bond_slave_state_notify(struct bonding *bond)
|
||||
|
||||
bond_for_each_slave(bond, tmp, iter) {
|
||||
if (tmp->should_notify) {
|
||||
bond_lower_state_changed(tmp);
|
||||
rtmsg_ifinfo(RTM_NEWLINK, tmp->dev, 0, GFP_ATOMIC);
|
||||
tmp->should_notify = 0;
|
||||
}
|
||||
@@ -504,10 +510,37 @@ static inline bool bond_is_slave_inactive(struct slave *slave)
|
||||
return slave->inactive;
|
||||
}
|
||||
|
||||
static inline void bond_set_slave_link_state(struct slave *slave, int state)
|
||||
static inline void bond_set_slave_link_state(struct slave *slave, int state,
|
||||
bool notify)
|
||||
{
|
||||
if (slave->link == state)
|
||||
return;
|
||||
|
||||
slave->link = state;
|
||||
bond_queue_slave_event(slave);
|
||||
if (notify) {
|
||||
bond_queue_slave_event(slave);
|
||||
bond_lower_state_changed(slave);
|
||||
slave->should_notify_link = 0;
|
||||
} else {
|
||||
if (slave->should_notify_link)
|
||||
slave->should_notify_link = 0;
|
||||
else
|
||||
slave->should_notify_link = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void bond_slave_link_notify(struct bonding *bond)
|
||||
{
|
||||
struct list_head *iter;
|
||||
struct slave *tmp;
|
||||
|
||||
bond_for_each_slave(bond, tmp, iter) {
|
||||
if (tmp->should_notify_link) {
|
||||
bond_queue_slave_event(tmp);
|
||||
bond_lower_state_changed(tmp);
|
||||
tmp->should_notify_link = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline __be32 bond_confirm_addr(struct net_device *dev, __be32 dst, __be32 local)
|
||||
|
@@ -2321,6 +2321,8 @@ struct cfg80211_qos_map {
|
||||
* the driver, and will be valid until passed to cfg80211_scan_done().
|
||||
* For scan results, call cfg80211_inform_bss(); you can call this outside
|
||||
* the scan/scan_done bracket too.
|
||||
* @abort_scan: Tell the driver to abort an ongoing scan. The driver shall
|
||||
* indicate the status of the scan through cfg80211_scan_done().
|
||||
*
|
||||
* @auth: Request to authenticate with the specified peer
|
||||
* (invoked with the wireless_dev mutex held)
|
||||
@@ -2593,6 +2595,7 @@ struct cfg80211_ops {
|
||||
|
||||
int (*scan)(struct wiphy *wiphy,
|
||||
struct cfg80211_scan_request *request);
|
||||
void (*abort_scan)(struct wiphy *wiphy, struct wireless_dev *wdev);
|
||||
|
||||
int (*auth)(struct wiphy *wiphy, struct net_device *dev,
|
||||
struct cfg80211_auth_request *req);
|
||||
@@ -5173,8 +5176,11 @@ size_t ieee80211_ie_split_ric(const u8 *ies, size_t ielen,
|
||||
* buffer starts, which may be @ielen if the entire (remainder)
|
||||
* of the buffer should be used.
|
||||
*/
|
||||
size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
|
||||
const u8 *ids, int n_ids, size_t offset);
|
||||
static inline size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
|
||||
const u8 *ids, int n_ids, size_t offset)
|
||||
{
|
||||
return ieee80211_ie_split_ric(ies, ielen, ids, n_ids, NULL, 0, offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* cfg80211_report_wowlan_wakeup - report wakeup from WoWLAN
|
||||
|
@@ -165,7 +165,8 @@ static inline __wsum remcsum_adjust(void *ptr, __wsum csum,
|
||||
csum = csum_sub(csum, csum_partial(ptr, start, 0));
|
||||
|
||||
/* Set derived checksum in packet */
|
||||
delta = csum_sub(csum_fold(csum), *psum);
|
||||
delta = csum_sub((__force __wsum)csum_fold(csum),
|
||||
(__force __wsum)*psum);
|
||||
*psum = csum_fold(csum);
|
||||
|
||||
return delta;
|
||||
|
@@ -41,13 +41,12 @@ static inline u32 task_cls_classid(struct task_struct *p)
|
||||
return classid;
|
||||
}
|
||||
|
||||
static inline void sock_update_classid(struct sock *sk)
|
||||
static inline void sock_update_classid(struct sock_cgroup_data *skcd)
|
||||
{
|
||||
u32 classid;
|
||||
|
||||
classid = task_cls_classid(current);
|
||||
if (classid != sk->sk_classid)
|
||||
sk->sk_classid = classid;
|
||||
sock_cgroup_set_classid(skcd, classid);
|
||||
}
|
||||
|
||||
static inline u32 task_get_classid(const struct sk_buff *skb)
|
||||
@@ -64,17 +63,17 @@ static inline u32 task_get_classid(const struct sk_buff *skb)
|
||||
* softirqs always disables bh.
|
||||
*/
|
||||
if (in_serving_softirq()) {
|
||||
/* If there is an sk_classid we'll use that. */
|
||||
/* If there is an sock_cgroup_classid we'll use that. */
|
||||
if (!skb->sk)
|
||||
return 0;
|
||||
|
||||
classid = skb->sk->sk_classid;
|
||||
classid = sock_cgroup_classid(&skb->sk->sk_cgrp_data);
|
||||
}
|
||||
|
||||
return classid;
|
||||
}
|
||||
#else /* !CONFIG_CGROUP_NET_CLASSID */
|
||||
static inline void sock_update_classid(struct sock *sk)
|
||||
static inline void sock_update_classid(struct sock_cgroup_data *skcd)
|
||||
{
|
||||
}
|
||||
|
||||
|
@@ -16,6 +16,7 @@
|
||||
#include <linux/timer.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/phy_fixed.h>
|
||||
#include <linux/ethtool.h>
|
||||
@@ -64,6 +65,13 @@ struct dsa_chip_data {
|
||||
* NULL if there is only one switch chip.
|
||||
*/
|
||||
s8 *rtable;
|
||||
|
||||
/*
|
||||
* A switch may have a GPIO line tied to its reset pin. Parse
|
||||
* this from the device tree, and use it before performing
|
||||
* switch soft reset.
|
||||
*/
|
||||
struct gpio_desc *reset;
|
||||
};
|
||||
|
||||
struct dsa_platform_data {
|
||||
@@ -108,13 +116,6 @@ struct dsa_switch_tree {
|
||||
s8 cpu_switch;
|
||||
s8 cpu_port;
|
||||
|
||||
/*
|
||||
* Link state polling.
|
||||
*/
|
||||
int link_poll_needed;
|
||||
struct work_struct link_poll_work;
|
||||
struct timer_list link_poll_timer;
|
||||
|
||||
/*
|
||||
* Data for the individual switch chips.
|
||||
*/
|
||||
@@ -223,11 +224,6 @@ struct dsa_switch_driver {
|
||||
int (*phy_write)(struct dsa_switch *ds, int port,
|
||||
int regnum, u16 val);
|
||||
|
||||
/*
|
||||
* Link state polling and IRQ handling.
|
||||
*/
|
||||
void (*poll_link)(struct dsa_switch *ds);
|
||||
|
||||
/*
|
||||
* Link state adjustment (called from libphy)
|
||||
*/
|
||||
|
@@ -133,27 +133,18 @@ void rt6_clean_tohost(struct net *net, struct in6_addr *gateway);
|
||||
/*
|
||||
* Store a destination cache entry in a socket
|
||||
*/
|
||||
static inline void __ip6_dst_store(struct sock *sk, struct dst_entry *dst,
|
||||
const struct in6_addr *daddr,
|
||||
const struct in6_addr *saddr)
|
||||
static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst,
|
||||
const struct in6_addr *daddr,
|
||||
const struct in6_addr *saddr)
|
||||
{
|
||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
struct rt6_info *rt = (struct rt6_info *) dst;
|
||||
|
||||
np->dst_cookie = rt6_get_cookie((struct rt6_info *)dst);
|
||||
sk_setup_caps(sk, dst);
|
||||
np->daddr_cache = daddr;
|
||||
#ifdef CONFIG_IPV6_SUBTREES
|
||||
np->saddr_cache = saddr;
|
||||
#endif
|
||||
np->dst_cookie = rt6_get_cookie(rt);
|
||||
}
|
||||
|
||||
static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst,
|
||||
struct in6_addr *daddr, struct in6_addr *saddr)
|
||||
{
|
||||
spin_lock(&sk->sk_dst_lock);
|
||||
__ip6_dst_store(sk, dst, daddr, saddr);
|
||||
spin_unlock(&sk->sk_dst_lock);
|
||||
}
|
||||
|
||||
static inline bool ipv6_unicast_destination(const struct sk_buff *skb)
|
||||
|
@@ -205,6 +205,7 @@ extern rwlock_t ip6_ra_lock;
|
||||
*/
|
||||
|
||||
struct ipv6_txoptions {
|
||||
atomic_t refcnt;
|
||||
/* Length of this structure */
|
||||
int tot_len;
|
||||
|
||||
@@ -217,7 +218,7 @@ struct ipv6_txoptions {
|
||||
struct ipv6_opt_hdr *dst0opt;
|
||||
struct ipv6_rt_hdr *srcrt; /* Routing Header */
|
||||
struct ipv6_opt_hdr *dst1opt;
|
||||
|
||||
struct rcu_head rcu;
|
||||
/* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */
|
||||
};
|
||||
|
||||
@@ -252,6 +253,24 @@ struct ipv6_fl_socklist {
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np)
|
||||
{
|
||||
struct ipv6_txoptions *opt;
|
||||
|
||||
rcu_read_lock();
|
||||
opt = rcu_dereference(np->opt);
|
||||
if (opt && !atomic_inc_not_zero(&opt->refcnt))
|
||||
opt = NULL;
|
||||
rcu_read_unlock();
|
||||
return opt;
|
||||
}
|
||||
|
||||
static inline void txopt_put(struct ipv6_txoptions *opt)
|
||||
{
|
||||
if (opt && atomic_dec_and_test(&opt->refcnt))
|
||||
kfree_rcu(opt, rcu);
|
||||
}
|
||||
|
||||
struct ip6_flowlabel *fl6_sock_lookup(struct sock *sk, __be32 label);
|
||||
struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions *opt_space,
|
||||
struct ip6_flowlabel *fl,
|
||||
@@ -490,6 +509,7 @@ struct ip6_create_arg {
|
||||
u32 user;
|
||||
const struct in6_addr *src;
|
||||
const struct in6_addr *dst;
|
||||
int iif;
|
||||
u8 ecn;
|
||||
};
|
||||
|
||||
|
@@ -1321,11 +1321,15 @@ struct ieee80211_channel_switch {
|
||||
* interface. This flag should be set during interface addition,
|
||||
* but may be set/cleared as late as authentication to an AP. It is
|
||||
* only valid for managed/station mode interfaces.
|
||||
* @IEEE80211_VIF_GET_NOA_UPDATE: request to handle NOA attributes
|
||||
* and send P2P_PS notification to the driver if NOA changed, even
|
||||
* this is not pure P2P vif.
|
||||
*/
|
||||
enum ieee80211_vif_flags {
|
||||
IEEE80211_VIF_BEACON_FILTER = BIT(0),
|
||||
IEEE80211_VIF_SUPPORTS_CQM_RSSI = BIT(1),
|
||||
IEEE80211_VIF_SUPPORTS_UAPSD = BIT(2),
|
||||
IEEE80211_VIF_GET_NOA_UPDATE = BIT(3),
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1901,6 +1905,11 @@ struct ieee80211_txq {
|
||||
* @IEEE80211_HW_BEACON_TX_STATUS: The device/driver provides TX status
|
||||
* for sent beacons.
|
||||
*
|
||||
* @IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR: Hardware (or driver) requires that each
|
||||
* station has a unique address, i.e. each station entry can be identified
|
||||
* by just its MAC address; this prevents, for example, the same station
|
||||
* from connecting to two virtual AP interfaces at the same time.
|
||||
*
|
||||
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
|
||||
*/
|
||||
enum ieee80211_hw_flags {
|
||||
@@ -1936,6 +1945,7 @@ enum ieee80211_hw_flags {
|
||||
IEEE80211_HW_TDLS_WIDER_BW,
|
||||
IEEE80211_HW_SUPPORTS_AMSDU_IN_AMPDU,
|
||||
IEEE80211_HW_BEACON_TX_STATUS,
|
||||
IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR,
|
||||
|
||||
/* keep last, obviously */
|
||||
NUM_IEEE80211_HW_FLAGS
|
||||
@@ -2003,8 +2013,10 @@ enum ieee80211_hw_flags {
|
||||
* it shouldn't be set.
|
||||
*
|
||||
* @max_tx_aggregation_subframes: maximum number of subframes in an
|
||||
* aggregate an HT driver will transmit, used by the peer as a
|
||||
* hint to size its reorder buffer.
|
||||
* aggregate an HT driver will transmit. Though ADDBA will advertise
|
||||
* a constant value of 64 as some older APs can crash if the window
|
||||
* size is smaller (an example is LinkSys WRT120N with FW v1.0.07
|
||||
* build 002 Jun 18 2012).
|
||||
*
|
||||
* @offchannel_tx_hw_queue: HW queue ID to use for offchannel TX
|
||||
* (if %IEEE80211_HW_QUEUE_CONTROL is set)
|
||||
@@ -4860,6 +4872,28 @@ void ieee80211_sta_block_awake(struct ieee80211_hw *hw,
|
||||
*/
|
||||
void ieee80211_sta_eosp(struct ieee80211_sta *pubsta);
|
||||
|
||||
/**
|
||||
* ieee80211_send_eosp_nullfunc - ask mac80211 to send NDP with EOSP
|
||||
* @pubsta: the station
|
||||
* @tid: the tid of the NDP
|
||||
*
|
||||
* Sometimes the device understands that it needs to close
|
||||
* the Service Period unexpectedly. This can happen when
|
||||
* sending frames that are filling holes in the BA window.
|
||||
* In this case, the device can ask mac80211 to send a
|
||||
* Nullfunc frame with EOSP set. When that happens, the
|
||||
* driver must have called ieee80211_sta_set_buffered() to
|
||||
* let mac80211 know that there are no buffered frames any
|
||||
* more, otherwise mac80211 will get the more_data bit wrong.
|
||||
* The low level driver must have made sure that the frame
|
||||
* will be sent despite the station being in power-save.
|
||||
* Mac80211 won't call allow_buffered_frames().
|
||||
* Note that calling this function, doesn't exempt the driver
|
||||
* from closing the EOSP properly, it will still have to call
|
||||
* ieee80211_sta_eosp when the NDP is sent.
|
||||
*/
|
||||
void ieee80211_send_eosp_nullfunc(struct ieee80211_sta *pubsta, int tid);
|
||||
|
||||
/**
|
||||
* ieee80211_iter_keys - iterate keys programmed into the device
|
||||
* @hw: pointer obtained from ieee80211_alloc_hw()
|
||||
@@ -4887,6 +4921,30 @@ void ieee80211_iter_keys(struct ieee80211_hw *hw,
|
||||
void *data),
|
||||
void *iter_data);
|
||||
|
||||
/**
|
||||
* ieee80211_iter_keys_rcu - iterate keys programmed into the device
|
||||
* @hw: pointer obtained from ieee80211_alloc_hw()
|
||||
* @vif: virtual interface to iterate, may be %NULL for all
|
||||
* @iter: iterator function that will be called for each key
|
||||
* @iter_data: custom data to pass to the iterator function
|
||||
*
|
||||
* This function can be used to iterate all the keys known to
|
||||
* mac80211, even those that weren't previously programmed into
|
||||
* the device. Note that due to locking reasons, keys of station
|
||||
* in removal process will be skipped.
|
||||
*
|
||||
* This function requires being called in an RCU critical section,
|
||||
* and thus iter must be atomic.
|
||||
*/
|
||||
void ieee80211_iter_keys_rcu(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
void (*iter)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key,
|
||||
void *data),
|
||||
void *iter_data);
|
||||
|
||||
/**
|
||||
* ieee80211_iter_chan_contexts_atomic - iterate channel contexts
|
||||
* @hw: pointre obtained from ieee80211_alloc_hw().
|
||||
|
@@ -181,8 +181,7 @@ void ndisc_cleanup(void);
|
||||
int ndisc_rcv(struct sk_buff *skb);
|
||||
|
||||
void ndisc_send_ns(struct net_device *dev, const struct in6_addr *solicit,
|
||||
const struct in6_addr *daddr, const struct in6_addr *saddr,
|
||||
struct sk_buff *oskb);
|
||||
const struct in6_addr *daddr, const struct in6_addr *saddr);
|
||||
|
||||
void ndisc_send_rs(struct net_device *dev,
|
||||
const struct in6_addr *saddr, const struct in6_addr *daddr);
|
||||
|
@@ -25,8 +25,6 @@ struct netprio_map {
|
||||
u32 priomap[];
|
||||
};
|
||||
|
||||
void sock_update_netprioidx(struct sock *sk);
|
||||
|
||||
static inline u32 task_netprioidx(struct task_struct *p)
|
||||
{
|
||||
struct cgroup_subsys_state *css;
|
||||
@@ -38,13 +36,25 @@ static inline u32 task_netprioidx(struct task_struct *p)
|
||||
rcu_read_unlock();
|
||||
return idx;
|
||||
}
|
||||
|
||||
static inline void sock_update_netprioidx(struct sock_cgroup_data *skcd)
|
||||
{
|
||||
if (in_interrupt())
|
||||
return;
|
||||
|
||||
sock_cgroup_set_prioidx(skcd, task_netprioidx(current));
|
||||
}
|
||||
|
||||
#else /* !CONFIG_CGROUP_NET_PRIO */
|
||||
|
||||
static inline u32 task_netprioidx(struct task_struct *p)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define sock_update_netprioidx(sk)
|
||||
static inline void sock_update_netprioidx(struct sock_cgroup_data *skcd)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_CGROUP_NET_PRIO */
|
||||
#endif /* _NET_CLS_CGROUP_H */
|
||||
|
@@ -61,6 +61,9 @@ struct Qdisc {
|
||||
*/
|
||||
#define TCQ_F_WARN_NONWC (1 << 16)
|
||||
#define TCQ_F_CPUSTATS 0x20 /* run using percpu statistics */
|
||||
#define TCQ_F_NOPARENT 0x40 /* root of its hierarchy :
|
||||
* qdisc_tree_decrease_qlen() should stop.
|
||||
*/
|
||||
u32 limit;
|
||||
const struct Qdisc_ops *ops;
|
||||
struct qdisc_size_table __rcu *stab;
|
||||
|
@@ -775,10 +775,10 @@ struct sctp_transport {
|
||||
hb_sent:1,
|
||||
|
||||
/* Is the Path MTU update pending on this tranport */
|
||||
pmtu_pending:1;
|
||||
pmtu_pending:1,
|
||||
|
||||
/* Has this transport moved the ctsn since we last sacked */
|
||||
__u32 sack_generation;
|
||||
/* Has this transport moved the ctsn since we last sacked */
|
||||
sack_generation:1;
|
||||
u32 dst_cookie;
|
||||
|
||||
struct flowi fl;
|
||||
@@ -1482,19 +1482,19 @@ struct sctp_association {
|
||||
prsctp_capable:1, /* Can peer do PR-SCTP? */
|
||||
auth_capable:1; /* Is peer doing SCTP-AUTH? */
|
||||
|
||||
/* Ack State : This flag indicates if the next received
|
||||
/* sack_needed : This flag indicates if the next received
|
||||
* : packet is to be responded to with a
|
||||
* : SACK. This is initializedto 0. When a packet
|
||||
* : is received it is incremented. If this value
|
||||
* : SACK. This is initialized to 0. When a packet
|
||||
* : is received sack_cnt is incremented. If this value
|
||||
* : reaches 2 or more, a SACK is sent and the
|
||||
* : value is reset to 0. Note: This is used only
|
||||
* : when no DATA chunks are received out of
|
||||
* : order. When DATA chunks are out of order,
|
||||
* : SACK's are not delayed (see Section 6).
|
||||
*/
|
||||
__u8 sack_needed; /* Do we need to sack the peer? */
|
||||
__u8 sack_needed:1, /* Do we need to sack the peer? */
|
||||
sack_generation:1;
|
||||
__u32 sack_cnt;
|
||||
__u32 sack_generation;
|
||||
|
||||
__u32 adaptation_ind; /* Adaptation Code point. */
|
||||
|
||||
|
@@ -58,6 +58,8 @@
|
||||
#include <linux/memcontrol.h>
|
||||
#include <linux/static_key.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/cgroup-defs.h>
|
||||
|
||||
#include <linux/filter.h>
|
||||
#include <linux/rculist_nulls.h>
|
||||
@@ -254,7 +256,6 @@ struct cg_proto;
|
||||
* @sk_wq: sock wait queue and async head
|
||||
* @sk_rx_dst: receive input route used by early demux
|
||||
* @sk_dst_cache: destination cache
|
||||
* @sk_dst_lock: destination cache lock
|
||||
* @sk_policy: flow policy
|
||||
* @sk_receive_queue: incoming packets
|
||||
* @sk_wmem_alloc: transmit queue bytes committed
|
||||
@@ -288,7 +289,6 @@ struct cg_proto;
|
||||
* @sk_ack_backlog: current listen backlog
|
||||
* @sk_max_ack_backlog: listen backlog set in listen()
|
||||
* @sk_priority: %SO_PRIORITY setting
|
||||
* @sk_cgrp_prioidx: socket group's priority map index
|
||||
* @sk_type: socket type (%SOCK_STREAM, etc)
|
||||
* @sk_protocol: which protocol this socket belongs in this network family
|
||||
* @sk_peer_pid: &struct pid for this socket's peer
|
||||
@@ -309,7 +309,7 @@ struct cg_proto;
|
||||
* @sk_send_head: front of stuff to transmit
|
||||
* @sk_security: used by security modules
|
||||
* @sk_mark: generic packet mark
|
||||
* @sk_classid: this socket's cgroup classid
|
||||
* @sk_cgrp_data: cgroup data for this cgroup
|
||||
* @sk_cgrp: this socket's cgroup-specific proto data
|
||||
* @sk_write_pending: a write to stream socket waits to start
|
||||
* @sk_state_change: callback to indicate change in the state of the sock
|
||||
@@ -384,14 +384,16 @@ struct sock {
|
||||
int sk_rcvbuf;
|
||||
|
||||
struct sk_filter __rcu *sk_filter;
|
||||
struct socket_wq __rcu *sk_wq;
|
||||
|
||||
union {
|
||||
struct socket_wq __rcu *sk_wq;
|
||||
struct socket_wq *sk_wq_raw;
|
||||
};
|
||||
#ifdef CONFIG_XFRM
|
||||
struct xfrm_policy *sk_policy[2];
|
||||
#endif
|
||||
struct dst_entry *sk_rx_dst;
|
||||
struct dst_entry __rcu *sk_dst_cache;
|
||||
spinlock_t sk_dst_lock;
|
||||
/* Note: 32bit hole on 64bit arches */
|
||||
atomic_t sk_wmem_alloc;
|
||||
atomic_t sk_omem_alloc;
|
||||
int sk_sndbuf;
|
||||
@@ -423,9 +425,7 @@ struct sock {
|
||||
u32 sk_ack_backlog;
|
||||
u32 sk_max_ack_backlog;
|
||||
__u32 sk_priority;
|
||||
#if IS_ENABLED(CONFIG_CGROUP_NET_PRIO)
|
||||
__u32 sk_cgrp_prioidx;
|
||||
#endif
|
||||
__u32 sk_mark;
|
||||
struct pid *sk_peer_pid;
|
||||
const struct cred *sk_peer_cred;
|
||||
long sk_rcvtimeo;
|
||||
@@ -443,10 +443,7 @@ struct sock {
|
||||
#ifdef CONFIG_SECURITY
|
||||
void *sk_security;
|
||||
#endif
|
||||
__u32 sk_mark;
|
||||
#ifdef CONFIG_CGROUP_NET_CLASSID
|
||||
u32 sk_classid;
|
||||
#endif
|
||||
struct sock_cgroup_data sk_cgrp_data;
|
||||
struct cg_proto *sk_cgrp;
|
||||
void (*sk_state_change)(struct sock *sk);
|
||||
void (*sk_data_ready)(struct sock *sk);
|
||||
@@ -774,9 +771,9 @@ static inline int sk_memalloc_socks(void)
|
||||
|
||||
#endif
|
||||
|
||||
static inline gfp_t sk_gfp_atomic(const struct sock *sk, gfp_t gfp_mask)
|
||||
static inline gfp_t sk_gfp_mask(const struct sock *sk, gfp_t gfp_mask)
|
||||
{
|
||||
return GFP_ATOMIC | (sk->sk_allocation & __GFP_MEMALLOC);
|
||||
return gfp_mask | (sk->sk_allocation & __GFP_MEMALLOC);
|
||||
}
|
||||
|
||||
static inline void sk_acceptq_removed(struct sock *sk)
|
||||
@@ -1879,12 +1876,12 @@ static inline bool sk_has_allocations(const struct sock *sk)
|
||||
}
|
||||
|
||||
/**
|
||||
* wq_has_sleeper - check if there are any waiting processes
|
||||
* skwq_has_sleeper - check if there are any waiting processes
|
||||
* @wq: struct socket_wq
|
||||
*
|
||||
* Returns true if socket_wq has waiting processes
|
||||
*
|
||||
* The purpose of the wq_has_sleeper and sock_poll_wait is to wrap the memory
|
||||
* The purpose of the skwq_has_sleeper and sock_poll_wait is to wrap the memory
|
||||
* barrier call. They were added due to the race found within the tcp code.
|
||||
*
|
||||
* Consider following tcp code paths:
|
||||
@@ -1910,15 +1907,9 @@ static inline bool sk_has_allocations(const struct sock *sk)
|
||||
* data on the socket.
|
||||
*
|
||||
*/
|
||||
static inline bool wq_has_sleeper(struct socket_wq *wq)
|
||||
static inline bool skwq_has_sleeper(struct socket_wq *wq)
|
||||
{
|
||||
/* We need to be sure we are in sync with the
|
||||
* add_wait_queue modifications to the wait queue.
|
||||
*
|
||||
* This memory barrier is paired in the sock_poll_wait.
|
||||
*/
|
||||
smp_mb();
|
||||
return wq && waitqueue_active(&wq->wait);
|
||||
return wq && wq_has_sleeper(&wq->wait);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2005,10 +1996,27 @@ static inline unsigned long sock_wspace(struct sock *sk)
|
||||
return amt;
|
||||
}
|
||||
|
||||
static inline void sk_wake_async(struct sock *sk, int how, int band)
|
||||
/* Note:
|
||||
* We use sk->sk_wq_raw, from contexts knowing this
|
||||
* pointer is not NULL and cannot disappear/change.
|
||||
*/
|
||||
static inline void sk_set_bit(int nr, struct sock *sk)
|
||||
{
|
||||
if (sock_flag(sk, SOCK_FASYNC))
|
||||
sock_wake_async(sk->sk_socket, how, band);
|
||||
set_bit(nr, &sk->sk_wq_raw->flags);
|
||||
}
|
||||
|
||||
static inline void sk_clear_bit(int nr, struct sock *sk)
|
||||
{
|
||||
clear_bit(nr, &sk->sk_wq_raw->flags);
|
||||
}
|
||||
|
||||
static inline void sk_wake_async(const struct sock *sk, int how, int band)
|
||||
{
|
||||
if (sock_flag(sk, SOCK_FASYNC)) {
|
||||
rcu_read_lock();
|
||||
sock_wake_async(rcu_dereference(sk->sk_wq), how, band);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/* Since sk_{r,w}mem_alloc sums skb->truesize, even a small frame might
|
||||
|
Reference in New Issue
Block a user