|
@@ -603,22 +603,36 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|
|
/* Caller (dccp_v4_do_rcv) will send Reset */
|
|
|
dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
|
|
|
return 1;
|
|
|
+ } else if (sk->sk_state == DCCP_CLOSED) {
|
|
|
+ dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
|
|
|
+ return 1;
|
|
|
}
|
|
|
|
|
|
- if (sk->sk_state != DCCP_REQUESTING && sk->sk_state != DCCP_RESPOND) {
|
|
|
- if (dccp_check_seqno(sk, skb))
|
|
|
- goto discard;
|
|
|
-
|
|
|
- /*
|
|
|
- * Step 8: Process options and mark acknowledgeable
|
|
|
- */
|
|
|
- if (dccp_parse_options(sk, NULL, skb))
|
|
|
- return 1;
|
|
|
+ /* Step 6: Check sequence numbers (omitted in LISTEN/REQUEST state) */
|
|
|
+ if (sk->sk_state != DCCP_REQUESTING && dccp_check_seqno(sk, skb))
|
|
|
+ goto discard;
|
|
|
|
|
|
- dccp_handle_ackvec_processing(sk, skb);
|
|
|
- dccp_deliver_input_to_ccids(sk, skb);
|
|
|
+ /*
|
|
|
+ * Step 7: Check for unexpected packet types
|
|
|
+ * If (S.is_server and P.type == Response)
|
|
|
+ * or (S.is_client and P.type == Request)
|
|
|
+ * or (S.state == RESPOND and P.type == Data),
|
|
|
+ * Send Sync packet acknowledging P.seqno
|
|
|
+ * Drop packet and return
|
|
|
+ */
|
|
|
+ if ((dp->dccps_role != DCCP_ROLE_CLIENT &&
|
|
|
+ dh->dccph_type == DCCP_PKT_RESPONSE) ||
|
|
|
+ (dp->dccps_role == DCCP_ROLE_CLIENT &&
|
|
|
+ dh->dccph_type == DCCP_PKT_REQUEST) ||
|
|
|
+ (sk->sk_state == DCCP_RESPOND && dh->dccph_type == DCCP_PKT_DATA)) {
|
|
|
+ dccp_send_sync(sk, dcb->dccpd_seq, DCCP_PKT_SYNC);
|
|
|
+ goto discard;
|
|
|
}
|
|
|
|
|
|
+ /* Step 8: Process options */
|
|
|
+ if (dccp_parse_options(sk, NULL, skb))
|
|
|
+ return 1;
|
|
|
+
|
|
|
/*
|
|
|
* Step 9: Process Reset
|
|
|
* If P.type == Reset,
|
|
@@ -626,41 +640,21 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|
|
* S.state := TIMEWAIT
|
|
|
* Set TIMEWAIT timer
|
|
|
* Drop packet and return
|
|
|
- */
|
|
|
+ */
|
|
|
if (dh->dccph_type == DCCP_PKT_RESET) {
|
|
|
dccp_rcv_reset(sk, skb);
|
|
|
return 0;
|
|
|
- /*
|
|
|
- * Step 7: Check for unexpected packet types
|
|
|
- * If (S.is_server and P.type == Response)
|
|
|
- * or (S.is_client and P.type == Request)
|
|
|
- * or (S.state == RESPOND and P.type == Data),
|
|
|
- * Send Sync packet acknowledging P.seqno
|
|
|
- * Drop packet and return
|
|
|
- */
|
|
|
- } else if ((dp->dccps_role != DCCP_ROLE_CLIENT &&
|
|
|
- dh->dccph_type == DCCP_PKT_RESPONSE) ||
|
|
|
- (dp->dccps_role == DCCP_ROLE_CLIENT &&
|
|
|
- dh->dccph_type == DCCP_PKT_REQUEST) ||
|
|
|
- (sk->sk_state == DCCP_RESPOND &&
|
|
|
- dh->dccph_type == DCCP_PKT_DATA)) {
|
|
|
- dccp_send_sync(sk, dcb->dccpd_seq, DCCP_PKT_SYNC);
|
|
|
- goto discard;
|
|
|
- } else if (dh->dccph_type == DCCP_PKT_CLOSEREQ) {
|
|
|
+ } else if (dh->dccph_type == DCCP_PKT_CLOSEREQ) { /* Step 13 */
|
|
|
if (dccp_rcv_closereq(sk, skb))
|
|
|
return 0;
|
|
|
goto discard;
|
|
|
- } else if (dh->dccph_type == DCCP_PKT_CLOSE) {
|
|
|
+ } else if (dh->dccph_type == DCCP_PKT_CLOSE) { /* Step 14 */
|
|
|
if (dccp_rcv_close(sk, skb))
|
|
|
return 0;
|
|
|
goto discard;
|
|
|
}
|
|
|
|
|
|
switch (sk->sk_state) {
|
|
|
- case DCCP_CLOSED:
|
|
|
- dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
|
|
|
- return 1;
|
|
|
-
|
|
|
case DCCP_REQUESTING:
|
|
|
queued = dccp_rcv_request_sent_state_process(sk, skb, dh, len);
|
|
|
if (queued >= 0)
|
|
@@ -669,8 +663,12 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|
|
__kfree_skb(skb);
|
|
|
return 0;
|
|
|
|
|
|
- case DCCP_RESPOND:
|
|
|
case DCCP_PARTOPEN:
|
|
|
+ /* Step 8: if using Ack Vectors, mark packet acknowledgeable */
|
|
|
+ dccp_handle_ackvec_processing(sk, skb);
|
|
|
+ dccp_deliver_input_to_ccids(sk, skb);
|
|
|
+ /* fall through */
|
|
|
+ case DCCP_RESPOND:
|
|
|
queued = dccp_rcv_respond_partopen_state_process(sk, skb,
|
|
|
dh, len);
|
|
|
break;
|