[ICSK]: Introduce inet_csk_clone
authorArnaldo Carvalho de Melo <acme@ghostprotocols.net>
Wed, 10 Aug 2005 03:11:24 +0000 (20:11 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Mon, 29 Aug 2005 22:49:20 +0000 (15:49 -0700)
Signed-off-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/inet_connection_sock.h
net/ipv4/inet_connection_sock.c
net/ipv4/tcp_minisocks.c

index 97e002001c1a60c12d7fa7a839eec050387db3c1..a50f4a4b7b4b60586ec2f641b6ef3f6f55e59cb3 100644 (file)
@@ -77,6 +77,10 @@ static inline struct inet_connection_sock *inet_csk(const struct sock *sk)
        return (struct inet_connection_sock *)sk;
 }
 
+extern struct sock *inet_csk_clone(struct sock *sk,
+                                  const struct request_sock *req,
+                                  const unsigned int __nocast priority);
+
 enum inet_csk_ack_state_t {
        ICSK_ACK_SCHED  = 1,
        ICSK_ACK_TIMER  = 2,
index 2712400a8bb8d587c707008559418df5c2390c9c..136ada050b63f219fc4301e4c1a8ba43fd812269 100644 (file)
@@ -399,3 +399,28 @@ void inet_csk_reqsk_queue_hash_add(struct sock *sk, struct request_sock *req,
 }
 
 EXPORT_SYMBOL_GPL(inet_csk_reqsk_queue_hash_add);
+
+struct sock *inet_csk_clone(struct sock *sk, const struct request_sock *req,
+                           const unsigned int __nocast priority)
+{
+       struct sock *newsk = sk_clone(sk, priority);
+
+       if (newsk != NULL) {
+               struct inet_connection_sock *newicsk = inet_csk(newsk);
+
+               newsk->sk_state = TCP_SYN_RECV;
+               newicsk->icsk_bind_hash = NULL;
+
+               inet_sk(newsk)->dport = inet_rsk(req)->rmt_port;
+               newsk->sk_write_space = sk_stream_write_space;
+
+               newicsk->icsk_retransmits = 0;
+               newicsk->icsk_backoff = 0;
+
+               /* Deinitialize accept_queue to trap illegal accesses. */
+               memset(&newicsk->icsk_accept_queue, 0, sizeof(newicsk->icsk_accept_queue));
+       }
+       return newsk;
+}
+
+EXPORT_SYMBOL_GPL(inet_csk_clone);
index 56823704eb7d2f3e4a9df357a3a2d0a51a6eec90..4cfbe1d1c92021742d3de85b7c77669852163fe1 100644 (file)
@@ -600,22 +600,14 @@ out:
  */
 struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req, struct sk_buff *skb)
 {
-       struct sock *newsk = sk_clone(sk, GFP_ATOMIC);
+       struct sock *newsk = inet_csk_clone(sk, req, GFP_ATOMIC);
 
        if (newsk != NULL) {
-               struct inet_request_sock *ireq = inet_rsk(req);
+               const struct inet_request_sock *ireq = inet_rsk(req);
                struct tcp_request_sock *treq = tcp_rsk(req);
-               struct inet_sock *newinet = inet_sk(newsk);
-               struct inet_connection_sock *newicsk = inet_csk(newsk);
+               struct inet_connection_sock *newicsk = inet_csk(sk);
                struct tcp_sock *newtp;
 
-               newsk->sk_state = TCP_SYN_RECV;
-               newicsk->icsk_bind_hash = NULL;
-
-               /* Clone the TCP header template */
-               newinet->dport = ireq->rmt_port;
-               newsk->sk_write_space = sk_stream_write_space;
-
                /* Now setup tcp_sock */
                newtp = tcp_sk(newsk);
                newtp->pred_flags = 0;
@@ -626,8 +618,6 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,
 
                tcp_init_wl(newtp, treq->snt_isn, treq->rcv_isn);
 
-               newicsk->icsk_retransmits = 0;
-               newicsk->icsk_backoff = 0;
                newtp->srtt = 0;
                newtp->mdev = TCP_TIMEOUT_INIT;
                newicsk->icsk_rto = TCP_TIMEOUT_INIT;
@@ -668,8 +658,6 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,
                newtp->probes_out = 0;
                newtp->rx_opt.num_sacks = 0;
                newtp->urg_data = 0;
-               /* Deinitialize accept_queue to trap illegal accesses. */
-               memset(&newicsk->icsk_accept_queue, 0, sizeof(newicsk->icsk_accept_queue));
 
                if (sock_flag(newsk, SOCK_KEEPOPEN))
                        inet_csk_reset_keepalive_timer(newsk,