From: Ralph Campbell Date: Wed, 17 Oct 2007 20:07:17 +0000 (-0700) Subject: IB/core - Don't modify outgoing DR SMP if first part is LID routed X-Git-Tag: v4.1.12-92~319^2^2~6^2~8 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=855218b3f7c69ea9540a5159ebc0e19e6c37e51d;p=users%2Fjedix%2Flinux-maple.git IB/core - Don't modify outgoing DR SMP if first part is LID routed The code in handle_outgoing_dr_smp() checks to see if the directed route SMP has an initial LID routed part and correctly does not modify the hop pointer but it then proceeds to process the packet as if there was no initial LID routed part. Instead, if there is an initial LID routed part, the packet should just be sent on to the destination and not processed further since it can't be destined for the local SM/SMA. Signed-off-by: Ralph Campbell Signed-off-by: Vladimir Sokolovsky (Ported from Mellanox OFED 2.4) Signed-off-by: Mukesh Kacker --- diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c index 74c30f4c557e..4b759308ff3d 100644 --- a/drivers/infiniband/core/mad.c +++ b/drivers/infiniband/core/mad.c @@ -749,9 +749,10 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv, * If we are at the start of the LID routed part, don't update the * hop_ptr or hop_cnt. See section 14.2.2, Vol 1 IB spec. */ - if ((ib_get_smp_direction(smp) ? smp->dr_dlid : smp->dr_slid) == - IB_LID_PERMISSIVE && - smi_handle_dr_smp_send(smp, device->node_type, port_num) == + if ((ib_get_smp_direction(smp) ? smp->dr_dlid : smp->dr_slid) != + IB_LID_PERMISSIVE) + goto out; + if (smi_handle_dr_smp_send(smp, device->node_type, port_num) == IB_SMI_DISCARD) { ret = -EINVAL; dev_err(&device->dev, "Invalid directed route\n");