|  | @@ -122,6 +122,25 @@ struct ib_mad_agent ib_cm_agent[] __ib_mad_agent = {
 | 
		
	
		
			
			| 122 | 122 |  	},
 | 
		
	
		
			
			| 123 | 123 |  };
 | 
		
	
		
			
			| 124 | 124 |  
 | 
		
	
		
			
			|  | 125 | +/**
 | 
		
	
		
			
			|  | 126 | + * Convert connection rejection reason to return status code
 | 
		
	
		
			
			|  | 127 | + *
 | 
		
	
		
			
			|  | 128 | + * @v reason		Rejection reason (in network byte order)
 | 
		
	
		
			
			|  | 129 | + * @ret rc		Return status code
 | 
		
	
		
			
			|  | 130 | + */
 | 
		
	
		
			
			|  | 131 | +static int ib_cm_rejection_reason_to_rc ( uint16_t reason ) {
 | 
		
	
		
			
			|  | 132 | +	switch ( reason ) {
 | 
		
	
		
			
			|  | 133 | +	case htons ( IB_CM_REJECT_BAD_SERVICE_ID ) :
 | 
		
	
		
			
			|  | 134 | +		return -ENODEV;
 | 
		
	
		
			
			|  | 135 | +	case htons ( IB_CM_REJECT_STALE_CONN ) :
 | 
		
	
		
			
			|  | 136 | +		return -EALREADY;
 | 
		
	
		
			
			|  | 137 | +	case htons ( IB_CM_REJECT_CONSUMER ) :
 | 
		
	
		
			
			|  | 138 | +		return -ENOTTY;
 | 
		
	
		
			
			|  | 139 | +	default:
 | 
		
	
		
			
			|  | 140 | +		return -EPERM;
 | 
		
	
		
			
			|  | 141 | +	}
 | 
		
	
		
			
			|  | 142 | +}
 | 
		
	
		
			
			|  | 143 | +
 | 
		
	
		
			
			| 125 | 144 |  /**
 | 
		
	
		
			
			| 126 | 145 |   * Handle connection request transaction completion
 | 
		
	
		
			
			| 127 | 146 |   *
 | 
		
	
	
		
			
			|  | @@ -189,9 +208,12 @@ static void ib_cm_req_complete ( struct ib_device *ibdev,
 | 
		
	
		
			
			| 189 | 208 |  		/* Extract fields */
 | 
		
	
		
			
			| 190 | 209 |  		DBGC ( conn, "CM %p connection rejected (reason %d)\n",
 | 
		
	
		
			
			| 191 | 210 |  		       conn, ntohs ( connect_rej->reason ) );
 | 
		
	
		
			
			| 192 |  | -		private_data = &connect_rej->private_data;
 | 
		
	
		
			
			| 193 |  | -		private_data_len = sizeof ( connect_rej->private_data );
 | 
		
	
		
			
			| 194 |  | -		rc = -ENOTCONN;
 | 
		
	
		
			
			|  | 211 | +		/* Private data is valid only for a Consumer Reject */
 | 
		
	
		
			
			|  | 212 | +		if ( connect_rej->reason == htons ( IB_CM_REJECT_CONSUMER ) ) {
 | 
		
	
		
			
			|  | 213 | +			private_data = &connect_rej->private_data;
 | 
		
	
		
			
			|  | 214 | +			private_data_len = sizeof (connect_rej->private_data);
 | 
		
	
		
			
			|  | 215 | +		}
 | 
		
	
		
			
			|  | 216 | +		rc = ib_cm_rejection_reason_to_rc ( connect_rej->reason );
 | 
		
	
		
			
			| 195 | 217 |  		break;
 | 
		
	
		
			
			| 196 | 218 |  
 | 
		
	
		
			
			| 197 | 219 |  	default:
 |