Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18a41440 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

parents 02829f73 4f2d7680
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ struct xt_get_revision
/* For standard target */
#define XT_RETURN (-NF_REPEAT - 1)

#define XT_ALIGN(s) (((s) + (__alignof__(void *)-1)) & ~(__alignof__(void *)-1))
#define XT_ALIGN(s) (((s) + (__alignof__(u_int64_t)-1)) & ~(__alignof__(u_int64_t)-1))

/* Standard return verdict, or do jump. */
#define XT_STANDARD_TARGET ""
+2 −0
Original line number Diff line number Diff line
@@ -175,6 +175,8 @@ void sctp_icmp_frag_needed(struct sock *, struct sctp_association *,
void sctp_icmp_proto_unreachable(struct sock *sk,
				 struct sctp_association *asoc,
				 struct sctp_transport *t);
void sctp_backlog_migrate(struct sctp_association *assoc,
			  struct sock *oldsk, struct sock *newsk);

/*
 *  Section:  Macros, externs, and inlines
+51 −38
Original line number Diff line number Diff line
@@ -127,9 +127,9 @@ extern struct sctp_globals {
	 * RTO.Alpha		    - 1/8  (3 when converted to right shifts.)
	 * RTO.Beta		    - 1/4  (2 when converted to right shifts.)
	 */
	__u32 rto_initial;
	__u32 rto_min;
	__u32 rto_max;
	unsigned long rto_initial;
	unsigned long rto_min;
	unsigned long rto_max;

	/* Note: rto_alpha and rto_beta are really defined as inverse
	 * powers of two to facilitate integer operations.
@@ -140,12 +140,18 @@ extern struct sctp_globals {
	/* Max.Burst		    - 4 */
	int max_burst;

	/* Valid.Cookie.Life	    - 60  seconds  */
	int valid_cookie_life;

	/* Whether Cookie Preservative is enabled(1) or not(0) */
	int cookie_preserve_enable;

	/* Valid.Cookie.Life	    - 60  seconds  */
	unsigned long valid_cookie_life;

	/* Delayed SACK timeout  200ms default*/
	unsigned long sack_timeout;

	/* HB.interval		    - 30 seconds  */
	unsigned long hb_interval;

	/* Association.Max.Retrans  - 10 attempts
	 * Path.Max.Retrans	    - 5	 attempts (per destination address)
	 * Max.Init.Retransmits	    - 8	 attempts
@@ -168,12 +174,6 @@ extern struct sctp_globals {
	 */
	int rcvbuf_policy;

	/* Delayed SACK timeout  200ms default*/
	int sack_timeout;

	/* HB.interval		    - 30 seconds  */
	int hb_interval;

	/* The following variables are implementation specific.	 */

	/* Default initialization values to be applied to new associations. */
@@ -405,8 +405,9 @@ struct sctp_cookie {
/* The format of our cookie that we send to our peer. */
struct sctp_signed_cookie {
	__u8 signature[SCTP_SECRET_SIZE];
	__u32 __pad;		/* force sctp_cookie alignment to 64 bits */
	struct sctp_cookie c;
};
} __attribute__((packed));

/* This is another convenience type to allocate memory for address
 * params for the maximum size and pass such structures around
@@ -827,7 +828,7 @@ struct sctp_transport {
	__u32 rtt;		/* This is the most recent RTT.	 */

	/* RTO	       : The current retransmission timeout value.  */
	__u32 rto;
	unsigned long rto;

	/* RTTVAR      : The current RTT variation.  */
	__u32 rttvar;
@@ -877,22 +878,10 @@ struct sctp_transport {
	/* Heartbeat interval: The endpoint sends out a Heartbeat chunk to
	 * the destination address every heartbeat interval.
	 */
	__u32 hbinterval;

	/* This is the max_retrans value for the transport and will
	 * be initialized from the assocs value.  This can be changed
	 * using SCTP_SET_PEER_ADDR_PARAMS socket option.
	 */
	__u16 pathmaxrxt;

	/* PMTU	      : The current known path MTU.  */
	__u32 pathmtu;
	unsigned long hbinterval;

	/* SACK delay timeout */
	__u32 sackdelay;

	/* Flags controling Heartbeat, SACK delay, and Path MTU Discovery. */
	__u32 param_flags;
	unsigned long sackdelay;

	/* When was the last time (in jiffies) that we heard from this
	 * transport?  We use this to pick new active and retran paths.
@@ -904,6 +893,18 @@ struct sctp_transport {
	 */
	unsigned long last_time_ecne_reduced;

	/* This is the max_retrans value for the transport and will
	 * be initialized from the assocs value.  This can be changed
	 * using SCTP_SET_PEER_ADDR_PARAMS socket option.
	 */
	__u16 pathmaxrxt;

	/* PMTU	      : The current known path MTU.  */
	__u32 pathmtu;

	/* Flags controling Heartbeat, SACK delay, and Path MTU Discovery. */
	__u32 param_flags;

	/* The number of times INIT has been sent on this transport. */
	int init_sent_count;

@@ -1249,6 +1250,14 @@ struct sctp_endpoint {
	int last_key;
	int key_changed_at;

 	/* digest:  This is a digest of the sctp cookie.  This field is
 	 * 	    only used on the receive path when we try to validate
 	 * 	    that the cookie has not been tampered with.  We put
 	 * 	    this here so we pre-allocate this once and can re-use
 	 * 	    on every receive.
 	 */
 	__u8 digest[SCTP_SIGNATURE_SIZE];
 
	/* sendbuf acct. policy.	*/
	__u32 sndbuf_policy;

@@ -1499,9 +1508,9 @@ struct sctp_association {
	 * These values will be initialized by system defaults, but can
	 * be modified via the SCTP_RTOINFO socket option.
	 */
	__u32 rto_initial;
	__u32 rto_max;
	__u32 rto_min;
	unsigned long rto_initial;
	unsigned long rto_max;
	unsigned long rto_min;

	/* Maximum number of new data packets that can be sent in a burst.  */
	int max_burst;
@@ -1519,13 +1528,13 @@ struct sctp_association {
	__u16 init_retries;

	/* The largest timeout or RTO value to use in attempting an INIT */
	__u16 max_init_timeo;
	unsigned long max_init_timeo;

	/* Heartbeat interval: The endpoint sends out a Heartbeat chunk to
	 * the destination address every heartbeat interval. This value
	 * will be inherited by all new transports.
	 */
	__u32 hbinterval;
	unsigned long hbinterval;

	/* This is the max_retrans value for new transports in the
	 * association.
@@ -1537,13 +1546,14 @@ struct sctp_association {
	 */
	__u32 pathmtu;

	/* SACK delay timeout */
	__u32 sackdelay;

	/* Flags controling Heartbeat, SACK delay, and Path MTU Discovery. */
	__u32 param_flags;

	int timeouts[SCTP_NUM_TIMEOUT_TYPES];
	/* SACK delay timeout */
	unsigned long sackdelay;


	unsigned long timeouts[SCTP_NUM_TIMEOUT_TYPES];
	struct timer_list timers[SCTP_NUM_TIMEOUT_TYPES];

	/* Transport to which SHUTDOWN chunk was last sent.  */
@@ -1648,7 +1658,10 @@ struct sctp_association {
	/* How many duplicated TSNs have we seen?  */
	int numduptsns;

	/* Number of seconds of idle time before an association is closed.  */
	/* Number of seconds of idle time before an association is closed.
	 * In the association context, this is really used as a boolean
	 * since the real timeout is stored in the timeouts array
	 */
	__u32 autoclose;

	/* These are to support
+62 −13
Original line number Diff line number Diff line
@@ -257,20 +257,26 @@ int sctp_rcv(struct sk_buff *skb)
	 */
	sctp_bh_lock_sock(sk);

	/* It is possible that the association could have moved to a different
	 * socket if it is peeled off. If so, update the sk.
	 */ 
	if (sk != rcvr->sk) {
		sctp_bh_lock_sock(rcvr->sk);
		sctp_bh_unlock_sock(sk);
		sk = rcvr->sk;
	}

	if (sock_owned_by_user(sk))
		sk_add_backlog(sk, skb);
	else
		sctp_backlog_rcv(sk, skb);

	/* Release the sock and any reference counts we took in the
	 * lookup calls.
	/* Release the sock and the sock ref we took in the lookup calls.
	 * The asoc/ep ref will be released in sctp_backlog_rcv.
	 */
	sctp_bh_unlock_sock(sk);
	if (asoc)
		sctp_association_put(asoc);
	else
		sctp_endpoint_put(ep);
	sock_put(sk);

	return ret;

discard_it:
@@ -296,12 +302,50 @@ int sctp_rcv(struct sk_buff *skb)
int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb)
{
	struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk;
	struct sctp_inq *inqueue = &chunk->rcvr->inqueue;
 	struct sctp_inq *inqueue = NULL;
 	struct sctp_ep_common *rcvr = NULL;

 	rcvr = chunk->rcvr;

	BUG_TRAP(rcvr->sk == sk);

 	if (rcvr->dead) {
 		sctp_chunk_free(chunk);
 	} else {
 		inqueue = &chunk->rcvr->inqueue;
 		sctp_inq_push(inqueue, chunk);
 	}

	/* Release the asoc/ep ref we took in the lookup calls in sctp_rcv. */ 
 	if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type)
 		sctp_association_put(sctp_assoc(rcvr));
 	else
 		sctp_endpoint_put(sctp_ep(rcvr));
  
        return 0;
}

void sctp_backlog_migrate(struct sctp_association *assoc, 
			  struct sock *oldsk, struct sock *newsk)
{
	struct sk_buff *skb;
	struct sctp_chunk *chunk;

	skb = oldsk->sk_backlog.head;
	oldsk->sk_backlog.head = oldsk->sk_backlog.tail = NULL;
	while (skb != NULL) {
		struct sk_buff *next = skb->next;

		chunk = SCTP_INPUT_CB(skb)->chunk;
		skb->next = NULL;
		if (&assoc->base == chunk->rcvr)
			sk_add_backlog(newsk, skb);
		else
			sk_add_backlog(oldsk, skb);
		skb = next;
	}
}

/* Handle icmp frag needed error. */
void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc,
			   struct sctp_transport *t, __u32 pmtu)
@@ -544,10 +588,16 @@ int sctp_rcv_ootb(struct sk_buff *skb)
	sctp_errhdr_t *err;

	ch = (sctp_chunkhdr_t *) skb->data;
	ch_end = ((__u8 *) ch) + WORD_ROUND(ntohs(ch->length));

	/* Scan through all the chunks in the packet.  */
	while (ch_end > (__u8 *)ch && ch_end < skb->tail) {
	do {
		/* Break out if chunk length is less then minimal. */
		if (ntohs(ch->length) < sizeof(sctp_chunkhdr_t))
			break;

		ch_end = ((__u8 *)ch) + WORD_ROUND(ntohs(ch->length));
		if (ch_end > skb->tail)
			break;

		/* RFC 8.4, 2) If the OOTB packet contains an ABORT chunk, the
		 * receiver MUST silently discard the OOTB packet and take no
@@ -578,8 +628,7 @@ int sctp_rcv_ootb(struct sk_buff *skb)
		}

		ch = (sctp_chunkhdr_t *) ch_end;
	        ch_end = ((__u8 *) ch) + WORD_ROUND(ntohs(ch->length));
	}
	} while (ch_end < skb->tail);

	return 0;

+3 −1
Original line number Diff line number Diff line
@@ -73,8 +73,10 @@ void sctp_inq_free(struct sctp_inq *queue)
	/* If there is a packet which is currently being worked on,
	 * free it as well.
	 */
	if (queue->in_progress)
	if (queue->in_progress) {
		sctp_chunk_free(queue->in_progress);
		queue->in_progress = NULL;
	}

	if (queue->malloced) {
		/* Dump the master memory segment.  */
Loading