[openib-general] [PATCH] ib_mad: Fix send only registrations

Hal Rosenstock halr at voltaire.com
Thu Oct 14 10:33:08 PDT 2004


ib_mad: Fix send only registrations

Index: ib_mad.c
===================================================================
--- ib_mad.c	(revision 990)
+++ ib_mad.c	(working copy)
@@ -116,11 +116,6 @@
 		goto error1;
 	}
 
-	if (!send_handler) {
-		ret = ERR_PTR(-EINVAL);
-		goto error1;
-	}
-
 	if (rmpp_version) {
 		ret = ERR_PTR(-EINVAL);	/* until RMPP implemented!!! */
 		goto error1;
@@ -128,11 +123,22 @@
 
 	/* Validate MAD registration request if supplied */
 	if (mad_reg_req) {
-		if (!recv_handler ||
-		    mad_reg_req->mgmt_class_version >= MAX_MGMT_VERSION) {
+		if (mad_reg_req->mgmt_class_version >= MAX_MGMT_VERSION) {
 			ret = ERR_PTR(-EINVAL);
 			goto error1;
 		}
+		if (!bitmap_empty(mad_reg_req->method_mask,
+				  IB_MGMT_MAX_METHODS)) {
+			if (!recv_handler) {
+				ret = ERR_PTR(-EINVAL);
+				goto error1;
+			}
+		} else {
+			if (!send_handler) {
+				ret = ERR_PTR(-EINVAL);
+				goto error1;
+			}
+		}
 		if (mad_reg_req->mgmt_class >= MAX_MGMT_CLASS) {
 			/*
 			 * IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE is the only
@@ -151,6 +157,12 @@
 			ret = ERR_PTR(-EINVAL);
 			goto error1;
 		}
+	} else {
+		/* No registration request supplied */
+		if (!send_handler) {
+			ret = ERR_PTR(-EINVAL);
+			goto error1;
+		}
 	}
 
 	/* Validate device and port */
@@ -842,7 +854,9 @@
 		spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
 
 		/* Defined behavior is to complete response before request */
-		mad_agent_priv->agent.recv_handler(&mad_agent_priv->agent,
+		if (mad_agent_priv->agent.recv_handler)
+			mad_agent_priv->agent.recv_handler(
+						&mad_agent_priv->agent,
 						&recv->header.recv_wc);
 		atomic_dec(&mad_agent_priv->refcount);
 
@@ -851,7 +865,9 @@
 		mad_send_wc.wr_id = mad_send_wr->wr_id;
 		ib_mad_complete_send_wr(mad_send_wr, &mad_send_wc);
 	} else {
-		mad_agent_priv->agent.recv_handler(&mad_agent_priv->agent,
+		if (mad_agent_priv->agent.recv_handler)
+			mad_agent_priv->agent.recv_handler(
+						&mad_agent_priv->agent,
 						&recv->header.recv_wc);
 		if (atomic_dec_and_test(&mad_agent_priv->refcount))
 			wake_up(&mad_agent_priv->wait);
@@ -929,7 +945,7 @@
 	/* Snoop MAD ? */
 	if (port_priv->device->snoop_mad) {
 		if (port_priv->device->snoop_mad(port_priv->device,
-						 port_priv->port_num,
+						 (u8)port_priv->port_num,
 						 wc->slid,
 						 recv->header.recv_buf.mad)) {
 			goto ret;
@@ -952,7 +968,7 @@
 	}
 
 ret:
-	if (!mad_agent) { 
+	if (!mad_agent || !mad_agent->agent.recv_handler) { 
 		/* Should this case be optimized ? */
 		kmem_cache_free(ib_mad_cache, recv);
 	}
@@ -1018,7 +1034,9 @@
 	
 	if (mad_send_wr->status != IB_WC_SUCCESS )
 		mad_send_wc->status = mad_send_wr->status;
-	mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
mad_send_wc);
+	if (mad_agent_priv->agent.send_handler)
+		mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
+						    mad_send_wc);
 
 	/* Release reference on agent taken when sending */
 	if (atomic_dec_and_test(&mad_agent_priv->refcount))
@@ -1135,7 +1153,9 @@
 	list_for_each_entry_safe(mad_send_wr, temp_mad_send_wr,
 				 &cancel_list, agent_list) {
 		mad_send_wc.wr_id = mad_send_wr->wr_id;
-		mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
+		if (mad_agent_priv->agent.send_handler)
+			mad_agent_priv->agent.send_handler(
+						   &mad_agent_priv->agent,
 						   &mad_send_wc);
 
 		list_del(&mad_send_wr->agent_list);
@@ -1196,8 +1216,9 @@
 	mad_send_wc.status = IB_WC_WR_FLUSH_ERR;
 	mad_send_wc.vendor_err = 0;
 	mad_send_wc.wr_id = mad_send_wr->wr_id;
-	mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
-					   &mad_send_wc);
+	if (mad_agent_priv->agent.send_handler)
+		mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
+						   &mad_send_wc);
 
 	kfree(mad_send_wr);
 	if (atomic_dec_and_test(&mad_agent_priv->refcount))






More information about the general mailing list