diff options
author | Gerrit Renker <gerrit@erg.abdn.ac.uk> | 2010-09-19 14:06:50 -0400 |
---|---|---|
committer | Gerrit Renker <gerrit@erg.abdn.ac.uk> | 2010-09-21 06:14:25 -0400 |
commit | 4874c131d79695e3d372042781a408a1a8a762d8 (patch) | |
tree | e3c6bf89f191b47e019f063d16c3e5d6c4fc0623 /net/dccp/ccids | |
parent | 462fb2af9788a82a534f8184abfde31574e1cfa0 (diff) |
dccp: Add packet type information to CCID-specific option parsing
This
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.
Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Diffstat (limited to 'net/dccp/ccids')
-rw-r--r-- | net/dccp/ccids/ccid3.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c index ce8059130070..be1b8baaf298 100644 --- a/net/dccp/ccids/ccid3.c +++ b/net/dccp/ccids/ccid3.c | |||
@@ -481,9 +481,8 @@ done_computing_x: | |||
481 | jiffies + usecs_to_jiffies(t_nfb)); | 481 | jiffies + usecs_to_jiffies(t_nfb)); |
482 | } | 482 | } |
483 | 483 | ||
484 | static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option, | 484 | static int ccid3_hc_tx_parse_options(struct sock *sk, u8 packet_type, |
485 | unsigned char len, u16 idx, | 485 | u8 option, u8 *optval, u8 optlen) |
486 | unsigned char *value) | ||
487 | { | 486 | { |
488 | struct ccid3_hc_tx_sock *hc = ccid3_hc_tx_sk(sk); | 487 | struct ccid3_hc_tx_sock *hc = ccid3_hc_tx_sk(sk); |
489 | struct ccid3_options_received *opt_recv = &hc->tx_options_received; | 488 | struct ccid3_options_received *opt_recv = &hc->tx_options_received; |
@@ -492,12 +491,15 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option, | |||
492 | switch (option) { | 491 | switch (option) { |
493 | case TFRC_OPT_RECEIVE_RATE: | 492 | case TFRC_OPT_RECEIVE_RATE: |
494 | case TFRC_OPT_LOSS_EVENT_RATE: | 493 | case TFRC_OPT_LOSS_EVENT_RATE: |
495 | if (unlikely(len != 4)) { | 494 | /* Must be ignored on Data packets, cf. RFC 4342 8.3 and 8.5 */ |
495 | if (packet_type == DCCP_PKT_DATA) | ||
496 | break; | ||
497 | if (unlikely(optlen != 4)) { | ||
496 | DCCP_WARN("%s(%p), invalid len %d for %u\n", | 498 | DCCP_WARN("%s(%p), invalid len %d for %u\n", |
497 | dccp_role(sk), sk, len, option); | 499 | dccp_role(sk), sk, optlen, option); |
498 | return -EINVAL; | 500 | return -EINVAL; |
499 | } | 501 | } |
500 | opt_val = ntohl(get_unaligned((__be32 *)value)); | 502 | opt_val = ntohl(get_unaligned((__be32 *)optval)); |
501 | 503 | ||
502 | if (option == TFRC_OPT_RECEIVE_RATE) { | 504 | if (option == TFRC_OPT_RECEIVE_RATE) { |
503 | opt_recv->ccid3or_receive_rate = opt_val; | 505 | opt_recv->ccid3or_receive_rate = opt_val; |