Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=bf58a381e8106fe73247c753e3da58fcb5eabd2e
Commit:     bf58a381e8106fe73247c753e3da58fcb5eabd2e
Parent:     d63d8364cfe17fc9bb738f554f452595f76f21d2
Author:     Gerrit Renker <[EMAIL PROTECTED]>
AuthorDate: Sun Dec 10 00:04:43 2006 -0200
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Mon Dec 11 14:34:47 2006 -0800

    [DCCP]: Only deliver to the CCID rx side in charge
    
    This is an optimisation to reduce CPU load. The received feedback is now
    only directed to the active CCID component, without requiring processing
    also by the inactive one.
    
    As a consequence, a similar test in ccid3.c is now redundant and is
    also removed.
    
    Justification:
    
     Currently DCCP works as a unidirectional service, i.e. a listening server
     is not at the same time a connecting client.
     As far as I can see, several modifications are necessary until that
     becomes possible.
     At the present time, received feedback is both fed to the rx/tx CCID
     modules. In unidirectional service, only one of these is active at any
     one time.
    
    Signed-off-by: Gerrit Renker <[EMAIL PROTECTED]>
    Acked-by: Ian McDonald <[EMAIL PROTECTED]>
    Signed-off-by: Arnaldo Carvalho de Melo <[EMAIL PROTECTED]>
---
 net/dccp/ccids/ccid3.c |    6 +++---
 net/dccp/input.c       |   21 +++++++++++++++++----
 2 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index 820bc25..936704d 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -540,11 +540,11 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, 
struct sk_buff *skb)
                                   jiffies + usecs_to_jiffies(t_nfb));
 
                /* set idle flag */
-               hctx->ccid3hctx_idle = 1;   
+               hctx->ccid3hctx_idle = 1;
                break;
        case TFRC_SSTATE_NO_SENT:
-               if (dccp_sk(sk)->dccps_role == DCCP_ROLE_CLIENT)
-                       DCCP_WARN("Illegal ACK received - no packet sent\n");
+               /* XXX when implementing bidirectional rx/tx check this again */
+               DCCP_WARN("Illegal ACK received - no packet sent\n");
                /* fall through */
        case TFRC_SSTATE_TERM:          /* ignore feedback when closing */
                break;
diff --git a/net/dccp/input.c b/net/dccp/input.c
index 7371a2f..4a3279c 100644
--- a/net/dccp/input.c
+++ b/net/dccp/input.c
@@ -248,8 +248,18 @@ int dccp_rcv_established(struct sock *sk, struct sk_buff 
*skb,
                            DCCP_ACKVEC_STATE_RECEIVED))
                goto discard;
 
-       ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb);
-       ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb);
+       /*
+        * Deliver to the CCID module in charge.
+        * FIXME: Currently DCCP operates one-directional only, i.e. a listening
+        *        server is not at the same time a connecting client. There is
+        *        not much sense in delivering to both rx/tx sides at the moment
+        *        (only one is active at a time); when moving to bidirectional
+        *        service, this needs to be revised.
+        */
+       if (dccp_sk(sk)->dccps_role == DCCP_ROLE_SERVER)
+               ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb);
+       else
+               ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb);
 
        return __dccp_rcv_established(sk, skb, dh, len);
 discard:
@@ -484,8 +494,11 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff 
*skb,
                                    DCCP_ACKVEC_STATE_RECEIVED))
                        goto discard;
 
-               ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb);
-               ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb);
+               /* XXX see the comments in dccp_rcv_established about this */
+               if (dccp_sk(sk)->dccps_role == DCCP_ROLE_SERVER)
+                       ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb);
+               else
+                       ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb);
        }
 
        /*
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to