[ofa-general] Re: [PATCH 1/2] opensm: Handle trap repress on trap 144 generation

Sasha Khapyorsky sashak at voltaire.com
Fri Mar 6 09:30:26 PST 2009


Hi Hal,

On 07:24 Thu 05 Mar     , Hal Rosenstock wrote:
> 
> Make trap generation sending be a transaction (expect a response)
> and handle incoming trap repress (notice attribute)

I don't see how this works. See below.

> ib_mad_is_response is now changed to better reflect responses
> (not just R bit in MAD header)
> 
> Signed-off-by: Hal Rosenstock <hal.rosenstock at gmail.com>

<snip...>

> @@ -3797,8 +3810,10 @@ static inline boolean_t OSM_API
>  ib_mad_is_response(IN const ib_mad_t * const p_mad)
>  {
>  	CL_ASSERT(p_mad);
> -	return ((p_mad->method & IB_MAD_METHOD_RESP_MASK) ==
> -		IB_MAD_METHOD_RESP_MASK);
> +	return (p_mad->method & IB_MAD_METHOD_RESP_MASK || 
> +		p_mad->method == IB_MAD_METHOD_TRAP_REPRESS ||
> +		(p_mad->mgmt_class == IB_MCLASS_BM &&
> +		 p_mad->attr_mod & IB_BM_ATTR_MOD_RESP));

Why to mix things? BR is not used anywhere in OpenSM.

>  }
>  
>  /*
> diff --git a/opensm/opensm/osm_req.c b/opensm/opensm/osm_req.c
> index 2e851b2..1a46e50 100644
> --- a/opensm/opensm/osm_req.c
> +++ b/opensm/opensm/osm_req.c
> @@ -246,6 +246,7 @@ int osm_send_trap144(osm_sm_t *sm, ib_net16_t local)
>  
>  	madw->mad_addr.dest_lid = pi->master_sm_base_lid;
>  	madw->mad_addr.addr_type.smi.source_lid = pi->base_lid;
> +	madw->resp_expected = TRUE;
>  	madw->fail_msg = CL_DISP_MSGID_NONE;
>  
>  	smp = osm_madw_get_smp_ptr(madw);
> diff --git a/opensm/opensm/osm_sm_mad_ctrl.c b/opensm/opensm/osm_sm_mad_ctrl.c
> index 267ec85..a9124fa 100644
> --- a/opensm/opensm/osm_sm_mad_ctrl.c
> +++ b/opensm/opensm/osm_sm_mad_ctrl.c
> @@ -2,6 +2,7 @@
>   * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
>   * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
>   * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
> + * Copyright (c) 2009 HNR Consulting. All rights reserved.
>   *
>   * This software is available to you under a choice of one of two
>   * licenses.  You may choose to be licensed under the terms of the GNU
> @@ -250,10 +251,12 @@ __osm_sm_mad_ctrl_process_get_resp(IN osm_sm_mad_ctrl_t * const p_ctrl,
>  	case IB_MAD_ATTR_P_KEY_TABLE:
>  		msg_id = OSM_MSG_MAD_PKEY;
>  		break;
> +	case IB_MAD_ATTR_NOTICE:
> +		msg_id = OSM_MSG_MAD_NOTICE;
> +		break;

This is GetResp processing, not TrapRepress. And here
osm_trap_rcv_process() is actually scheduled for execution.

>  
>  	case IB_MAD_ATTR_GUID_INFO:
>  	case IB_MAD_ATTR_CLASS_PORT_INFO:
> -	case IB_MAD_ATTR_NOTICE:
>  	case IB_MAD_ATTR_INFORM_INFO:
>  	default:
>  		cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown);
> @@ -537,6 +540,57 @@ Exit:
>   * SEE ALSO
>   *********/
>  
> +/****f* opensm: SM/__osm_sm_mad_ctrl_process_trap_repress
> + * NAME
> + * __osm_sm_mad_ctrl_process_trap_repress
> + *
> + * DESCRIPTION
> + * This function handles method TrapRepress() for received MADs.
> + *
> + * SYNOPSIS
> + */
> +static void
> +__osm_sm_mad_ctrl_process_trap_repress(IN osm_sm_mad_ctrl_t * const p_ctrl,
> +				       IN osm_madw_t * p_madw)
> +{
> +	ib_smp_t *p_smp;
> +
> +	OSM_LOG_ENTER(p_ctrl->p_log);
> +
> +	p_smp = osm_madw_get_smp_ptr(p_madw);
> +
> +	/*
> +	   Note that attr_id (like the rest of the MAD) is in
> +	   network byte order.
> +	 */
> +	switch (p_smp->attr_id) {
> +	case IB_MAD_ATTR_NOTICE:
> +		break;
> +
> +	default:
> +		cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown);
> +		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3105: "
> +			"Unsupported attribute = 0x%X\n",
> +			cl_ntoh16(p_smp->attr_id));
> +		osm_dump_dr_smp(p_ctrl->p_log, p_smp, OSM_LOG_ERROR);
> +		break;
> +	}
> +
> +	osm_mad_pool_put(p_ctrl->p_mad_pool, p_madw);
> +
> +	OSM_LOG_EXIT(p_ctrl->p_log);
> +}

