diff options
Diffstat (limited to 'net/dccp/input.c')
| -rw-r--r-- | net/dccp/input.c | 61 | 
1 files changed, 30 insertions, 31 deletions
diff --git a/net/dccp/input.c b/net/dccp/input.c index 4222e7a654b..51d5fe5fffb 100644 --- a/net/dccp/input.c +++ b/net/dccp/input.c @@ -619,20 +619,31 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,  		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, @@ -640,31 +651,15 @@ 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; @@ -679,8 +674,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;  |