@@ -41,6 +41,7 @@
#include "mad_rmpp.h"
#include "smi.h"
#include "agent.h"
+#include "linux/utsname.h"
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("kernel IB MAD API");
@@ -932,6 +933,29 @@ int ib_get_mad_data_offset(u8 mgmt_class)
}
EXPORT_SYMBOL(ib_get_mad_data_offset);
+#define NODE_DESC_FIELD_LENGTH 64
+void ib_build_node_desc(char *dest, char *src)
+{
+ int i;
+ for (i=0; i<NODE_DESC_FIELD_LENGTH;) {
+ if (*src == '@') {
+ char *name = init_utsname()->nodename;
+ for (; *name && *name != '.' && i<NODE_DESC_FIELD_LENGTH; ++i)
+ *dest++ = *name++;
+ src++;
+ } else {
+ *dest++ = *src++;
+ i++;
+ }
+ }
+ if (i<NODE_DESC_FIELD_LENGTH) {
+ dest[i]=0;
+ } else {
+ dest[NODE_DESC_FIELD_LENGTH-1]=0;
+ }
+}
+EXPORT_SYMBOL(ib_build_node_desc);
+
int ib_is_mad_class_rmpp(u8 mgmt_class)
{
if ((mgmt_class == IB_MGMT_CLASS_SUBN_ADM) ||
@@ -356,6 +356,6 @@ int build_phys_page_list(struct ib_phys_buf *buffer_list,
__be64 **page_list);
-#define IWCH_NODE_DESC "cxgb3 Chelsio Communications"
+#define IWCH_NODE_DESC "@: cxgb3 Chelsio Communications"
#endif
@@ -60,7 +60,7 @@ static int recv_subn_get_nodedescription(struct ib_smp *smp,
if (smp->attr_mod)
smp->status |= IB_SMP_INVALID_FIELD;
- memcpy(smp->data, ibdev->node_desc, sizeof(smp->data));
+ ib_build_node_desc((char*)smp->data, ibdev->node_desc);
return reply(smp);
}
@@ -2180,7 +2180,7 @@ int ipath_register_ib_device(struct ipath_devdata *dd)
dev->dma_ops = &ipath_dma_mapping_ops;
snprintf(dev->node_desc, sizeof(dev->node_desc),
- IPATH_IDSTR " %s", init_utsname()->nodename);
+ "@:" IPATH_IDSTR);
ret = ib_register_device(dev, NULL);
if (ret)
@@ -196,7 +196,7 @@ static void node_desc_override(struct ib_device *dev,
mad->mad_hdr.method == IB_MGMT_METHOD_GET_RESP &&
mad->mad_hdr.attr_id == IB_SMP_ATTR_NODE_DESC) {
spin_lock(&to_mdev(dev)->sm_lock);
- memcpy(((struct ib_smp *) mad)->data, dev->node_desc, 64);
+ ib_build_node_desc((char*)((struct ib_smp *) mad)->data, dev->node_desc);
spin_unlock(&to_mdev(dev)->sm_lock);
}
}
@@ -479,7 +479,9 @@ static int init_node_data(struct mlx4_ib_dev *dev)
if (err)
goto out;
- memcpy(dev->ib_dev.node_desc, out_mad->data, 64);
+ dev->ib_dev.node_desc[0]='@';
+ dev->ib_dev.node_desc[1]=':';
+ memcpy(&(dev->ib_dev.node_desc[2]), out_mad->data, 62);
in_mad->attr_id = IB_SMP_ATTR_NODE_INFO;
@@ -153,7 +153,7 @@ static void node_desc_override(struct ib_device *dev,
mad->mad_hdr.method == IB_MGMT_METHOD_GET_RESP &&
mad->mad_hdr.attr_id == IB_SMP_ATTR_NODE_DESC) {
mutex_lock(&to_mdev(dev)->cap_mask_mutex);
- memcpy(((struct ib_smp *) mad)->data, dev->node_desc, 64);
+ ib_build_node_desc((char*)((struct ib_smp *) mad)->data, dev->node_desc);
mutex_unlock(&to_mdev(dev)->cap_mask_mutex);
}
}
@@ -1273,7 +1273,9 @@ static int mthca_init_node_data(struct mthca_dev *dev)
goto out;
}
- memcpy(dev->ib_dev.node_desc, out_mad->data, 64);
+ dev->ib_dev.node_desc[0]='@';
+ dev->ib_dev.node_desc[1]=':';
+ memcpy(&(dev->ib_dev.node_desc[2]), out_mad->data, 62);
in_mad->attr_id = IB_SMP_ATTR_NODE_INFO;
@@ -260,7 +260,7 @@ static int subn_get_nodedescription(struct ib_smp *smp,
if (smp->attr_mod)
smp->status |= IB_SMP_INVALID_FIELD;
- memcpy(smp->data, ibdev->node_desc, sizeof(smp->data));
+ ib_build_node_desc((char*)smp->data, ibdev->node_desc);
return reply(smp);
}
@@ -2153,7 +2153,7 @@ int qib_register_ib_device(struct qib_devdata *dd)
ibdev->dma_ops = &qib_dma_mapping_ops;
snprintf(ibdev->node_desc, sizeof(ibdev->node_desc),
- QIB_IDSTR " %s", init_utsname()->nodename);
+ "@:" QIB_IDSTR);
ret = ib_register_device(ibdev, qib_create_port_files);
if (ret)
@@ -637,6 +637,14 @@ int ib_is_mad_class_rmpp(u8 mgmt_class);
int ib_get_mad_data_offset(u8 mgmt_class);
/**
+ * ib_build_node_desc - copies the node description and replaces
+ * any @ markers with the present system node name.
+ * @dest: destination
+ * @src: source
+ */
+void ib_build_node_desc(char *dest, char *src);
+
+/**
* ib_get_rmpp_segment - returns the data buffer for a given RMPP segment.
* @send_buf: Previously allocated send data buffer.
* @seg_num: number of segment to return