Skip to content

Commit

Permalink
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Browse files Browse the repository at this point in the history
  • Loading branch information
Linus Torvalds committed Jan 20, 2006
2 parents 02829f7 + 4f2d768 commit 18a4144
Show file tree
Hide file tree
Showing 12 changed files with 156 additions and 85 deletions.
2 changes: 1 addition & 1 deletion include/linux/netfilter/x_tables.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 ""
Expand Down
2 changes: 2 additions & 0 deletions include/net/sctp/sctp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
89 changes: 51 additions & 38 deletions include/net/sctp/structs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand All @@ -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. */
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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.
Expand All @@ -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;

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand All @@ -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.
Expand All @@ -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. */
Expand Down Expand Up @@ -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
Expand Down
75 changes: 62 additions & 13 deletions net/sctp/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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;

sctp_inq_push(inqueue, chunk);
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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;

Expand Down
4 changes: 3 additions & 1 deletion net/sctp/inqueue.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
Loading

0 comments on commit 18a4144

Please sign in to comment.