aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp/options.c
diff options
context:
space:
mode:
authorGerrit Renker <gerrit@erg.abdn.ac.uk>2010-11-14 11:26:13 -0500
committerGerrit Renker <gerrit@erg.abdn.ac.uk>2010-11-15 01:12:01 -0500
commit7e87fe84303cc54ecf3c7b688cb08ca24322a41d (patch)
treedf764cbfefe19e628e92a8353d331d91c33212b6 /net/dccp/options.c
parent52394eecec4e6fa677a61af26f0bd35de665344e (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.c17
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))