[openib-general] ib_smi: More changes for better code clarity

Hal Rosenstock halr at voltaire.com
Mon Oct 18 08:27:02 PDT 2004


ib_smi: More changes for better code clarity

Index: ib_smi.c
===================================================================
--- ib_smi.c	(revision 1012)
+++ ib_smi.c	(working copy)
@@ -126,7 +126,7 @@
 	{
 	case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE:
 		return smi_handle_dr_smp_send(mad_agent, smp, port_num);
-	default: 	/* LR SM or PerfMgmt classes */
+	default: 	/* LR SM class */
 		return 1;
 	}
 }
@@ -238,7 +238,7 @@
 	case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE:
 		return smi_handle_dr_smp_recv(mad_agent, smp,
 					      port_num, phys_port_cnt);
-	default:	/* LR SM or PerfMgmt classes */
+	default:	/* LR SM class */
 		return 1;
 	}
 }
@@ -290,7 +290,7 @@
 	{
 	case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE:
 		return smi_check_forward_dr_smp(mad_agent, smp);
-	default:	/* LR SM or PerfMgmt classes */
+	default:	/* LR SM class */
 		return 1;
 	}
 }
@@ -305,9 +305,9 @@
 					      slid, mad, mad_response);
 }
 
-void mad_send(struct ib_mad_agent *mad_agent,
-	      struct ib_mad *mad,
-	      struct ib_mad_recv_wc *mad_recv_wc)
+void agent_mad_send(struct ib_mad_agent *mad_agent,
+		    struct ib_mad *mad,
+		    struct ib_mad_recv_wc *mad_recv_wc)
 {
 	struct ib_agent_port_private *entry, *port_priv = NULL;
 	struct ib_agent_send_wr *agent_send_wr;
@@ -330,7 +330,7 @@
 	}
 	spin_unlock_irqrestore(&ib_agent_port_list_lock, flags);
 	if (!port_priv) {
-		printk(KERN_ERR SPFX "mad_send: no matching MAD agent 0x%x\n",
+		printk(KERN_ERR SPFX "agent_mad_send: no matching MAD agent 0x%x\n",
 		       (unsigned int)mad_agent);
 		return;
 	}
@@ -428,7 +428,7 @@
 				kfree(smp_response);
 				return 0;
 			}
-			mad_send(mad_agent, smp_response, mad_recv_wc);
+			agent_mad_send(mad_agent, smp_response, mad_recv_wc);
 		} else
 			kfree(smp_response);
 		return 1;
@@ -438,23 +438,59 @@
 	return 1;
 }
 
-int smi_recv_smp(struct ib_mad_agent *mad_agent,
-		 struct ib_smp *smp,
+int mad_response(struct ib_mad_agent *mad_agent,
+		 struct ib_mad *mad,
 		 struct ib_mad_recv_wc *mad_recv_wc,
-		 int phys_port_cnt)
+		 u16 slid)
 {
-	if (!smi_handle_smp_recv(mad_agent, smp,
-				 mad_agent->port_num, phys_port_cnt)) {
-		/* SMI failed receive */
+	struct ib_mad *response;
+	int ret;
+
+	response = kmalloc(sizeof(struct ib_mad), GFP_KERNEL);
+	if (!response)
 		return 0;
-	}
 
-	if (smi_check_forward_smp(mad_agent, smp)) {
-		smi_send_smp(mad_agent, smp, mad_recv_wc,
-			     mad_recv_wc->wc->slid, phys_port_cnt);
+	ret = mad_process_local(mad_agent, mad, response, slid);
+	if (ret & IB_MAD_RESULT_SUCCESS) {
+		agent_mad_send(mad_agent, response, mad_recv_wc);
+	} else
+		kfree(response);
+	return 1;
+}
+
+int agent_recv_mad(struct ib_mad_agent *mad_agent,
+		   struct ib_mad *mad,
+		   struct ib_mad_recv_wc *mad_recv_wc,
+		   int phys_port_cnt)
+{
+	/* SM Directed Route or LID Routed class */
+	if (mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE ||
+	    mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED) {
+		if (!smi_handle_smp_recv(mad_agent, (struct ib_smp *)mad,
+					 mad_agent->port_num, phys_port_cnt)) {
+			/* SMI failed receive */
+			return 0;
+		}
+
+		if (smi_check_forward_smp(mad_agent, (struct ib_smp *)mad)) {
+			smi_send_smp(mad_agent, (struct ib_smp *)mad,
+				     mad_recv_wc,
+				     mad_recv_wc->wc->slid,
+				     phys_port_cnt);
+			return 0;
+		}
+
+	} else {
+		/* PerfMgmt class */
+		if (mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT) {
+			mad_response(mad_agent, mad, mad_recv_wc,
+				     mad_recv_wc->wc->slid);
+		} else {
+			printk(KERN_ERR "agent_recv_mad: Unexpected mgmt class 0x%x
received\n", mad->mad_hdr.mgmt_class);
+		}
 		return 0;
 	}
-	
+
 	/* Complete receive up stack */
 	return 1;
 }
@@ -538,9 +574,9 @@
 		       (unsigned int)mad_agent);
 
 	} else {
-		smi_recv_smp(mad_agent, 
-			     (struct ib_smp *)mad_recv_wc->recv_buf->mad,
-			     mad_recv_wc, port_priv->phys_port_cnt);
+		agent_recv_mad(mad_agent, 
+			       mad_recv_wc->recv_buf->mad,
+			       mad_recv_wc, port_priv->phys_port_cnt);
 	}
 
 	/* Free received MAD */






More information about the general mailing list