__skb_unlink(next_skb, next_skb->list); 
__skb_unlink(next_skb, &sk->sk_write_queue); 
static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int mss_now){	struct tcp_sock *tp = tcp_sk(sk);	struct sk_buff *next_skb = skb->next;	/* The first test we must make is that neither of these two	 * SKB's are still referenced by someone else.	 */	if (!skb_cloned(skb) && !skb_cloned(next_skb)) {		int skb_size = skb->len, next_skb_size = next_skb->len;		u16 flags = TCP_SKB_CB(skb)->flags;		/* Also punt if next skb has been SACK'd. */		if(TCP_SKB_CB(next_skb)->sacked & TCPCB_SACKED_ACKED)			return;		/* Next skb is out of window. */		if (after(TCP_SKB_CB(next_skb)->end_seq, tp->snd_una+tp->snd_wnd))			return;		/* Punt if not enough space exists in the first SKB for		 * the data in the second, or the total combined payload		 * would exceed the MSS.		 */		if ((next_skb_size > skb_tailroom(skb)) ||		    ((skb_size + next_skb_size) > mss_now))			return;		BUG_ON(tcp_skb_pcount(skb) != 1 ||		       tcp_skb_pcount(next_skb) != 1);		/* Ok.  We will be able to collapse the packet. */		__skb_unlink(next_skb, next_skb->list);		memcpy(skb_put(skb, next_skb_size), next_skb->data, next_skb_size);		if (next_skb->ip_summed == CHECKSUM_HW)			skb->ip_summed = CHECKSUM_HW;		if (skb->ip_summed != CHECKSUM_HW)			skb->csum = csum_block_add(skb->csum, next_skb->csum, skb_size);		/* Update sequence range on original skb. */		TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(next_skb)->end_seq;		/* Merge over control information. */		flags |= TCP_SKB_CB(next_skb)->flags; /* This moves PSH/FIN etc. over */		TCP_SKB_CB(skb)->flags = flags;		/* All done, get rid of second SKB and account for it so		 * packet counting does not break.		 */		TCP_SKB_CB(skb)->sacked |= TCP_SKB_CB(next_skb)->sacked&(TCPCB_EVER_RETRANS|TCPCB_AT_TAIL);		if (TCP_SKB_CB(next_skb)->sacked&TCPCB_SACKED_RETRANS)			tp->retrans_out -= tcp_skb_pcount(next_skb);		if (TCP_SKB_CB(next_skb)->sacked&TCPCB_LOST) {			tp->lost_out -= tcp_skb_pcount(next_skb);			tp->left_out -= tcp_skb_pcount(next_skb);		}		/* Reno case is special. Sigh... */		if (!tp->rx_opt.sack_ok && tp->sacked_out) {			tcp_dec_pcount_approx(&tp->sacked_out, next_skb);			tp->left_out -= tcp_skb_pcount(next_skb);		}		/* Not quite right: it can be > snd.fack, but		 * it is better to underestimate fackets.		 */		tcp_dec_pcount_approx(&tp->fackets_out, next_skb);		tcp_packets_out_dec(tp, next_skb);		sk_stream_free_skb(sk, next_skb);	}}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/8728b834b226ffcf2c94a58530090e292af2a7bf/tcp_output.c/clean/net/ipv4/tcp_output.c