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

Commit fa04a008 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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

* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
  [RXRPC] net/rxrpc/ar-connection.c: fix NULL dereference
  [TCP]: Fix logic breakage due to DSACK separation
  [TCP]: Congestion control API RTT sampling fix
parents d09c6b80 16c61add
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -261,6 +261,18 @@ static inline s64 ktime_to_ns(const ktime_t kt)

#endif

/**
 * ktime_equal - Compares two ktime_t variables to see if they are equal
 * @cmp1:	comparable1
 * @cmp2:	comparable2
 *
 * Compare two ktime_t variables, returns 1 if equal
 */
static inline int ktime_equal(const ktime_t cmp1, const ktime_t cmp2)
{
	return cmp1.tv64 == cmp2.tv64;
}

static inline s64 ktime_to_us(const ktime_t kt)
{
	struct timeval tv = ktime_to_timeval(kt);
+4 −0
Original line number Diff line number Diff line
@@ -1579,6 +1579,10 @@ static inline ktime_t net_timedelta(ktime_t t)
	return ktime_sub(ktime_get_real(), t);
}

static inline ktime_t net_invalid_timestamp(void)
{
	return ktime_set(0, 0);
}

extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len);
extern __sum16 __skb_checksum_complete(struct sk_buff *skb);
+3 −0
Original line number Diff line number Diff line
@@ -90,6 +90,9 @@ static void tcp_illinois_acked(struct sock *sk, u32 pkts_acked, ktime_t last)

	ca->acked = pkts_acked;

	if (ktime_equal(last, net_invalid_timestamp()))
		return;

	rtt = ktime_to_us(net_timedelta(last));

	/* ignore bogus values, this prevents wraparound in alpha math */
+10 −5
Original line number Diff line number Diff line
@@ -953,7 +953,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
	int prior_fackets;
	u32 lost_retrans = 0;
	int flag = 0;
	int dup_sack = 0;
	int found_dup_sack = 0;
	int cached_fack_count;
	int i;
	int first_sack_index;
@@ -964,20 +964,20 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_

	/* Check for D-SACK. */
	if (before(ntohl(sp[0].start_seq), TCP_SKB_CB(ack_skb)->ack_seq)) {
		dup_sack = 1;
		found_dup_sack = 1;
		tp->rx_opt.sack_ok |= 4;
		NET_INC_STATS_BH(LINUX_MIB_TCPDSACKRECV);
	} else if (num_sacks > 1 &&
			!after(ntohl(sp[0].end_seq), ntohl(sp[1].end_seq)) &&
			!before(ntohl(sp[0].start_seq), ntohl(sp[1].start_seq))) {
		dup_sack = 1;
		found_dup_sack = 1;
		tp->rx_opt.sack_ok |= 4;
		NET_INC_STATS_BH(LINUX_MIB_TCPDSACKOFORECV);
	}

	/* D-SACK for already forgotten data...
	 * Do dumb counting. */
	if (dup_sack &&
	if (found_dup_sack &&
			!after(ntohl(sp[0].end_seq), prior_snd_una) &&
			after(ntohl(sp[0].end_seq), tp->undo_marker))
		tp->undo_retrans--;
@@ -1058,6 +1058,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
		__u32 start_seq = ntohl(sp->start_seq);
		__u32 end_seq = ntohl(sp->end_seq);
		int fack_count;
		int dup_sack = (found_dup_sack && (i == first_sack_index));

		skb = cached_skb;
		fack_count = cached_fack_count;
@@ -2409,7 +2410,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
	int acked = 0;
	int prior_packets = tp->packets_out;
	__s32 seq_rtt = -1;
	ktime_t last_ackt = ktime_set(0,0);
	ktime_t last_ackt = net_invalid_timestamp();

	while ((skb = tcp_write_queue_head(sk)) &&
	       skb != tcp_send_head(sk)) {
@@ -2487,6 +2488,10 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
		tcp_ack_update_rtt(sk, acked, seq_rtt);
		tcp_ack_packets_out(sk);

		/* Is the ACK triggering packet unambiguous? */
		if (acked & FLAG_RETRANS_DATA_ACKED)
			last_ackt = net_invalid_timestamp();

		if (ca_ops->pkts_acked)
			ca_ops->pkts_acked(sk, pkts_acked, last_ackt);
	}
+2 −1
Original line number Diff line number Diff line
@@ -266,6 +266,7 @@ static void tcp_lp_pkts_acked(struct sock *sk, u32 num_acked, ktime_t last)
	struct tcp_sock *tp = tcp_sk(sk);
	struct lp *lp = inet_csk_ca(sk);

	if (!ktime_equal(last, net_invalid_timestamp()))
		tcp_lp_rtt_sample(sk,  ktime_to_us(net_timedelta(last)));

	/* calc inference */
Loading