mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Merge remote-tracking branch 'net-next/master' into mac80211-next
Merging this brings in the timer_setup() change, which allows me to apply Kees's mac80211 changes for it. Signed-off-by: Johannes Berg <[email protected]>
This commit is contained in:
commit
753d179ad0
1267 changed files with 36829 additions and 9263 deletions
|
|
@ -22,11 +22,13 @@
|
|||
|
||||
#include "vsock_addr.h"
|
||||
|
||||
/* vsock-specific sock->sk_state constants */
|
||||
#define VSOCK_SS_LISTEN 255
|
||||
|
||||
#define LAST_RESERVED_PORT 1023
|
||||
|
||||
#define VSOCK_HASH_SIZE 251
|
||||
extern struct list_head vsock_bind_table[VSOCK_HASH_SIZE + 1];
|
||||
extern struct list_head vsock_connected_table[VSOCK_HASH_SIZE];
|
||||
extern spinlock_t vsock_table_lock;
|
||||
|
||||
#define vsock_sk(__sk) ((struct vsock_sock *)__sk)
|
||||
#define sk_vsock(__vsk) (&(__vsk)->sk)
|
||||
|
||||
|
|
@ -175,6 +177,18 @@ const struct vsock_transport *vsock_core_get_transport(void);
|
|||
|
||||
/**** UTILS ****/
|
||||
|
||||
/* vsock_table_lock must be held */
|
||||
static inline bool __vsock_in_bound_table(struct vsock_sock *vsk)
|
||||
{
|
||||
return !list_empty(&vsk->bound_table);
|
||||
}
|
||||
|
||||
/* vsock_table_lock must be held */
|
||||
static inline bool __vsock_in_connected_table(struct vsock_sock *vsk)
|
||||
{
|
||||
return !list_empty(&vsk->connected_table);
|
||||
}
|
||||
|
||||
void vsock_release_pending(struct sock *pending);
|
||||
void vsock_add_pending(struct sock *listener, struct sock *pending);
|
||||
void vsock_remove_pending(struct sock *listener, struct sock *pending);
|
||||
|
|
|
|||
|
|
@ -596,7 +596,8 @@ void bond_destroy_sysfs(struct bond_net *net);
|
|||
void bond_prepare_sysfs_group(struct bonding *bond);
|
||||
int bond_sysfs_slave_add(struct slave *slave);
|
||||
void bond_sysfs_slave_del(struct slave *slave);
|
||||
int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev);
|
||||
int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
|
||||
struct netlink_ext_ack *extack);
|
||||
int bond_release(struct net_device *bond_dev, struct net_device *slave_dev);
|
||||
u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb);
|
||||
int bond_set_carrier(struct bonding *bond);
|
||||
|
|
|
|||
|
|
@ -130,11 +130,6 @@ struct dsa_switch_tree {
|
|||
*/
|
||||
struct dsa_platform_data *pd;
|
||||
|
||||
/* Copy of tag_ops->rcv for faster access in hot path */
|
||||
struct sk_buff * (*rcv)(struct sk_buff *skb,
|
||||
struct net_device *dev,
|
||||
struct packet_type *pt);
|
||||
|
||||
/*
|
||||
* The switch port to which the CPU is attached.
|
||||
*/
|
||||
|
|
@ -144,12 +139,6 @@ struct dsa_switch_tree {
|
|||
* Data for the individual switch chips.
|
||||
*/
|
||||
struct dsa_switch *ds[DSA_MAX_SWITCHES];
|
||||
|
||||
/*
|
||||
* Tagging protocol operations for adding and removing an
|
||||
* encapsulation tag.
|
||||
*/
|
||||
const struct dsa_device_ops *tag_ops;
|
||||
};
|
||||
|
||||
/* TC matchall action types, only mirroring for now */
|
||||
|
|
@ -175,6 +164,14 @@ struct dsa_mall_tc_entry {
|
|||
|
||||
|
||||
struct dsa_port {
|
||||
/* CPU port tagging operations used by master or slave devices */
|
||||
const struct dsa_device_ops *tag_ops;
|
||||
|
||||
/* Copies for faster access in master receive hot path */
|
||||
struct dsa_switch_tree *dst;
|
||||
struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
|
||||
struct packet_type *pt);
|
||||
|
||||
struct dsa_switch *ds;
|
||||
unsigned int index;
|
||||
const char *name;
|
||||
|
|
@ -188,7 +185,6 @@ struct dsa_port {
|
|||
/*
|
||||
* Original copy of the master netdev ethtool_ops
|
||||
*/
|
||||
struct ethtool_ops ethtool_ops;
|
||||
const struct ethtool_ops *orig_ethtool_ops;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ static inline void dst_use_noref(struct dst_entry *dst, unsigned long time)
|
|||
static inline struct dst_entry *dst_clone(struct dst_entry *dst)
|
||||
{
|
||||
if (dst)
|
||||
atomic_inc(&dst->__refcnt);
|
||||
dst_hold(dst);
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
|
@ -311,21 +311,6 @@ static inline void skb_dst_copy(struct sk_buff *nskb, const struct sk_buff *oskb
|
|||
__skb_dst_copy(nskb, oskb->_skb_refdst);
|
||||
}
|
||||
|
||||
/**
|
||||
* skb_dst_force - makes sure skb dst is refcounted
|
||||
* @skb: buffer
|
||||
*
|
||||
* If dst is not yet refcounted, let's do it
|
||||
*/
|
||||
static inline void skb_dst_force(struct sk_buff *skb)
|
||||
{
|
||||
if (skb_dst_is_noref(skb)) {
|
||||
WARN_ON(!rcu_read_lock_held());
|
||||
skb->_skb_refdst &= ~SKB_DST_NOREF;
|
||||
dst_clone(skb_dst(skb));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* dst_hold_safe - Take a reference on a dst if possible
|
||||
* @dst: pointer to dst entry
|
||||
|
|
@ -339,16 +324,17 @@ static inline bool dst_hold_safe(struct dst_entry *dst)
|
|||
}
|
||||
|
||||
/**
|
||||
* skb_dst_force_safe - makes sure skb dst is refcounted
|
||||
* skb_dst_force - makes sure skb dst is refcounted
|
||||
* @skb: buffer
|
||||
*
|
||||
* If dst is not yet refcounted and not destroyed, grab a ref on it.
|
||||
*/
|
||||
static inline void skb_dst_force_safe(struct sk_buff *skb)
|
||||
static inline void skb_dst_force(struct sk_buff *skb)
|
||||
{
|
||||
if (skb_dst_is_noref(skb)) {
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
|
||||
WARN_ON(!rcu_read_lock_held());
|
||||
if (!dst_hold_safe(dst))
|
||||
dst = NULL;
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ struct metadata_dst {
|
|||
} u;
|
||||
};
|
||||
|
||||
static inline struct metadata_dst *skb_metadata_dst(struct sk_buff *skb)
|
||||
static inline struct metadata_dst *skb_metadata_dst(const struct sk_buff *skb)
|
||||
{
|
||||
struct metadata_dst *md_dst = (struct metadata_dst *) skb_dst(skb);
|
||||
|
||||
|
|
@ -34,7 +34,8 @@ static inline struct metadata_dst *skb_metadata_dst(struct sk_buff *skb)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct ip_tunnel_info *skb_tunnel_info(struct sk_buff *skb)
|
||||
static inline struct ip_tunnel_info *
|
||||
skb_tunnel_info(const struct sk_buff *skb)
|
||||
{
|
||||
struct metadata_dst *md_dst = skb_metadata_dst(skb);
|
||||
struct dst_entry *dst;
|
||||
|
|
|
|||
|
|
@ -20,6 +20,8 @@ enum fib_event_type {
|
|||
FIB_EVENT_RULE_DEL,
|
||||
FIB_EVENT_NH_ADD,
|
||||
FIB_EVENT_NH_DEL,
|
||||
FIB_EVENT_VIF_ADD,
|
||||
FIB_EVENT_VIF_DEL,
|
||||
};
|
||||
|
||||
struct fib_notifier_ops {
|
||||
|
|
|
|||
|
|
@ -133,11 +133,6 @@ static inline int IP6_ECN_set_ce(struct sk_buff *skb, struct ipv6hdr *iph)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static inline void IP6_ECN_clear(struct ipv6hdr *iph)
|
||||
{
|
||||
*(__be32*)iph &= ~htonl(INET_ECN_MASK << 20);
|
||||
}
|
||||
|
||||
static inline void ipv6_copy_dscp(unsigned int dscp, struct ipv6hdr *inner)
|
||||
{
|
||||
dscp &= ~INET_ECN_MASK;
|
||||
|
|
|
|||
|
|
@ -122,9 +122,6 @@ struct fib_info {
|
|||
#define fib_rtt fib_metrics->metrics[RTAX_RTT-1]
|
||||
#define fib_advmss fib_metrics->metrics[RTAX_ADVMSS-1]
|
||||
int fib_nhs;
|
||||
#ifdef CONFIG_IP_ROUTE_MULTIPATH
|
||||
int fib_weight;
|
||||
#endif
|
||||
struct rcu_head rcu;
|
||||
struct fib_nh fib_nh[0];
|
||||
#define fib_dev fib_nh[0].nh_dev
|
||||
|
|
|
|||
|
|
@ -258,7 +258,8 @@ int ip_tunnel_get_iflink(const struct net_device *dev);
|
|||
int ip_tunnel_init_net(struct net *net, unsigned int ip_tnl_net_id,
|
||||
struct rtnl_link_ops *ops, char *devname);
|
||||
|
||||
void ip_tunnel_delete_net(struct ip_tunnel_net *itn, struct rtnl_link_ops *ops);
|
||||
void ip_tunnel_delete_nets(struct list_head *list_net, unsigned int id,
|
||||
struct rtnl_link_ops *ops);
|
||||
|
||||
void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
const struct iphdr *tnl_params, const u8 protocol);
|
||||
|
|
|
|||
|
|
@ -190,8 +190,8 @@ struct neigh_hash_table {
|
|||
|
||||
struct neigh_table {
|
||||
int family;
|
||||
int entry_size;
|
||||
int key_len;
|
||||
unsigned int entry_size;
|
||||
unsigned int key_len;
|
||||
__be16 protocol;
|
||||
__u32 (*hash)(const void *pkey,
|
||||
const struct net_device *dev,
|
||||
|
|
|
|||
|
|
@ -773,7 +773,10 @@ static inline int nla_parse_nested(struct nlattr *tb[], int maxtype,
|
|||
*/
|
||||
static inline int nla_put_u8(struct sk_buff *skb, int attrtype, u8 value)
|
||||
{
|
||||
return nla_put(skb, attrtype, sizeof(u8), &value);
|
||||
/* temporary variables to work around GCC PR81715 with asan-stack=1 */
|
||||
u8 tmp = value;
|
||||
|
||||
return nla_put(skb, attrtype, sizeof(u8), &tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -784,7 +787,9 @@ static inline int nla_put_u8(struct sk_buff *skb, int attrtype, u8 value)
|
|||
*/
|
||||
static inline int nla_put_u16(struct sk_buff *skb, int attrtype, u16 value)
|
||||
{
|
||||
return nla_put(skb, attrtype, sizeof(u16), &value);
|
||||
u16 tmp = value;
|
||||
|
||||
return nla_put(skb, attrtype, sizeof(u16), &tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -795,7 +800,9 @@ static inline int nla_put_u16(struct sk_buff *skb, int attrtype, u16 value)
|
|||
*/
|
||||
static inline int nla_put_be16(struct sk_buff *skb, int attrtype, __be16 value)
|
||||
{
|
||||
return nla_put(skb, attrtype, sizeof(__be16), &value);
|
||||
__be16 tmp = value;
|
||||
|
||||
return nla_put(skb, attrtype, sizeof(__be16), &tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -806,7 +813,9 @@ static inline int nla_put_be16(struct sk_buff *skb, int attrtype, __be16 value)
|
|||
*/
|
||||
static inline int nla_put_net16(struct sk_buff *skb, int attrtype, __be16 value)
|
||||
{
|
||||
return nla_put_be16(skb, attrtype | NLA_F_NET_BYTEORDER, value);
|
||||
__be16 tmp = value;
|
||||
|
||||
return nla_put_be16(skb, attrtype | NLA_F_NET_BYTEORDER, tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -817,7 +826,9 @@ static inline int nla_put_net16(struct sk_buff *skb, int attrtype, __be16 value)
|
|||
*/
|
||||
static inline int nla_put_le16(struct sk_buff *skb, int attrtype, __le16 value)
|
||||
{
|
||||
return nla_put(skb, attrtype, sizeof(__le16), &value);
|
||||
__le16 tmp = value;
|
||||
|
||||
return nla_put(skb, attrtype, sizeof(__le16), &tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -828,7 +839,9 @@ static inline int nla_put_le16(struct sk_buff *skb, int attrtype, __le16 value)
|
|||
*/
|
||||
static inline int nla_put_u32(struct sk_buff *skb, int attrtype, u32 value)
|
||||
{
|
||||
return nla_put(skb, attrtype, sizeof(u32), &value);
|
||||
u32 tmp = value;
|
||||
|
||||
return nla_put(skb, attrtype, sizeof(u32), &tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -839,7 +852,9 @@ static inline int nla_put_u32(struct sk_buff *skb, int attrtype, u32 value)
|
|||
*/
|
||||
static inline int nla_put_be32(struct sk_buff *skb, int attrtype, __be32 value)
|
||||
{
|
||||
return nla_put(skb, attrtype, sizeof(__be32), &value);
|
||||
__be32 tmp = value;
|
||||
|
||||
return nla_put(skb, attrtype, sizeof(__be32), &tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -850,7 +865,9 @@ static inline int nla_put_be32(struct sk_buff *skb, int attrtype, __be32 value)
|
|||
*/
|
||||
static inline int nla_put_net32(struct sk_buff *skb, int attrtype, __be32 value)
|
||||
{
|
||||
return nla_put_be32(skb, attrtype | NLA_F_NET_BYTEORDER, value);
|
||||
__be32 tmp = value;
|
||||
|
||||
return nla_put_be32(skb, attrtype | NLA_F_NET_BYTEORDER, tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -861,7 +878,9 @@ static inline int nla_put_net32(struct sk_buff *skb, int attrtype, __be32 value)
|
|||
*/
|
||||
static inline int nla_put_le32(struct sk_buff *skb, int attrtype, __le32 value)
|
||||
{
|
||||
return nla_put(skb, attrtype, sizeof(__le32), &value);
|
||||
__le32 tmp = value;
|
||||
|
||||
return nla_put(skb, attrtype, sizeof(__le32), &tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -874,7 +893,9 @@ static inline int nla_put_le32(struct sk_buff *skb, int attrtype, __le32 value)
|
|||
static inline int nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
|
||||
u64 value, int padattr)
|
||||
{
|
||||
return nla_put_64bit(skb, attrtype, sizeof(u64), &value, padattr);
|
||||
u64 tmp = value;
|
||||
|
||||
return nla_put_64bit(skb, attrtype, sizeof(u64), &tmp, padattr);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -887,7 +908,9 @@ static inline int nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
|
|||
static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value,
|
||||
int padattr)
|
||||
{
|
||||
return nla_put_64bit(skb, attrtype, sizeof(__be64), &value, padattr);
|
||||
__be64 tmp = value;
|
||||
|
||||
return nla_put_64bit(skb, attrtype, sizeof(__be64), &tmp, padattr);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -900,7 +923,9 @@ static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value,
|
|||
static inline int nla_put_net64(struct sk_buff *skb, int attrtype, __be64 value,
|
||||
int padattr)
|
||||
{
|
||||
return nla_put_be64(skb, attrtype | NLA_F_NET_BYTEORDER, value,
|
||||
__be64 tmp = value;
|
||||
|
||||
return nla_put_be64(skb, attrtype | NLA_F_NET_BYTEORDER, tmp,
|
||||
padattr);
|
||||
}
|
||||
|
||||
|
|
@ -914,7 +939,9 @@ static inline int nla_put_net64(struct sk_buff *skb, int attrtype, __be64 value,
|
|||
static inline int nla_put_le64(struct sk_buff *skb, int attrtype, __le64 value,
|
||||
int padattr)
|
||||
{
|
||||
return nla_put_64bit(skb, attrtype, sizeof(__le64), &value, padattr);
|
||||
__le64 tmp = value;
|
||||
|
||||
return nla_put_64bit(skb, attrtype, sizeof(__le64), &tmp, padattr);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -925,7 +952,9 @@ static inline int nla_put_le64(struct sk_buff *skb, int attrtype, __le64 value,
|
|||
*/
|
||||
static inline int nla_put_s8(struct sk_buff *skb, int attrtype, s8 value)
|
||||
{
|
||||
return nla_put(skb, attrtype, sizeof(s8), &value);
|
||||
s8 tmp = value;
|
||||
|
||||
return nla_put(skb, attrtype, sizeof(s8), &tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -936,7 +965,9 @@ static inline int nla_put_s8(struct sk_buff *skb, int attrtype, s8 value)
|
|||
*/
|
||||
static inline int nla_put_s16(struct sk_buff *skb, int attrtype, s16 value)
|
||||
{
|
||||
return nla_put(skb, attrtype, sizeof(s16), &value);
|
||||
s16 tmp = value;
|
||||
|
||||
return nla_put(skb, attrtype, sizeof(s16), &tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -947,7 +978,9 @@ static inline int nla_put_s16(struct sk_buff *skb, int attrtype, s16 value)
|
|||
*/
|
||||
static inline int nla_put_s32(struct sk_buff *skb, int attrtype, s32 value)
|
||||
{
|
||||
return nla_put(skb, attrtype, sizeof(s32), &value);
|
||||
s32 tmp = value;
|
||||
|
||||
return nla_put(skb, attrtype, sizeof(s32), &tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -960,7 +993,9 @@ static inline int nla_put_s32(struct sk_buff *skb, int attrtype, s32 value)
|
|||
static inline int nla_put_s64(struct sk_buff *skb, int attrtype, s64 value,
|
||||
int padattr)
|
||||
{
|
||||
return nla_put_64bit(skb, attrtype, sizeof(s64), &value, padattr);
|
||||
s64 tmp = value;
|
||||
|
||||
return nla_put_64bit(skb, attrtype, sizeof(s64), &tmp, padattr);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1010,7 +1045,9 @@ static inline int nla_put_msecs(struct sk_buff *skb, int attrtype,
|
|||
static inline int nla_put_in_addr(struct sk_buff *skb, int attrtype,
|
||||
__be32 addr)
|
||||
{
|
||||
return nla_put_be32(skb, attrtype, addr);
|
||||
__be32 tmp = addr;
|
||||
|
||||
return nla_put_be32(skb, attrtype, tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@ struct inet_timewait_death_row {
|
|||
int sysctl_max_tw_buckets;
|
||||
};
|
||||
|
||||
struct tcp_fastopen_context;
|
||||
|
||||
struct netns_ipv4 {
|
||||
#ifdef CONFIG_SYSCTL
|
||||
struct ctl_table_header *forw_hdr;
|
||||
|
|
@ -52,6 +54,7 @@ struct netns_ipv4 {
|
|||
struct fib_table __rcu *fib_main;
|
||||
struct fib_table __rcu *fib_default;
|
||||
#endif
|
||||
bool fib_has_custom_local_routes;
|
||||
#ifdef CONFIG_IP_ROUTE_CLASSID
|
||||
int fib_num_tclassid_users;
|
||||
#endif
|
||||
|
|
@ -127,6 +130,12 @@ struct netns_ipv4 {
|
|||
int sysctl_tcp_timestamps;
|
||||
struct inet_timewait_death_row tcp_death_row;
|
||||
int sysctl_max_syn_backlog;
|
||||
int sysctl_tcp_fastopen;
|
||||
struct tcp_fastopen_context __rcu *tcp_fastopen_ctx;
|
||||
spinlock_t tcp_fastopen_ctx_lock;
|
||||
unsigned int sysctl_tcp_fastopen_blackhole_timeout;
|
||||
atomic_t tfo_active_disable_times;
|
||||
unsigned long tfo_active_disable_stamp;
|
||||
|
||||
#ifdef CONFIG_NET_L3_MASTER_DEV
|
||||
int sysctl_udp_l3mdev_accept;
|
||||
|
|
@ -162,6 +171,9 @@ struct netns_ipv4 {
|
|||
struct fib_notifier_ops *notifier_ops;
|
||||
unsigned int fib_seq; /* protected by rtnl_mutex */
|
||||
|
||||
struct fib_notifier_ops *ipmr_notifier_ops;
|
||||
unsigned int ipmr_seq; /* protected by rtnl_mutex */
|
||||
|
||||
atomic_t rt_genid;
|
||||
};
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -89,6 +89,11 @@ struct netns_ipv6 {
|
|||
atomic_t fib6_sernum;
|
||||
struct seg6_pernet_data *seg6_data;
|
||||
struct fib_notifier_ops *notifier_ops;
|
||||
struct {
|
||||
struct hlist_head head;
|
||||
spinlock_t lock;
|
||||
u32 seq;
|
||||
} ip6addrlbl_table;
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6)
|
||||
|
|
|
|||
|
|
@ -39,8 +39,8 @@
|
|||
|
||||
/* This is used to register protocols. */
|
||||
struct net_protocol {
|
||||
void (*early_demux)(struct sk_buff *skb);
|
||||
void (*early_demux_handler)(struct sk_buff *skb);
|
||||
int (*early_demux)(struct sk_buff *skb);
|
||||
int (*early_demux_handler)(struct sk_buff *skb);
|
||||
int (*handler)(struct sk_buff *skb);
|
||||
void (*err_handler)(struct sk_buff *skb, u32 info);
|
||||
unsigned int no_policy:1,
|
||||
|
|
|
|||
|
|
@ -175,7 +175,9 @@ static inline struct rtable *ip_route_output_gre(struct net *net, struct flowi4
|
|||
fl4->fl4_gre_key = gre_key;
|
||||
return ip_route_output_key(net, fl4);
|
||||
}
|
||||
|
||||
int ip_mc_validate_source(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
u8 tos, struct net_device *dev,
|
||||
struct in_device *in_dev, u32 *itag);
|
||||
int ip_route_input_noref(struct sk_buff *skb, __be32 dst, __be32 src,
|
||||
u8 tos, struct net_device *devin);
|
||||
int ip_route_input_rcu(struct sk_buff *skb, __be32 dst, __be32 src,
|
||||
|
|
@ -190,7 +192,7 @@ static inline int ip_route_input(struct sk_buff *skb, __be32 dst, __be32 src,
|
|||
rcu_read_lock();
|
||||
err = ip_route_input_noref(skb, dst, src, tos, devin);
|
||||
if (!err) {
|
||||
skb_dst_force_safe(skb);
|
||||
skb_dst_force(skb);
|
||||
if (!skb_dst(skb))
|
||||
err = -EINVAL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,9 +93,6 @@ struct rtnl_link_ops {
|
|||
|
||||
int slave_maxtype;
|
||||
const struct nla_policy *slave_policy;
|
||||
int (*slave_validate)(struct nlattr *tb[],
|
||||
struct nlattr *data[],
|
||||
struct netlink_ext_ack *extack);
|
||||
int (*slave_changelink)(struct net_device *dev,
|
||||
struct net_device *slave_dev,
|
||||
struct nlattr *tb[],
|
||||
|
|
@ -154,8 +151,6 @@ struct rtnl_af_ops {
|
|||
size_t (*get_stats_af_size)(const struct net_device *dev);
|
||||
};
|
||||
|
||||
void __rtnl_af_unregister(struct rtnl_af_ops *ops);
|
||||
|
||||
void rtnl_af_register(struct rtnl_af_ops *ops);
|
||||
void rtnl_af_unregister(struct rtnl_af_ops *ops);
|
||||
|
||||
|
|
|
|||
|
|
@ -93,7 +93,6 @@ struct Qdisc {
|
|||
unsigned long state;
|
||||
struct Qdisc *next_sched;
|
||||
struct sk_buff *skb_bad_txq;
|
||||
struct rcu_head rcu_head;
|
||||
int padded;
|
||||
refcount_t refcnt;
|
||||
|
||||
|
|
|
|||
72
include/net/sctp/stream_sched.h
Normal file
72
include/net/sctp/stream_sched.h
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
/* SCTP kernel implementation
|
||||
* (C) Copyright Red Hat Inc. 2017
|
||||
*
|
||||
* These are definitions used by the stream schedulers, defined in RFC
|
||||
* draft ndata (https://tools.ietf.org/html/draft-ietf-tsvwg-sctp-ndata-11)
|
||||
*
|
||||
* This SCTP implementation is free software;
|
||||
* you can redistribute it and/or modify it under the terms of
|
||||
* the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This SCTP implementation is distributed in the hope that it
|
||||
* will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
* ************************
|
||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GNU CC; see the file COPYING. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Please send any bug reports or fixes you make to the
|
||||
* email addresses:
|
||||
* lksctp developers <linux-sctp@vger.kernel.org>
|
||||
*
|
||||
* Written or modified by:
|
||||
* Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __sctp_stream_sched_h__
|
||||
#define __sctp_stream_sched_h__
|
||||
|
||||
struct sctp_sched_ops {
|
||||
/* Property handling for a given stream */
|
||||
int (*set)(struct sctp_stream *stream, __u16 sid, __u16 value,
|
||||
gfp_t gfp);
|
||||
int (*get)(struct sctp_stream *stream, __u16 sid, __u16 *value);
|
||||
|
||||
/* Init the specific scheduler */
|
||||
int (*init)(struct sctp_stream *stream);
|
||||
/* Init a stream */
|
||||
int (*init_sid)(struct sctp_stream *stream, __u16 sid, gfp_t gfp);
|
||||
/* Frees the entire thing */
|
||||
void (*free)(struct sctp_stream *stream);
|
||||
|
||||
/* Enqueue a chunk */
|
||||
void (*enqueue)(struct sctp_outq *q, struct sctp_datamsg *msg);
|
||||
/* Dequeue a chunk */
|
||||
struct sctp_chunk *(*dequeue)(struct sctp_outq *q);
|
||||
/* Called only if the chunk fit the packet */
|
||||
void (*dequeue_done)(struct sctp_outq *q, struct sctp_chunk *chunk);
|
||||
/* Sched all chunks already enqueued */
|
||||
void (*sched_all)(struct sctp_stream *steam);
|
||||
/* Unched all chunks already enqueued */
|
||||
void (*unsched_all)(struct sctp_stream *steam);
|
||||
};
|
||||
|
||||
int sctp_sched_set_sched(struct sctp_association *asoc,
|
||||
enum sctp_sched_type sched);
|
||||
int sctp_sched_get_sched(struct sctp_association *asoc);
|
||||
int sctp_sched_set_value(struct sctp_association *asoc, __u16 sid,
|
||||
__u16 value, gfp_t gfp);
|
||||
int sctp_sched_get_value(struct sctp_association *asoc, __u16 sid,
|
||||
__u16 *value);
|
||||
void sctp_sched_dequeue_done(struct sctp_outq *q, struct sctp_chunk *ch);
|
||||
|
||||
void sctp_sched_dequeue_common(struct sctp_outq *q, struct sctp_chunk *ch);
|
||||
int sctp_sched_init_sid(struct sctp_stream *stream, __u16 sid, gfp_t gfp);
|
||||
struct sctp_sched_ops *sctp_sched_ops_from_stream(struct sctp_stream *stream);
|
||||
|
||||
#endif /* __sctp_stream_sched_h__ */
|
||||
|
|
@ -380,6 +380,7 @@ struct sctp_sender_hb_info {
|
|||
|
||||
int sctp_stream_init(struct sctp_stream *stream, __u16 outcnt, __u16 incnt,
|
||||
gfp_t gfp);
|
||||
int sctp_stream_init_ext(struct sctp_stream *stream, __u16 sid);
|
||||
void sctp_stream_free(struct sctp_stream *stream);
|
||||
void sctp_stream_clear(struct sctp_stream *stream);
|
||||
void sctp_stream_update(struct sctp_stream *stream, struct sctp_stream *new);
|
||||
|
|
@ -529,8 +530,12 @@ struct sctp_chunk {
|
|||
/* How many times this chunk have been sent, for prsctp RTX policy */
|
||||
int sent_count;
|
||||
|
||||
/* This is our link to the per-transport transmitted list. */
|
||||
struct list_head transmitted_list;
|
||||
union {
|
||||
/* This is our link to the per-transport transmitted list. */
|
||||
struct list_head transmitted_list;
|
||||
/* List in specific stream outq */
|
||||
struct list_head stream_list;
|
||||
};
|
||||
|
||||
/* This field is used by chunks that hold fragmented data.
|
||||
* For the first fragment this is the list that holds the rest of
|
||||
|
|
@ -640,6 +645,11 @@ void sctp_init_addrs(struct sctp_chunk *, union sctp_addr *,
|
|||
union sctp_addr *);
|
||||
const union sctp_addr *sctp_source(const struct sctp_chunk *chunk);
|
||||
|
||||
static inline __u16 sctp_chunk_stream_no(struct sctp_chunk *ch)
|
||||
{
|
||||
return ntohs(ch->subh.data_hdr->stream);
|
||||
}
|
||||
|
||||
enum {
|
||||
SCTP_ADDR_NEW, /* new address added to assoc/ep */
|
||||
SCTP_ADDR_SRC, /* address can be used as source */
|
||||
|
|
@ -1012,6 +1022,9 @@ struct sctp_outq {
|
|||
/* Data pending that has never been transmitted. */
|
||||
struct list_head out_chunk_list;
|
||||
|
||||
/* Stream scheduler being used */
|
||||
struct sctp_sched_ops *sched;
|
||||
|
||||
unsigned int out_qlen; /* Total length of queued data chunks. */
|
||||
|
||||
/* Error of send failed, may used in SCTP_SEND_FAILED event. */
|
||||
|
|
@ -1315,11 +1328,37 @@ struct sctp_inithdr_host {
|
|||
__u32 initial_tsn;
|
||||
};
|
||||
|
||||
struct sctp_stream_priorities {
|
||||
/* List of priorities scheduled */
|
||||
struct list_head prio_sched;
|
||||
/* List of streams scheduled */
|
||||
struct list_head active;
|
||||
/* The next stream stream in line */
|
||||
struct sctp_stream_out_ext *next;
|
||||
__u16 prio;
|
||||
};
|
||||
|
||||
struct sctp_stream_out_ext {
|
||||
__u64 abandoned_unsent[SCTP_PR_INDEX(MAX) + 1];
|
||||
__u64 abandoned_sent[SCTP_PR_INDEX(MAX) + 1];
|
||||
struct list_head outq; /* chunks enqueued by this stream */
|
||||
union {
|
||||
struct {
|
||||
/* Scheduled streams list */
|
||||
struct list_head prio_list;
|
||||
struct sctp_stream_priorities *prio_head;
|
||||
};
|
||||
/* Fields used by RR scheduler */
|
||||
struct {
|
||||
struct list_head rr_list;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
struct sctp_stream_out {
|
||||
__u16 ssn;
|
||||
__u8 state;
|
||||
__u64 abandoned_unsent[SCTP_PR_INDEX(MAX) + 1];
|
||||
__u64 abandoned_sent[SCTP_PR_INDEX(MAX) + 1];
|
||||
struct sctp_stream_out_ext *ext;
|
||||
};
|
||||
|
||||
struct sctp_stream_in {
|
||||
|
|
@ -1331,6 +1370,22 @@ struct sctp_stream {
|
|||
struct sctp_stream_in *in;
|
||||
__u16 outcnt;
|
||||
__u16 incnt;
|
||||
/* Current stream being sent, if any */
|
||||
struct sctp_stream_out *out_curr;
|
||||
union {
|
||||
/* Fields used by priority scheduler */
|
||||
struct {
|
||||
/* List of priorities scheduled */
|
||||
struct list_head prio_list;
|
||||
};
|
||||
/* Fields used by RR scheduler */
|
||||
struct {
|
||||
/* List of streams scheduled */
|
||||
struct list_head rr_list;
|
||||
/* The next stream stream in line */
|
||||
struct sctp_stream_out_ext *rr_next;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
#define SCTP_STREAM_CLOSED 0x00
|
||||
|
|
|
|||
|
|
@ -856,7 +856,7 @@ void sk_stream_write_space(struct sock *sk);
|
|||
static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
/* dont let skb dst not refcounted, we are going to leave rcu lock */
|
||||
skb_dst_force_safe(skb);
|
||||
skb_dst_force(skb);
|
||||
|
||||
if (!sk->sk_backlog.tail)
|
||||
sk->sk_backlog.head = skb;
|
||||
|
|
|
|||
|
|
@ -33,6 +33,11 @@ static inline bool __is_tcf_gact_act(const struct tc_action *a, int act,
|
|||
return false;
|
||||
}
|
||||
|
||||
static inline bool is_tcf_gact_ok(const struct tc_action *a)
|
||||
{
|
||||
return __is_tcf_gact_act(a, TC_ACT_OK, false);
|
||||
}
|
||||
|
||||
static inline bool is_tcf_gact_shot(const struct tc_action *a)
|
||||
{
|
||||
return __is_tcf_gact_act(a, TC_ACT_SHOT, false);
|
||||
|
|
|
|||
|
|
@ -240,7 +240,6 @@ void tcp_time_wait(struct sock *sk, int state, int timeo);
|
|||
|
||||
|
||||
/* sysctl variables for tcp */
|
||||
extern int sysctl_tcp_fastopen;
|
||||
extern int sysctl_tcp_retrans_collapse;
|
||||
extern int sysctl_tcp_stdurg;
|
||||
extern int sysctl_tcp_rfc1337;
|
||||
|
|
@ -345,7 +344,7 @@ void tcp_v4_err(struct sk_buff *skb, u32);
|
|||
|
||||
void tcp_shutdown(struct sock *sk, int how);
|
||||
|
||||
void tcp_v4_early_demux(struct sk_buff *skb);
|
||||
int tcp_v4_early_demux(struct sk_buff *skb);
|
||||
int tcp_v4_rcv(struct sk_buff *skb);
|
||||
|
||||
int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);
|
||||
|
|
@ -417,6 +416,7 @@ bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst);
|
|||
void tcp_disable_fack(struct tcp_sock *tp);
|
||||
void tcp_close(struct sock *sk, long timeout);
|
||||
void tcp_init_sock(struct sock *sk);
|
||||
void tcp_init_transfer(struct sock *sk, int bpf_op);
|
||||
unsigned int tcp_poll(struct file *file, struct socket *sock,
|
||||
struct poll_table_struct *wait);
|
||||
int tcp_getsockopt(struct sock *sk, int level, int optname,
|
||||
|
|
@ -544,7 +544,6 @@ u32 tcp_tso_autosize(const struct sock *sk, unsigned int mss_now,
|
|||
int min_tso_segs);
|
||||
void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss,
|
||||
int nonagle);
|
||||
bool tcp_may_send_now(struct sock *sk);
|
||||
int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs);
|
||||
int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs);
|
||||
void tcp_retransmit_timer(struct sock *sk);
|
||||
|
|
@ -797,12 +796,6 @@ struct tcp_skb_cb {
|
|||
u16 tcp_gso_segs;
|
||||
u16 tcp_gso_size;
|
||||
};
|
||||
|
||||
/* Used to stash the receive timestamp while this skb is in the
|
||||
* out of order queue, as skb->tstamp is overwritten by the
|
||||
* rbnode.
|
||||
*/
|
||||
ktime_t swtstamp;
|
||||
};
|
||||
__u8 tcp_flags; /* TCP header flags. (tcp[13]) */
|
||||
|
||||
|
|
@ -1557,13 +1550,13 @@ struct tcp_fastopen_request {
|
|||
};
|
||||
void tcp_free_fastopen_req(struct tcp_sock *tp);
|
||||
|
||||
extern struct tcp_fastopen_context __rcu *tcp_fastopen_ctx;
|
||||
int tcp_fastopen_reset_cipher(void *key, unsigned int len);
|
||||
void tcp_fastopen_ctx_destroy(struct net *net);
|
||||
int tcp_fastopen_reset_cipher(struct net *net, void *key, unsigned int len);
|
||||
void tcp_fastopen_add_skb(struct sock *sk, struct sk_buff *skb);
|
||||
struct sock *tcp_try_fastopen(struct sock *sk, struct sk_buff *skb,
|
||||
struct request_sock *req,
|
||||
struct tcp_fastopen_cookie *foc);
|
||||
void tcp_fastopen_init_key_once(bool publish);
|
||||
void tcp_fastopen_init_key_once(struct net *net);
|
||||
bool tcp_fastopen_cookie_check(struct sock *sk, u16 *mss,
|
||||
struct tcp_fastopen_cookie *cookie);
|
||||
bool tcp_fastopen_defer_connect(struct sock *sk, int *err);
|
||||
|
|
@ -1596,14 +1589,34 @@ enum tcp_chrono {
|
|||
void tcp_chrono_start(struct sock *sk, const enum tcp_chrono type);
|
||||
void tcp_chrono_stop(struct sock *sk, const enum tcp_chrono type);
|
||||
|
||||
/* This helper is needed, because skb->tcp_tsorted_anchor uses
|
||||
* the same memory storage than skb->destructor/_skb_refdst
|
||||
*/
|
||||
static inline void tcp_skb_tsorted_anchor_cleanup(struct sk_buff *skb)
|
||||
{
|
||||
skb->destructor = NULL;
|
||||
skb->_skb_refdst = 0UL;
|
||||
}
|
||||
|
||||
#define tcp_skb_tsorted_save(skb) { \
|
||||
unsigned long _save = skb->_skb_refdst; \
|
||||
skb->_skb_refdst = 0UL;
|
||||
|
||||
#define tcp_skb_tsorted_restore(skb) \
|
||||
skb->_skb_refdst = _save; \
|
||||
}
|
||||
|
||||
/* write queue abstraction */
|
||||
static inline void tcp_write_queue_purge(struct sock *sk)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
tcp_chrono_stop(sk, TCP_CHRONO_BUSY);
|
||||
while ((skb = __skb_dequeue(&sk->sk_write_queue)) != NULL)
|
||||
while ((skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) {
|
||||
tcp_skb_tsorted_anchor_cleanup(skb);
|
||||
sk_wmem_free_skb(sk, skb);
|
||||
}
|
||||
INIT_LIST_HEAD(&tcp_sk(sk)->tsorted_sent_queue);
|
||||
sk_mem_reclaim(sk);
|
||||
tcp_clear_all_retrans_hints(tcp_sk(sk));
|
||||
}
|
||||
|
|
@ -1718,6 +1731,8 @@ static inline void tcp_insert_write_queue_before(struct sk_buff *new,
|
|||
|
||||
static inline void tcp_unlink_write_queue(struct sk_buff *skb, struct sock *sk)
|
||||
{
|
||||
list_del(&skb->tcp_tsorted_anchor);
|
||||
tcp_skb_tsorted_anchor_cleanup(skb);
|
||||
__skb_unlink(skb, &sk->sk_write_queue);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -259,7 +259,7 @@ static inline struct sk_buff *skb_recv_udp(struct sock *sk, unsigned int flags,
|
|||
return __skb_recv_udp(sk, flags, noblock, &peeked, &off, err);
|
||||
}
|
||||
|
||||
void udp_v4_early_demux(struct sk_buff *skb);
|
||||
int udp_v4_early_demux(struct sk_buff *skb);
|
||||
bool udp_sk_rx_dst_set(struct sock *sk, struct dst_entry *dst);
|
||||
int udp_get_port(struct sock *sk, unsigned short snum,
|
||||
int (*saddr_cmp)(const struct sock *,
|
||||
|
|
|
|||
Loading…
Reference in a new issue