Commit 29869eaf authored by Ira Weiny's avatar Ira Weiny Committed by Doug Ledford

IB/mad: Create a generic helper for DR forwarding checks

IB and OPA SMPs share the same processing algorithm but have different header
formats and permissive LID detection.

Add a helper function which is generic to processing the DR forwarding checks which
can be used by both IB and OPA SMP code.

Use this function in the current IB function smi_check_forward_dr_smp.
Signed-off-by: default avatarIra Weiny <ira.weiny@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 86f0e67a
...@@ -234,21 +234,19 @@ enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, u8 node_type, ...@@ -234,21 +234,19 @@ enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, u8 node_type,
smp->dr_slid == IB_LID_PERMISSIVE); smp->dr_slid == IB_LID_PERMISSIVE);
} }
enum smi_forward_action smi_check_forward_dr_smp(struct ib_smp *smp) static enum smi_forward_action __smi_check_forward_dr_smp(u8 hop_ptr, u8 hop_cnt,
u8 direction,
bool dr_dlid_is_permissive,
bool dr_slid_is_permissive)
{ {
u8 hop_ptr, hop_cnt; if (!direction) {
hop_ptr = smp->hop_ptr;
hop_cnt = smp->hop_cnt;
if (!ib_get_smp_direction(smp)) {
/* C14-9:2 -- intermediate hop */ /* C14-9:2 -- intermediate hop */
if (hop_ptr && hop_ptr < hop_cnt) if (hop_ptr && hop_ptr < hop_cnt)
return IB_SMI_FORWARD; return IB_SMI_FORWARD;
/* C14-9:3 -- at the end of the DR segment of path */ /* C14-9:3 -- at the end of the DR segment of path */
if (hop_ptr == hop_cnt) if (hop_ptr == hop_cnt)
return (smp->dr_dlid == IB_LID_PERMISSIVE ? return (dr_dlid_is_permissive ?
IB_SMI_SEND : IB_SMI_LOCAL); IB_SMI_SEND : IB_SMI_LOCAL);
/* C14-9:4 -- hop_ptr = hop_cnt + 1 -> give to SMA/SM */ /* C14-9:4 -- hop_ptr = hop_cnt + 1 -> give to SMA/SM */
...@@ -261,10 +259,19 @@ enum smi_forward_action smi_check_forward_dr_smp(struct ib_smp *smp) ...@@ -261,10 +259,19 @@ enum smi_forward_action smi_check_forward_dr_smp(struct ib_smp *smp)
/* C14-13:3 -- at the end of the DR segment of path */ /* C14-13:3 -- at the end of the DR segment of path */
if (hop_ptr == 1) if (hop_ptr == 1)
return (smp->dr_slid != IB_LID_PERMISSIVE ? return (!dr_slid_is_permissive ?
IB_SMI_SEND : IB_SMI_LOCAL); IB_SMI_SEND : IB_SMI_LOCAL);
} }
return IB_SMI_LOCAL; return IB_SMI_LOCAL;
}
enum smi_forward_action smi_check_forward_dr_smp(struct ib_smp *smp)
{
return __smi_check_forward_dr_smp(smp->hop_ptr, smp->hop_cnt,
ib_get_smp_direction(smp),
smp->dr_dlid == IB_LID_PERMISSIVE,
smp->dr_slid == IB_LID_PERMISSIVE);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment