Import 2.1.15
[davej-history.git] / net / ipv4 / tcp_input.c
index 0765689..2a4e19d 100644 (file)
@@ -563,7+563,6 @@ static int tcp_clean_rtx_queue(struct sock *sk, __u32 ack, __u32 *seq,
                *seq_rtt = now - skb->when;
                                
                skb_unlink(skb);                
-               skb->free = 1;
                
                kfree_skb(skb, FREE_WRITE);
        }
@@ -1142,7+1141,8 @@ static void tcp_data_snd_check(struct sock *sk)
                         */
 
                        tcp_write_xmit(sk);
-                       wake_up_interruptible(sk->sleep);
+                       if(!sk->dead)
+                               sk->write_space(sk);
                }
                else if (sk->packets_out == 0 && !tp->pending)
                {
@@ -1278,8+1278,8 @@ static void prune_queue(struct sock *sk)
 }
 
 
-void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
-                        struct tcphdr *th, __u16 len)
+int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
+                       struct tcphdr *th, __u16 len)
 {
        struct tcp_opt *tp;
        int queued = 0;
@@ -1323,7+1323,7 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
                        tcp_data_snd_check(sk);
 
                        kfree_skb(skb, FREE_READ);
-                       return;
+                       return 0;
                        
                }
                else if (skb->ack_seq == tp->snd_una)
@@ -1348,7+1348,7 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
                        else
                                tcp_send_ack(sk);
 
-                       return;
+                       return 0;
                }
        }
 
@@ -1365,7+1365,7 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
                        }
                        tcp_send_ack(sk);
                        kfree_skb(skb, FREE_READ);
-                       return;
+                       return 0;
                }
        }
 
@@ -1374,14+1374,14 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
                printk(KERN_DEBUG "syn in established state\n");
                tcp_reset(sk, skb);
                kfree_skb(skb, FREE_READ);
-               return;
+               return 1;
        }
        
        if(th->rst)
        {
                tcp_reset(sk,skb);
                kfree_skb(skb, FREE_READ);
-               return;
+               return 0;
        }
        
        if(th->ack)
@@ -1426,10+1426,9 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
         *      And done
         */     
        
-       if (queued)
-               return;
-
-       kfree_skb(skb, FREE_READ);
+       if (!queued)
+               kfree_skb(skb, FREE_READ);
+       return 0;
 }
                
 
@@ -1559,12+1558,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                        tcp_set_state(sk, TCP_ESTABLISHED);
                        rcv_mss = tcp_parse_options(th);
                        
-                       if (rcv_mss == 0)
-                       {
-                               rcv_mss = 536;
-                       }
-
-                       sk->mss = min(sk->mss, rcv_mss);
+                       if (rcv_mss)
+                               sk->mss = min(sk->mss, rcv_mss);
                        
                        sk->dummy_th.dest = th->source;
                        sk->copied_seq = tp->rcv_nxt;
@@ -1625,8+1620,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                        __u32 isn;
                        int err;
 
-                        atomic_sub(skb->truesize, &sk->rmem_alloc);
-                        skb->sk = NULL;
+                       skb_orphan(skb);
                         sk->err = ECONNRESET;
                         tcp_set_state(sk, TCP_CLOSE);
                         sk->shutdown = SHUTDOWN_MASK;
@@ -1638,9+1632,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                        if (sk == NULL)
                                goto discard;
 
-                       skb->sk = sk;
+                       skb_set_owner_r(skb, sk);
                        tp = &sk->tp_pinfo.af_tcp;
-                       atomic_add(skb->truesize, &sk->rmem_alloc);
                        
                        err = tp->af_specific->conn_request(sk, skb, opt, isn);
 
close