Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Several conflicts here. NFP driver bug fix adding nfp_netdev_is_nfp_repr() check to nfp_fl_output() needed some adjustments because the code block is in an else block now. Parallel additions to net/pkt_cls.h and net/sch_generic.h A bug fix in __tcp_retransmit_skb() conflicted with some of the rbtree changes in net-next. The tc action RCU callback fixes in 'net' had some overlap with some of the recent tcf_block reworking. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -794,7 +794,7 @@ hit:
|
||||
struct sctp_hash_cmp_arg {
|
||||
const union sctp_addr *paddr;
|
||||
const struct net *net;
|
||||
u16 lport;
|
||||
__be16 lport;
|
||||
};
|
||||
|
||||
static inline int sctp_hash_cmp(struct rhashtable_compare_arg *arg,
|
||||
@@ -820,37 +820,37 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static inline u32 sctp_hash_obj(const void *data, u32 len, u32 seed)
|
||||
static inline __u32 sctp_hash_obj(const void *data, u32 len, u32 seed)
|
||||
{
|
||||
const struct sctp_transport *t = data;
|
||||
const union sctp_addr *paddr = &t->ipaddr;
|
||||
const struct net *net = sock_net(t->asoc->base.sk);
|
||||
u16 lport = htons(t->asoc->base.bind_addr.port);
|
||||
u32 addr;
|
||||
__be16 lport = htons(t->asoc->base.bind_addr.port);
|
||||
__u32 addr;
|
||||
|
||||
if (paddr->sa.sa_family == AF_INET6)
|
||||
addr = jhash(&paddr->v6.sin6_addr, 16, seed);
|
||||
else
|
||||
addr = paddr->v4.sin_addr.s_addr;
|
||||
addr = (__force __u32)paddr->v4.sin_addr.s_addr;
|
||||
|
||||
return jhash_3words(addr, ((__u32)paddr->v4.sin_port) << 16 |
|
||||
return jhash_3words(addr, ((__force __u32)paddr->v4.sin_port) << 16 |
|
||||
(__force __u32)lport, net_hash_mix(net), seed);
|
||||
}
|
||||
|
||||
static inline u32 sctp_hash_key(const void *data, u32 len, u32 seed)
|
||||
static inline __u32 sctp_hash_key(const void *data, u32 len, u32 seed)
|
||||
{
|
||||
const struct sctp_hash_cmp_arg *x = data;
|
||||
const union sctp_addr *paddr = x->paddr;
|
||||
const struct net *net = x->net;
|
||||
u16 lport = x->lport;
|
||||
u32 addr;
|
||||
__be16 lport = x->lport;
|
||||
__u32 addr;
|
||||
|
||||
if (paddr->sa.sa_family == AF_INET6)
|
||||
addr = jhash(&paddr->v6.sin6_addr, 16, seed);
|
||||
else
|
||||
addr = paddr->v4.sin_addr.s_addr;
|
||||
addr = (__force __u32)paddr->v4.sin_addr.s_addr;
|
||||
|
||||
return jhash_3words(addr, ((__u32)paddr->v4.sin_port) << 16 |
|
||||
return jhash_3words(addr, ((__force __u32)paddr->v4.sin_port) << 16 |
|
||||
(__force __u32)lport, net_hash_mix(net), seed);
|
||||
}
|
||||
|
||||
|
@@ -738,7 +738,7 @@ static int sctp_v6_skb_iif(const struct sk_buff *skb)
|
||||
/* Was this packet marked by Explicit Congestion Notification? */
|
||||
static int sctp_v6_is_ce(const struct sk_buff *skb)
|
||||
{
|
||||
return *((__u32 *)(ipv6_hdr(skb))) & htonl(1 << 20);
|
||||
return *((__u32 *)(ipv6_hdr(skb))) & (__force __u32)htonl(1 << 20);
|
||||
}
|
||||
|
||||
/* Dump the v6 addr to the seq file. */
|
||||
@@ -882,8 +882,10 @@ static int sctp_inet6_bind_verify(struct sctp_sock *opt, union sctp_addr *addr)
|
||||
net = sock_net(&opt->inet.sk);
|
||||
rcu_read_lock();
|
||||
dev = dev_get_by_index_rcu(net, addr->v6.sin6_scope_id);
|
||||
if (!dev ||
|
||||
!ipv6_chk_addr(net, &addr->v6.sin6_addr, dev, 0)) {
|
||||
if (!dev || !(opt->inet.freebind ||
|
||||
net->ipv6.sysctl.ip_nonlocal_bind ||
|
||||
ipv6_chk_addr(net, &addr->v6.sin6_addr,
|
||||
dev, 0))) {
|
||||
rcu_read_unlock();
|
||||
return 0;
|
||||
}
|
||||
|
@@ -2854,7 +2854,7 @@ struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *asoc,
|
||||
addr_param_len = af->to_addr_param(addr, &addr_param);
|
||||
param.param_hdr.type = flags;
|
||||
param.param_hdr.length = htons(paramlen + addr_param_len);
|
||||
param.crr_id = i;
|
||||
param.crr_id = htonl(i);
|
||||
|
||||
sctp_addto_chunk(retval, paramlen, ¶m);
|
||||
sctp_addto_chunk(retval, addr_param_len, &addr_param);
|
||||
@@ -2867,7 +2867,7 @@ struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *asoc,
|
||||
addr_param_len = af->to_addr_param(addr, &addr_param);
|
||||
param.param_hdr.type = SCTP_PARAM_DEL_IP;
|
||||
param.param_hdr.length = htons(paramlen + addr_param_len);
|
||||
param.crr_id = i;
|
||||
param.crr_id = htonl(i);
|
||||
|
||||
sctp_addto_chunk(retval, paramlen, ¶m);
|
||||
sctp_addto_chunk(retval, addr_param_len, &addr_param);
|
||||
@@ -3591,7 +3591,7 @@ static struct sctp_chunk *sctp_make_reconf(const struct sctp_association *asoc,
|
||||
*/
|
||||
struct sctp_chunk *sctp_make_strreset_req(
|
||||
const struct sctp_association *asoc,
|
||||
__u16 stream_num, __u16 *stream_list,
|
||||
__u16 stream_num, __be16 *stream_list,
|
||||
bool out, bool in)
|
||||
{
|
||||
struct sctp_strreset_outreq outreq;
|
||||
@@ -3788,7 +3788,8 @@ bool sctp_verify_reconf(const struct sctp_association *asoc,
|
||||
{
|
||||
struct sctp_reconf_chunk *hdr;
|
||||
union sctp_params param;
|
||||
__u16 last = 0, cnt = 0;
|
||||
__be16 last = 0;
|
||||
__u16 cnt = 0;
|
||||
|
||||
hdr = (struct sctp_reconf_chunk *)chunk->chunk_hdr;
|
||||
sctp_walk_params(param, hdr, params) {
|
||||
|
@@ -1629,12 +1629,12 @@ static int sctp_cmd_interpreter(enum sctp_event event_type,
|
||||
break;
|
||||
|
||||
case SCTP_CMD_INIT_FAILED:
|
||||
sctp_cmd_init_failed(commands, asoc, cmd->obj.err);
|
||||
sctp_cmd_init_failed(commands, asoc, cmd->obj.u32);
|
||||
break;
|
||||
|
||||
case SCTP_CMD_ASSOC_FAILED:
|
||||
sctp_cmd_assoc_failed(commands, asoc, event_type,
|
||||
subtype, chunk, cmd->obj.err);
|
||||
subtype, chunk, cmd->obj.u32);
|
||||
break;
|
||||
|
||||
case SCTP_CMD_INIT_COUNTER_INC:
|
||||
@@ -1702,8 +1702,8 @@ static int sctp_cmd_interpreter(enum sctp_event event_type,
|
||||
case SCTP_CMD_PROCESS_CTSN:
|
||||
/* Dummy up a SACK for processing. */
|
||||
sackh.cum_tsn_ack = cmd->obj.be32;
|
||||
sackh.a_rwnd = asoc->peer.rwnd +
|
||||
asoc->outqueue.outstanding_bytes;
|
||||
sackh.a_rwnd = htonl(asoc->peer.rwnd +
|
||||
asoc->outqueue.outstanding_bytes);
|
||||
sackh.num_gap_ack_blocks = 0;
|
||||
sackh.num_dup_tsns = 0;
|
||||
chunk->subh.sack_hdr = &sackh;
|
||||
|
@@ -171,6 +171,36 @@ static inline void sctp_set_owner_w(struct sctp_chunk *chunk)
|
||||
sk_mem_charge(sk, chunk->skb->truesize);
|
||||
}
|
||||
|
||||
static void sctp_clear_owner_w(struct sctp_chunk *chunk)
|
||||
{
|
||||
skb_orphan(chunk->skb);
|
||||
}
|
||||
|
||||
static void sctp_for_each_tx_datachunk(struct sctp_association *asoc,
|
||||
void (*cb)(struct sctp_chunk *))
|
||||
|
||||
{
|
||||
struct sctp_outq *q = &asoc->outqueue;
|
||||
struct sctp_transport *t;
|
||||
struct sctp_chunk *chunk;
|
||||
|
||||
list_for_each_entry(t, &asoc->peer.transport_addr_list, transports)
|
||||
list_for_each_entry(chunk, &t->transmitted, transmitted_list)
|
||||
cb(chunk);
|
||||
|
||||
list_for_each_entry(chunk, &q->retransmit, list)
|
||||
cb(chunk);
|
||||
|
||||
list_for_each_entry(chunk, &q->sacked, list)
|
||||
cb(chunk);
|
||||
|
||||
list_for_each_entry(chunk, &q->abandoned, list)
|
||||
cb(chunk);
|
||||
|
||||
list_for_each_entry(chunk, &q->out_chunk_list, list)
|
||||
cb(chunk);
|
||||
}
|
||||
|
||||
/* Verify that this is a valid address. */
|
||||
static inline int sctp_verify_addr(struct sock *sk, union sctp_addr *addr,
|
||||
int len)
|
||||
@@ -8379,7 +8409,9 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
|
||||
* paths won't try to lock it and then oldsk.
|
||||
*/
|
||||
lock_sock_nested(newsk, SINGLE_DEPTH_NESTING);
|
||||
sctp_for_each_tx_datachunk(assoc, sctp_clear_owner_w);
|
||||
sctp_assoc_migrate(assoc, newsk);
|
||||
sctp_for_each_tx_datachunk(assoc, sctp_set_owner_w);
|
||||
|
||||
/* If the association on the newsk is already closed before accept()
|
||||
* is called, set RCV_SHUTDOWN flag.
|
||||
|
@@ -261,6 +261,7 @@ int sctp_send_reset_streams(struct sctp_association *asoc,
|
||||
__u16 i, str_nums, *str_list;
|
||||
struct sctp_chunk *chunk;
|
||||
int retval = -EINVAL;
|
||||
__be16 *nstr_list;
|
||||
bool out, in;
|
||||
|
||||
if (!asoc->peer.reconf_capable ||
|
||||
@@ -291,13 +292,18 @@ int sctp_send_reset_streams(struct sctp_association *asoc,
|
||||
if (str_list[i] >= stream->incnt)
|
||||
goto out;
|
||||
|
||||
for (i = 0; i < str_nums; i++)
|
||||
str_list[i] = htons(str_list[i]);
|
||||
|
||||
chunk = sctp_make_strreset_req(asoc, str_nums, str_list, out, in);
|
||||
nstr_list = kcalloc(str_nums, sizeof(__be16), GFP_KERNEL);
|
||||
if (!nstr_list) {
|
||||
retval = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (i = 0; i < str_nums; i++)
|
||||
str_list[i] = ntohs(str_list[i]);
|
||||
nstr_list[i] = htons(str_list[i]);
|
||||
|
||||
chunk = sctp_make_strreset_req(asoc, str_nums, nstr_list, out, in);
|
||||
|
||||
kfree(nstr_list);
|
||||
|
||||
if (!chunk) {
|
||||
retval = -ENOMEM;
|
||||
@@ -442,7 +448,7 @@ out:
|
||||
}
|
||||
|
||||
static struct sctp_paramhdr *sctp_chunk_lookup_strreset_param(
|
||||
struct sctp_association *asoc, __u32 resp_seq,
|
||||
struct sctp_association *asoc, __be32 resp_seq,
|
||||
__be16 type)
|
||||
{
|
||||
struct sctp_chunk *chunk = asoc->strreset_chunk;
|
||||
@@ -482,8 +488,9 @@ struct sctp_chunk *sctp_process_strreset_outreq(
|
||||
{
|
||||
struct sctp_strreset_outreq *outreq = param.v;
|
||||
struct sctp_stream *stream = &asoc->stream;
|
||||
__u16 i, nums, flags = 0, *str_p = NULL;
|
||||
__u32 result = SCTP_STRRESET_DENIED;
|
||||
__u16 i, nums, flags = 0;
|
||||
__be16 *str_p = NULL;
|
||||
__u32 request_seq;
|
||||
|
||||
request_seq = ntohl(outreq->request_seq);
|
||||
@@ -576,8 +583,9 @@ struct sctp_chunk *sctp_process_strreset_inreq(
|
||||
struct sctp_stream *stream = &asoc->stream;
|
||||
__u32 result = SCTP_STRRESET_DENIED;
|
||||
struct sctp_chunk *chunk = NULL;
|
||||
__u16 i, nums, *str_p;
|
||||
__u32 request_seq;
|
||||
__u16 i, nums;
|
||||
__be16 *str_p;
|
||||
|
||||
request_seq = ntohl(inreq->request_seq);
|
||||
if (TSN_lt(asoc->strreset_inseq, request_seq) ||
|
||||
@@ -897,7 +905,7 @@ struct sctp_chunk *sctp_process_strreset_resp(
|
||||
|
||||
if (req->type == SCTP_PARAM_RESET_OUT_REQUEST) {
|
||||
struct sctp_strreset_outreq *outreq;
|
||||
__u16 *str_p;
|
||||
__be16 *str_p;
|
||||
|
||||
outreq = (struct sctp_strreset_outreq *)req;
|
||||
str_p = outreq->list_of_streams;
|
||||
@@ -922,7 +930,7 @@ struct sctp_chunk *sctp_process_strreset_resp(
|
||||
nums, str_p, GFP_ATOMIC);
|
||||
} else if (req->type == SCTP_PARAM_RESET_IN_REQUEST) {
|
||||
struct sctp_strreset_inreq *inreq;
|
||||
__u16 *str_p;
|
||||
__be16 *str_p;
|
||||
|
||||
/* if the result is performed, it's impossible for inreq */
|
||||
if (result == SCTP_STRRESET_PERFORMED)
|
||||
|
@@ -847,7 +847,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_sender_dry_event(
|
||||
|
||||
struct sctp_ulpevent *sctp_ulpevent_make_stream_reset_event(
|
||||
const struct sctp_association *asoc, __u16 flags, __u16 stream_num,
|
||||
__u16 *stream_list, gfp_t gfp)
|
||||
__be16 *stream_list, gfp_t gfp)
|
||||
{
|
||||
struct sctp_stream_reset_event *sreset;
|
||||
struct sctp_ulpevent *event;
|
||||
|
Reference in New Issue
Block a user