aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp/ccids
diff options
context:
space:
mode:
authorGerrit Renker <gerrit@erg.abdn.ac.uk>2008-09-04 01:30:19 -0400
committerGerrit Renker <gerrit@erg.abdn.ac.uk>2008-09-04 01:45:34 -0400
commit3306c781ff13aea89606435c134ec84e3c608681 (patch)
tree281cfebaf9504e4747938509efca0cc255b3372f /net/dccp/ccids
parent47a61e7b433a014296971ea1226eb1adb6310ab4 (diff)
dccp: Add packet type information to CCID-specific option parsing
This patch ... 1. adds packet type information to ccid_hc_{rx,tx}_parse_options(). This is necessary, since table 3 in RFC 4340, 5.8 leaves it to the CCIDs to state which options may (not) appear on what packet type. 2. adds such a check for CCID-3's {Loss Event, Receive} Rate as specified in RFC 4340 8.3 ("Receive Rate options MUST NOT be sent on DCCP-Data packets") and 8.5 ("Loss Event Rate options MUST NOT be sent on DCCP-Data packets"). 3. removes an unused argument `idx' from ccid_hc_{rx,tx}_parse_options(). This is also no longer necessary, since the CCID-specific option-parsing routines are passed every single parameter of the type-length-value option encoding. Also added documentation and made argument naming scheme consistent. Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Diffstat (limited to 'net/dccp/ccids')
-rw-r--r--net/dccp/ccids/ccid3.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index 12b601f11bfd..4c422fb2189f 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -483,9 +483,8 @@ done_computing_x:
483 jiffies + usecs_to_jiffies(t_nfb)); 483 jiffies + usecs_to_jiffies(t_nfb));
484} 484}
485 485
486static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option, 486static int ccid3_hc_tx_parse_options(struct sock *sk, u8 packet_type,
487 unsigned char len, u16 idx, 487 u8 option, u8 *optval, u8 optlen)
488 unsigned char *value)
489{ 488{
490 struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); 489 struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
491 struct ccid3_options_received *opt_recv = &hctx->options_received; 490 struct ccid3_options_received *opt_recv = &hctx->options_received;
@@ -494,12 +493,15 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
494 switch (option) { 493 switch (option) {
495 case TFRC_OPT_RECEIVE_RATE: 494 case TFRC_OPT_RECEIVE_RATE:
496 case TFRC_OPT_LOSS_EVENT_RATE: 495 case TFRC_OPT_LOSS_EVENT_RATE:
497 if (unlikely(len != 4)) { 496 /* Must be ignored on Data packets, cf. RFC 4342 8.3 and 8.5 */
497 if (packet_type == DCCP_PKT_DATA)
498 break;
499 if (unlikely(optlen != 4)) {
498 DCCP_WARN("%s(%p), invalid len %d for %u\n", 500 DCCP_WARN("%s(%p), invalid len %d for %u\n",
499 dccp_role(sk), sk, len, option); 501 dccp_role(sk), sk, optlen, option);
500 return -EINVAL; 502 return -EINVAL;
501 } 503 }
502 opt_val = ntohl(get_unaligned((__be32 *)value)); 504 opt_val = ntohl(get_unaligned((__be32 *)optval));
503 505
504 if (option == TFRC_OPT_RECEIVE_RATE) { 506 if (option == TFRC_OPT_RECEIVE_RATE) {
505 opt_recv->ccid3or_receive_rate = opt_val; 507 opt_recv->ccid3or_receive_rate = opt_val;