mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Three sets of overlapping changes. Nothing serious. Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
commit
b50afd203a
141 changed files with 899 additions and 605 deletions
|
|
@ -192,6 +192,11 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc,
|
|||
msg, msg->expires_at, jiffies);
|
||||
}
|
||||
|
||||
if (asoc->peer.prsctp_capable &&
|
||||
SCTP_PR_TTL_ENABLED(sinfo->sinfo_flags))
|
||||
msg->expires_at =
|
||||
jiffies + msecs_to_jiffies(sinfo->sinfo_timetolive);
|
||||
|
||||
/* This is the biggest possible DATA chunk that can fit into
|
||||
* the packet
|
||||
*/
|
||||
|
|
@ -349,7 +354,7 @@ errout:
|
|||
/* Check whether this message has expired. */
|
||||
int sctp_chunk_abandoned(struct sctp_chunk *chunk)
|
||||
{
|
||||
if (!chunk->asoc->prsctp_enable ||
|
||||
if (!chunk->asoc->peer.prsctp_capable ||
|
||||
!SCTP_PR_POLICY(chunk->sinfo.sinfo_flags)) {
|
||||
struct sctp_datamsg *msg = chunk->msg;
|
||||
|
||||
|
|
@ -363,14 +368,14 @@ int sctp_chunk_abandoned(struct sctp_chunk *chunk)
|
|||
}
|
||||
|
||||
if (SCTP_PR_TTL_ENABLED(chunk->sinfo.sinfo_flags) &&
|
||||
time_after(jiffies, chunk->prsctp_param)) {
|
||||
time_after(jiffies, chunk->msg->expires_at)) {
|
||||
if (chunk->sent_count)
|
||||
chunk->asoc->abandoned_sent[SCTP_PR_INDEX(TTL)]++;
|
||||
else
|
||||
chunk->asoc->abandoned_unsent[SCTP_PR_INDEX(TTL)]++;
|
||||
return 1;
|
||||
} else if (SCTP_PR_RTX_ENABLED(chunk->sinfo.sinfo_flags) &&
|
||||
chunk->sent_count > chunk->prsctp_param) {
|
||||
chunk->sent_count > chunk->sinfo.sinfo_timetolive) {
|
||||
chunk->asoc->abandoned_sent[SCTP_PR_INDEX(RTX)]++;
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -304,7 +304,7 @@ void sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk, gfp_t gfp)
|
|||
"illegal chunk");
|
||||
|
||||
sctp_outq_tail_data(q, chunk);
|
||||
if (chunk->asoc->prsctp_enable &&
|
||||
if (chunk->asoc->peer.prsctp_capable &&
|
||||
SCTP_PR_PRIO_ENABLED(chunk->sinfo.sinfo_flags))
|
||||
chunk->asoc->sent_cnt_removable++;
|
||||
if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED)
|
||||
|
|
@ -354,7 +354,7 @@ static int sctp_prsctp_prune_sent(struct sctp_association *asoc,
|
|||
|
||||
list_for_each_entry_safe(chk, temp, queue, transmitted_list) {
|
||||
if (!SCTP_PR_PRIO_ENABLED(chk->sinfo.sinfo_flags) ||
|
||||
chk->prsctp_param <= sinfo->sinfo_timetolive)
|
||||
chk->sinfo.sinfo_timetolive <= sinfo->sinfo_timetolive)
|
||||
continue;
|
||||
|
||||
list_del_init(&chk->transmitted_list);
|
||||
|
|
@ -389,7 +389,7 @@ static int sctp_prsctp_prune_unsent(struct sctp_association *asoc,
|
|||
|
||||
list_for_each_entry_safe(chk, temp, queue, list) {
|
||||
if (!SCTP_PR_PRIO_ENABLED(chk->sinfo.sinfo_flags) ||
|
||||
chk->prsctp_param <= sinfo->sinfo_timetolive)
|
||||
chk->sinfo.sinfo_timetolive <= sinfo->sinfo_timetolive)
|
||||
continue;
|
||||
|
||||
list_del_init(&chk->list);
|
||||
|
|
@ -413,7 +413,7 @@ void sctp_prsctp_prune(struct sctp_association *asoc,
|
|||
{
|
||||
struct sctp_transport *transport;
|
||||
|
||||
if (!asoc->prsctp_enable || !asoc->sent_cnt_removable)
|
||||
if (!asoc->peer.prsctp_capable || !asoc->sent_cnt_removable)
|
||||
return;
|
||||
|
||||
msg_len = sctp_prsctp_prune_sent(asoc, sinfo,
|
||||
|
|
@ -1026,7 +1026,7 @@ static void sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp)
|
|||
|
||||
/* Mark as failed send. */
|
||||
sctp_chunk_fail(chunk, SCTP_ERROR_INV_STRM);
|
||||
if (asoc->prsctp_enable &&
|
||||
if (asoc->peer.prsctp_capable &&
|
||||
SCTP_PR_PRIO_ENABLED(chunk->sinfo.sinfo_flags))
|
||||
asoc->sent_cnt_removable--;
|
||||
sctp_chunk_free(chunk);
|
||||
|
|
@ -1319,7 +1319,7 @@ int sctp_outq_sack(struct sctp_outq *q, struct sctp_chunk *chunk)
|
|||
tsn = ntohl(tchunk->subh.data_hdr->tsn);
|
||||
if (TSN_lte(tsn, ctsn)) {
|
||||
list_del_init(&tchunk->transmitted_list);
|
||||
if (asoc->prsctp_enable &&
|
||||
if (asoc->peer.prsctp_capable &&
|
||||
SCTP_PR_PRIO_ENABLED(chunk->sinfo.sinfo_flags))
|
||||
asoc->sent_cnt_removable--;
|
||||
sctp_chunk_free(tchunk);
|
||||
|
|
|
|||
|
|
@ -276,28 +276,17 @@ out:
|
|||
return err;
|
||||
}
|
||||
|
||||
static int sctp_tsp_dump(struct sctp_transport *tsp, void *p)
|
||||
static int sctp_sock_dump(struct sock *sk, void *p)
|
||||
{
|
||||
struct sctp_endpoint *ep = tsp->asoc->ep;
|
||||
struct sctp_endpoint *ep = sctp_sk(sk)->ep;
|
||||
struct sctp_comm_param *commp = p;
|
||||
struct sock *sk = ep->base.sk;
|
||||
struct sk_buff *skb = commp->skb;
|
||||
struct netlink_callback *cb = commp->cb;
|
||||
const struct inet_diag_req_v2 *r = commp->r;
|
||||
struct sctp_association *assoc =
|
||||
list_entry(ep->asocs.next, struct sctp_association, asocs);
|
||||
struct sctp_association *assoc;
|
||||
int err = 0;
|
||||
|
||||
/* find the ep only once through the transports by this condition */
|
||||
if (tsp->asoc != assoc)
|
||||
goto out;
|
||||
|
||||
if (r->sdiag_family != AF_UNSPEC && sk->sk_family != r->sdiag_family)
|
||||
goto out;
|
||||
|
||||
lock_sock(sk);
|
||||
if (sk != assoc->base.sk)
|
||||
goto release;
|
||||
list_for_each_entry(assoc, &ep->asocs, asocs) {
|
||||
if (cb->args[4] < cb->args[1])
|
||||
goto next;
|
||||
|
|
@ -317,7 +306,7 @@ static int sctp_tsp_dump(struct sctp_transport *tsp, void *p)
|
|||
NLM_F_MULTI, cb->nlh,
|
||||
commp->net_admin) < 0) {
|
||||
cb->args[3] = 1;
|
||||
err = 2;
|
||||
err = 1;
|
||||
goto release;
|
||||
}
|
||||
cb->args[3] = 1;
|
||||
|
|
@ -327,7 +316,7 @@ static int sctp_tsp_dump(struct sctp_transport *tsp, void *p)
|
|||
NETLINK_CB(cb->skb).portid,
|
||||
cb->nlh->nlmsg_seq, 0, cb->nlh,
|
||||
commp->net_admin) < 0) {
|
||||
err = 2;
|
||||
err = 1;
|
||||
goto release;
|
||||
}
|
||||
next:
|
||||
|
|
@ -339,10 +328,35 @@ next:
|
|||
cb->args[4] = 0;
|
||||
release:
|
||||
release_sock(sk);
|
||||
sock_put(sk);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int sctp_get_sock(struct sctp_transport *tsp, void *p)
|
||||
{
|
||||
struct sctp_endpoint *ep = tsp->asoc->ep;
|
||||
struct sctp_comm_param *commp = p;
|
||||
struct sock *sk = ep->base.sk;
|
||||
struct netlink_callback *cb = commp->cb;
|
||||
const struct inet_diag_req_v2 *r = commp->r;
|
||||
struct sctp_association *assoc =
|
||||
list_entry(ep->asocs.next, struct sctp_association, asocs);
|
||||
|
||||
/* find the ep only once through the transports by this condition */
|
||||
if (tsp->asoc != assoc)
|
||||
goto out;
|
||||
|
||||
if (r->sdiag_family != AF_UNSPEC && sk->sk_family != r->sdiag_family)
|
||||
goto out;
|
||||
|
||||
sock_hold(sk);
|
||||
cb->args[5] = (long)sk;
|
||||
|
||||
return 1;
|
||||
|
||||
out:
|
||||
cb->args[2]++;
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sctp_ep_dump(struct sctp_endpoint *ep, void *p)
|
||||
|
|
@ -480,10 +494,18 @@ skip:
|
|||
* 2 : to record the transport pos of this time's traversal
|
||||
* 3 : to mark if we have dumped the ep info of the current asoc
|
||||
* 4 : to work as a temporary variable to traversal list
|
||||
* 5 : to save the sk we get from travelsing the tsp list.
|
||||
*/
|
||||
if (!(idiag_states & ~(TCPF_LISTEN | TCPF_CLOSE)))
|
||||
goto done;
|
||||
sctp_for_each_transport(sctp_tsp_dump, net, cb->args[2], &commp);
|
||||
|
||||
next:
|
||||
cb->args[5] = 0;
|
||||
sctp_for_each_transport(sctp_get_sock, net, cb->args[2], &commp);
|
||||
|
||||
if (cb->args[5] && !sctp_sock_dump((struct sock *)cb->args[5], &commp))
|
||||
goto next;
|
||||
|
||||
done:
|
||||
cb->args[1] = cb->args[4];
|
||||
cb->args[4] = 0;
|
||||
|
|
|
|||
|
|
@ -706,20 +706,6 @@ nodata:
|
|||
return retval;
|
||||
}
|
||||
|
||||
static void sctp_set_prsctp_policy(struct sctp_chunk *chunk,
|
||||
const struct sctp_sndrcvinfo *sinfo)
|
||||
{
|
||||
if (!chunk->asoc->prsctp_enable)
|
||||
return;
|
||||
|
||||
if (SCTP_PR_TTL_ENABLED(sinfo->sinfo_flags))
|
||||
chunk->prsctp_param =
|
||||
jiffies + msecs_to_jiffies(sinfo->sinfo_timetolive);
|
||||
else if (SCTP_PR_RTX_ENABLED(sinfo->sinfo_flags) ||
|
||||
SCTP_PR_PRIO_ENABLED(sinfo->sinfo_flags))
|
||||
chunk->prsctp_param = sinfo->sinfo_timetolive;
|
||||
}
|
||||
|
||||
/* Make a DATA chunk for the given association from the provided
|
||||
* parameters. However, do not populate the data payload.
|
||||
*/
|
||||
|
|
@ -753,7 +739,6 @@ struct sctp_chunk *sctp_make_datafrag_empty(struct sctp_association *asoc,
|
|||
|
||||
retval->subh.data_hdr = sctp_addto_chunk(retval, sizeof(dp), &dp);
|
||||
memcpy(&retval->sinfo, sinfo, sizeof(struct sctp_sndrcvinfo));
|
||||
sctp_set_prsctp_policy(retval, sinfo);
|
||||
|
||||
nodata:
|
||||
return retval;
|
||||
|
|
|
|||
|
|
@ -4473,17 +4473,21 @@ int sctp_transport_lookup_process(int (*cb)(struct sctp_transport *, void *),
|
|||
const union sctp_addr *paddr, void *p)
|
||||
{
|
||||
struct sctp_transport *transport;
|
||||
int err = 0;
|
||||
int err = -ENOENT;
|
||||
|
||||
rcu_read_lock();
|
||||
transport = sctp_addrs_lookup_transport(net, laddr, paddr);
|
||||
if (!transport || !sctp_transport_hold(transport))
|
||||
goto out;
|
||||
err = cb(transport, p);
|
||||
|
||||
sctp_association_hold(transport->asoc);
|
||||
sctp_transport_put(transport);
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
err = cb(transport, p);
|
||||
sctp_association_put(transport->asoc);
|
||||
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sctp_transport_lookup_process);
|
||||
|
|
|
|||
Loading…
Reference in a new issue