diff options
author | Gerrit Renker <gerrit@erg.abdn.ac.uk> | 2010-11-14 11:26:13 -0500 |
---|---|---|
committer | Gerrit Renker <gerrit@erg.abdn.ac.uk> | 2010-11-15 01:12:01 -0500 |
commit | 7e87fe84303cc54ecf3c7b688cb08ca24322a41d (patch) | |
tree | df764cbfefe19e628e92a8353d331d91c33212b6 /net/dccp/options.c | |
parent | 52394eecec4e6fa677a61af26f0bd35de665344e (diff) |
dccp ccid-2: Separate option parsing from CCID processing
This patch replaces an almost identical replication of code: large parts
of dccp_parse_options() re-appeared as ccid2_ackvector() in ccid2.c.
Apart from the duplication, this caused two more problems:
1. CCIDs should not need to be concerned with parsing header options;
2. one can not assume that Ack Vectors appear as a contiguous area within an
skb, it is legal to insert other options and/or padding in between. The
current code would throw an error and stop reading in such a case.
Since Ack Vectors provide CCID-specific information, they are now processed
by the CCID directly, separating this functionality from the main DCCP code.
Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Diffstat (limited to 'net/dccp/options.c')
-rw-r--r-- | net/dccp/options.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/net/dccp/options.c b/net/dccp/options.c index dabd6ee34d45..f06ffcfc8d71 100644 --- a/net/dccp/options.c +++ b/net/dccp/options.c | |||
@@ -128,13 +128,6 @@ int dccp_parse_options(struct sock *sk, struct dccp_request_sock *dreq, | |||
128 | if (rc) | 128 | if (rc) |
129 | goto out_featneg_failed; | 129 | goto out_featneg_failed; |
130 | break; | 130 | break; |
131 | case DCCPO_ACK_VECTOR_0: | ||
132 | case DCCPO_ACK_VECTOR_1: | ||
133 | if (dccp_packet_without_ack(skb)) /* RFC 4340, 11.4 */ | ||
134 | break; | ||
135 | dccp_pr_debug("%s Ack Vector (len=%u)\n", dccp_role(sk), | ||
136 | len); | ||
137 | break; | ||
138 | case DCCPO_TIMESTAMP: | 131 | case DCCPO_TIMESTAMP: |
139 | if (len != 4) | 132 | if (len != 4) |
140 | goto out_invalid_option; | 133 | goto out_invalid_option; |
@@ -224,6 +217,16 @@ int dccp_parse_options(struct sock *sk, struct dccp_request_sock *dreq, | |||
224 | pkt_type, opt, value, len)) | 217 | pkt_type, opt, value, len)) |
225 | goto out_invalid_option; | 218 | goto out_invalid_option; |
226 | break; | 219 | break; |
220 | case DCCPO_ACK_VECTOR_0: | ||
221 | case DCCPO_ACK_VECTOR_1: | ||
222 | if (dccp_packet_without_ack(skb)) /* RFC 4340, 11.4 */ | ||
223 | break; | ||
224 | /* | ||
225 | * Ack vectors are processed by the TX CCID if it is | ||
226 | * interested. The RX CCID need not parse Ack Vectors, | ||
227 | * since it is only interested in clearing old state. | ||
228 | * Fall through. | ||
229 | */ | ||
227 | case DCCPO_MIN_TX_CCID_SPECIFIC ... DCCPO_MAX_TX_CCID_SPECIFIC: | 230 | case DCCPO_MIN_TX_CCID_SPECIFIC ... DCCPO_MAX_TX_CCID_SPECIFIC: |
228 | if (ccid_hc_tx_parse_options(dp->dccps_hc_tx_ccid, sk, | 231 | if (ccid_hc_tx_parse_options(dp->dccps_hc_tx_ccid, sk, |
229 | pkt_type, opt, value, len)) | 232 | pkt_type, opt, value, len)) |