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

+38 -7
+12
include/linux/ktime.h
··· 261 262 #endif 263 264 static inline s64 ktime_to_us(const ktime_t kt) 265 { 266 struct timeval tv = ktime_to_timeval(kt);
··· 261 262 #endif 263 264 + /** 265 + * ktime_equal - Compares two ktime_t variables to see if they are equal 266 + * @cmp1: comparable1 267 + * @cmp2: comparable2 268 + * 269 + * Compare two ktime_t variables, returns 1 if equal 270 + */ 271 + static inline int ktime_equal(const ktime_t cmp1, const ktime_t cmp2) 272 + { 273 + return cmp1.tv64 == cmp2.tv64; 274 + } 275 + 276 static inline s64 ktime_to_us(const ktime_t kt) 277 { 278 struct timeval tv = ktime_to_timeval(kt);
+4
include/linux/skbuff.h
··· 1579 return ktime_sub(ktime_get_real(), t); 1580 } 1581 1582 1583 extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len); 1584 extern __sum16 __skb_checksum_complete(struct sk_buff *skb);
··· 1579 return ktime_sub(ktime_get_real(), t); 1580 } 1581 1582 + static inline ktime_t net_invalid_timestamp(void) 1583 + { 1584 + return ktime_set(0, 0); 1585 + } 1586 1587 extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len); 1588 extern __sum16 __skb_checksum_complete(struct sk_buff *skb);
+3
net/ipv4/tcp_illinois.c
··· 90 91 ca->acked = pkts_acked; 92 93 rtt = ktime_to_us(net_timedelta(last)); 94 95 /* ignore bogus values, this prevents wraparound in alpha math */
··· 90 91 ca->acked = pkts_acked; 92 93 + if (ktime_equal(last, net_invalid_timestamp())) 94 + return; 95 + 96 rtt = ktime_to_us(net_timedelta(last)); 97 98 /* ignore bogus values, this prevents wraparound in alpha math */
+10 -5
net/ipv4/tcp_input.c
··· 953 int prior_fackets; 954 u32 lost_retrans = 0; 955 int flag = 0; 956 - int dup_sack = 0; 957 int cached_fack_count; 958 int i; 959 int first_sack_index; ··· 964 965 /* Check for D-SACK. */ 966 if (before(ntohl(sp[0].start_seq), TCP_SKB_CB(ack_skb)->ack_seq)) { 967 - dup_sack = 1; 968 tp->rx_opt.sack_ok |= 4; 969 NET_INC_STATS_BH(LINUX_MIB_TCPDSACKRECV); 970 } else if (num_sacks > 1 && 971 !after(ntohl(sp[0].end_seq), ntohl(sp[1].end_seq)) && 972 !before(ntohl(sp[0].start_seq), ntohl(sp[1].start_seq))) { 973 - dup_sack = 1; 974 tp->rx_opt.sack_ok |= 4; 975 NET_INC_STATS_BH(LINUX_MIB_TCPDSACKOFORECV); 976 } 977 978 /* D-SACK for already forgotten data... 979 * Do dumb counting. */ 980 - if (dup_sack && 981 !after(ntohl(sp[0].end_seq), prior_snd_una) && 982 after(ntohl(sp[0].end_seq), tp->undo_marker)) 983 tp->undo_retrans--; ··· 1058 __u32 start_seq = ntohl(sp->start_seq); 1059 __u32 end_seq = ntohl(sp->end_seq); 1060 int fack_count; 1061 1062 skb = cached_skb; 1063 fack_count = cached_fack_count; ··· 2410 int acked = 0; 2411 int prior_packets = tp->packets_out; 2412 __s32 seq_rtt = -1; 2413 - ktime_t last_ackt = ktime_set(0,0); 2414 2415 while ((skb = tcp_write_queue_head(sk)) && 2416 skb != tcp_send_head(sk)) { ··· 2487 2488 tcp_ack_update_rtt(sk, acked, seq_rtt); 2489 tcp_ack_packets_out(sk); 2490 2491 if (ca_ops->pkts_acked) 2492 ca_ops->pkts_acked(sk, pkts_acked, last_ackt);
··· 953 int prior_fackets; 954 u32 lost_retrans = 0; 955 int flag = 0; 956 + int found_dup_sack = 0; 957 int cached_fack_count; 958 int i; 959 int first_sack_index; ··· 964 965 /* Check for D-SACK. */ 966 if (before(ntohl(sp[0].start_seq), TCP_SKB_CB(ack_skb)->ack_seq)) { 967 + found_dup_sack = 1; 968 tp->rx_opt.sack_ok |= 4; 969 NET_INC_STATS_BH(LINUX_MIB_TCPDSACKRECV); 970 } else if (num_sacks > 1 && 971 !after(ntohl(sp[0].end_seq), ntohl(sp[1].end_seq)) && 972 !before(ntohl(sp[0].start_seq), ntohl(sp[1].start_seq))) { 973 + found_dup_sack = 1; 974 tp->rx_opt.sack_ok |= 4; 975 NET_INC_STATS_BH(LINUX_MIB_TCPDSACKOFORECV); 976 } 977 978 /* D-SACK for already forgotten data... 979 * Do dumb counting. */ 980 + if (found_dup_sack && 981 !after(ntohl(sp[0].end_seq), prior_snd_una) && 982 after(ntohl(sp[0].end_seq), tp->undo_marker)) 983 tp->undo_retrans--; ··· 1058 __u32 start_seq = ntohl(sp->start_seq); 1059 __u32 end_seq = ntohl(sp->end_seq); 1060 int fack_count; 1061 + int dup_sack = (found_dup_sack && (i == first_sack_index)); 1062 1063 skb = cached_skb; 1064 fack_count = cached_fack_count; ··· 2409 int acked = 0; 2410 int prior_packets = tp->packets_out; 2411 __s32 seq_rtt = -1; 2412 + ktime_t last_ackt = net_invalid_timestamp(); 2413 2414 while ((skb = tcp_write_queue_head(sk)) && 2415 skb != tcp_send_head(sk)) { ··· 2486 2487 tcp_ack_update_rtt(sk, acked, seq_rtt); 2488 tcp_ack_packets_out(sk); 2489 + 2490 + /* Is the ACK triggering packet unambiguous? */ 2491 + if (acked & FLAG_RETRANS_DATA_ACKED) 2492 + last_ackt = net_invalid_timestamp(); 2493 2494 if (ca_ops->pkts_acked) 2495 ca_ops->pkts_acked(sk, pkts_acked, last_ackt);
+2 -1
net/ipv4/tcp_lp.c
··· 266 struct tcp_sock *tp = tcp_sk(sk); 267 struct lp *lp = inet_csk_ca(sk); 268 269 - tcp_lp_rtt_sample(sk, ktime_to_us(net_timedelta(last))); 270 271 /* calc inference */ 272 if (tcp_time_stamp > tp->rx_opt.rcv_tsecr)
··· 266 struct tcp_sock *tp = tcp_sk(sk); 267 struct lp *lp = inet_csk_ca(sk); 268 269 + if (!ktime_equal(last, net_invalid_timestamp())) 270 + tcp_lp_rtt_sample(sk, ktime_to_us(net_timedelta(last))); 271 272 /* calc inference */ 273 if (tcp_time_stamp > tp->rx_opt.rcv_tsecr)
+3
net/ipv4/tcp_vegas.c
··· 117 struct vegas *vegas = inet_csk_ca(sk); 118 u32 vrtt; 119 120 /* Never allow zero rtt or baseRTT */ 121 vrtt = ktime_to_us(net_timedelta(last)) + 1; 122
··· 117 struct vegas *vegas = inet_csk_ca(sk); 118 u32 vrtt; 119 120 + if (ktime_equal(last, net_invalid_timestamp())) 121 + return; 122 + 123 /* Never allow zero rtt or baseRTT */ 124 vrtt = ktime_to_us(net_timedelta(last)) + 1; 125
+3
net/ipv4/tcp_veno.c
··· 74 struct veno *veno = inet_csk_ca(sk); 75 u32 vrtt; 76 77 /* Never allow zero rtt or baseRTT */ 78 vrtt = ktime_to_us(net_timedelta(last)) + 1; 79
··· 74 struct veno *veno = inet_csk_ca(sk); 75 u32 vrtt; 76 77 + if (ktime_equal(last, net_invalid_timestamp())) 78 + return; 79 + 80 /* Never allow zero rtt or baseRTT */ 81 vrtt = ktime_to_us(net_timedelta(last)) + 1; 82
+1 -1
net/rxrpc/ar-connection.c
··· 211 conn->header_size = sizeof(struct rxrpc_header); 212 } 213 214 - _leave(" = %p{%d}", conn, conn->debug_id); 215 return conn; 216 } 217
··· 211 conn->header_size = sizeof(struct rxrpc_header); 212 } 213 214 + _leave(" = %p{%d}", conn, conn ? conn->debug_id : 0); 215 return conn; 216 } 217