aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerrit Renker <gerrit@erg.abdn.ac.uk>2006-12-09 21:04:43 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-12-11 17:34:47 -0500
commitbf58a381e8106fe73247c753e3da58fcb5eabd2e (patch)
tree4f0539a3d96930bddc5291b136f4fa08c1af8e77
parentd63d8364cfe17fc9bb738f554f452595f76f21d2 (diff)
[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 <gerrit@erg.abdn.ac.uk> Acked-by: Ian McDonald <ian.mcdonald@jandi.co.nz> Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
-rw-r--r--net/dccp/ccids/ccid3.c6
-rw-r--r--net/dccp/input.c21
2 files changed, 20 insertions, 7 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index 820bc25e14dc..936704d1b77e 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)
540 jiffies + usecs_to_jiffies(t_nfb)); 540 jiffies + usecs_to_jiffies(t_nfb));
541 541
542 /* set idle flag */ 542 /* set idle flag */
543 hctx->ccid3hctx_idle = 1; 543 hctx->ccid3hctx_idle = 1;
544 break; 544 break;
545 case TFRC_SSTATE_NO_SENT: 545 case TFRC_SSTATE_NO_SENT:
546 if (dccp_sk(sk)->dccps_role == DCCP_ROLE_CLIENT) 546 /* XXX when implementing bidirectional rx/tx check this again */
547 DCCP_WARN("Illegal ACK received - no packet sent\n"); 547 DCCP_WARN("Illegal ACK received - no packet sent\n");
548 /* fall through */ 548 /* fall through */
549 case TFRC_SSTATE_TERM: /* ignore feedback when closing */ 549 case TFRC_SSTATE_TERM: /* ignore feedback when closing */
550 break; 550 break;
diff --git a/net/dccp/input.c b/net/dccp/input.c
index 7371a2f3acf4..4a3279cd684c 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,
248 DCCP_ACKVEC_STATE_RECEIVED)) 248 DCCP_ACKVEC_STATE_RECEIVED))
249 goto discard; 249 goto discard;
250 250
251 ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb); 251 /*
252 ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb); 252 * Deliver to the CCID module in charge.
253 * FIXME: Currently DCCP operates one-directional only, i.e. a listening
254 * server is not at the same time a connecting client. There is
255 * not much sense in delivering to both rx/tx sides at the moment
256 * (only one is active at a time); when moving to bidirectional
257 * service, this needs to be revised.
258 */
259 if (dccp_sk(sk)->dccps_role == DCCP_ROLE_SERVER)
260 ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb);
261 else
262 ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb);
253 263
254 return __dccp_rcv_established(sk, skb, dh, len); 264 return __dccp_rcv_established(sk, skb, dh, len);
255discard: 265discard:
@@ -484,8 +494,11 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
484 DCCP_ACKVEC_STATE_RECEIVED)) 494 DCCP_ACKVEC_STATE_RECEIVED))
485 goto discard; 495 goto discard;
486 496
487 ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb); 497 /* XXX see the comments in dccp_rcv_established about this */
488 ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb); 498 if (dccp_sk(sk)->dccps_role == DCCP_ROLE_SERVER)
499 ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb);
500 else
501 ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb);
489 } 502 }
490 503
491 /* 504 /*