And this function which should process TrapRepress method does nothing,
right?

> +
> +/*
> + * PARAMETERS
> + *
> + * RETURN VALUES
> + *
> + * NOTES
> + *
> + * SEE ALSO
> + *********/
> +
>  /****f* opensm: SM/__osm_sm_mad_ctrl_rcv_callback
>   * NAME
>   * __osm_sm_mad_ctrl_rcv_callback
> @@ -624,10 +678,14 @@ __osm_sm_mad_ctrl_rcv_callback(IN osm_madw_t * p_madw,

This (__osm_sm_mad_ctrl_rcv_callback()) function has above

	if (ib_smp_is_response(p_smp) ||
	    (p_smp->method == IB_MAD_METHOD_TRAP_REPRESS))

check. Following your ib_mad_is_response() modification it should be
simplified (probably in other places too).

Sasha

>  		__osm_sm_mad_ctrl_process_set(p_ctrl, p_madw);
>  		break;
>  
> +	case IB_MAD_METHOD_TRAP_REPRESS:
> +		CL_ASSERT(p_req_madw == NULL);
> +		__osm_sm_mad_ctrl_process_trap_repress(p_ctrl, p_madw);
> +		break;
> +
>  	case IB_MAD_METHOD_SEND:
>  	case IB_MAD_METHOD_REPORT:
>  	case IB_MAD_METHOD_REPORT_RESP:
> -	case IB_MAD_METHOD_TRAP_REPRESS:
>  	default:
>  		cl_atomic_inc(&p_ctrl->p_stats->qp0_mads_rcvd_unknown);
>  		OSM_LOG(p_ctrl->p_log, OSM_LOG_ERROR, "ERR 3112: "
> diff --git a/opensm/opensm/osm_trap_rcv.c b/opensm/opensm/osm_trap_rcv.c
> index a5491e1..8a52f1a 100644
> --- a/opensm/opensm/osm_trap_rcv.c
> +++ b/opensm/opensm/osm_trap_rcv.c
> @@ -2,6 +2,7 @@
>   * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
>   * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved.
>   * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
> + * Copyright (c) 2009 HNR Consulting. All rights reserved.
>   *
>   * This software is available to you under a choice of one of two
>   * licenses.  You may choose to be licensed under the terms of the GNU
> @@ -649,18 +650,34 @@ Exit:
>  }
>  
>  /**********************************************************************
> - CURRENTLY WE ARE NOT CREATING TRAPS - SO THIS CALL IN AN ERROR
>  **********************************************************************/
>  static void
>  trap_rcv_process_response(IN osm_sm_t * sm,
>  			  IN const osm_madw_t * const p_madw)
>  {
> +	uint8_t payload[sizeof(ib_mad_notice_attr_t)];
> +	ib_smp_t *p_smp;
> +	ib_mad_notice_attr_t *p_ntci = (ib_mad_notice_attr_t *) payload;
> +
> +	CL_ASSERT(p_madw);
> +
> +	if (!osm_log_is_active(sm->p_log, OSM_LOG_VERBOSE))
> +		return;
>  
>  	OSM_LOG_ENTER(sm->p_log);
>  
> -	OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3808: "
> -		"This function is not supported yet\n");
> +	if (p_madw->p_mad->mgmt_class != IB_MCLASS_SUBN_LID &&
> +	    p_madw->p_mad->mgmt_class != IB_MCLASS_SUBN_DIR)
> +		goto Exit;
>  
> +	p_smp = osm_madw_get_smp_ptr(p_madw);
> +
> +	memset(payload, 0, sizeof(payload));
> +	memcpy(payload, &p_smp->data, IB_SMP_DATA_SIZE);
> +
> +	osm_dump_notice(sm->p_log, p_ntci, OSM_LOG_VERBOSE);
> +
> +Exit:
>  	OSM_LOG_EXIT(sm->p_log);
>  }
>  



More information about the general mailing list