2005-04-17 02:20:36 +04:00
/*
* Copyright ( c ) 2004 Mellanox Technologies Ltd . All rights reserved .
* Copyright ( c ) 2004 Infinicon Corporation . All rights reserved .
* Copyright ( c ) 2004 Intel Corporation . All rights reserved .
* Copyright ( c ) 2004 Topspin Corporation . All rights reserved .
2007-04-02 19:24:07 +04:00
* Copyright ( c ) 2004 - 2007 Voltaire Corporation . All rights reserved .
2005-04-17 02:20:36 +04:00
*
* 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
* General Public License ( GPL ) Version 2 , available from the file
* COPYING in the main directory of this source tree , or the
* OpenIB . org BSD license below :
*
* Redistribution and use in source and binary forms , with or
* without modification , are permitted provided that the following
* conditions are met :
*
* - Redistributions of source code must retain the above
* copyright notice , this list of conditions and the following
* disclaimer .
*
* - Redistributions in binary form must reproduce the above
* copyright notice , this list of conditions and the following
* disclaimer in the documentation and / or other materials
* provided with the distribution .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND ,
* EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY , FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT . IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER IN AN
* ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE .
*
*/
# ifndef __SMI_H_
# define __SMI_H_
2005-10-25 21:51:39 +04:00
# include <rdma/ib_smi.h>
2007-04-02 19:24:07 +04:00
enum smi_action {
IB_SMI_DISCARD ,
IB_SMI_HANDLE
} ;
enum smi_forward_action {
IB_SMI_LOCAL , /* SMP should be completed up the stack */
IB_SMI_SEND , /* received DR SMP should be forwarded to the send queue */
2007-05-15 01:21:52 +04:00
IB_SMI_FORWARD /* SMP should be forwarded (for switches only) */
2007-04-02 19:24:07 +04:00
} ;
2015-06-29 16:57:00 +03:00
enum smi_action smi_handle_dr_smp_recv ( struct ib_smp * smp , bool is_switch ,
2007-04-02 19:24:07 +04:00
int port_num , int phys_port_cnt ) ;
2007-05-15 01:21:52 +04:00
int smi_get_fwd_port ( struct ib_smp * smp ) ;
2007-04-02 19:24:07 +04:00
extern enum smi_forward_action smi_check_forward_dr_smp ( struct ib_smp * smp ) ;
extern enum smi_action smi_handle_dr_smp_send ( struct ib_smp * smp ,
2015-06-29 16:57:00 +03:00
bool is_switch , int port_num ) ;
2005-04-17 02:20:36 +04:00
/*
2007-10-24 02:06:10 +04:00
* Return IB_SMI_HANDLE if the SMP should be handled by the local SMA / SM
* via process_mad
2005-04-17 02:20:36 +04:00
*/
2007-04-02 19:24:07 +04:00
static inline enum smi_action smi_check_local_smp ( struct ib_smp * smp ,
struct ib_device * device )
2005-04-17 02:20:36 +04:00
{
/* C14-9:3 -- We're at the end of the DR segment of path */
/* C14-9:4 -- Hop Pointer = Hop Count + 1 -> give to SMA/SM */
2006-02-04 01:32:01 +03:00
return ( ( device - > process_mad & &
2005-04-17 02:20:36 +04:00
! ib_get_smp_direction ( smp ) & &
2007-04-02 19:24:07 +04:00
( smp - > hop_ptr = = smp - > hop_cnt + 1 ) ) ?
IB_SMI_HANDLE : IB_SMI_DISCARD ) ;
2005-04-17 02:20:36 +04:00
}
2007-10-24 02:06:10 +04:00
/*
* Return IB_SMI_HANDLE if the SMP should be handled by the local SMA / SM
* via process_mad
*/
static inline enum smi_action smi_check_local_returning_smp ( struct ib_smp * smp ,
struct ib_device * device )
{
/* C14-13:3 -- We're at the end of the DR segment of path */
/* C14-13:4 -- Hop Pointer == 0 -> give to SM */
return ( ( device - > process_mad & &
ib_get_smp_direction ( smp ) & &
! smp - > hop_ptr ) ? IB_SMI_HANDLE : IB_SMI_DISCARD ) ;
}
2005-04-17 02:20:36 +04:00
# endif /* __SMI_H_ */