[openib-general] [PATCH] IPoIB: Add API to retrieve ib device, port, and pkey

Hal Rosenstock halr at voltaire.com
Thu Oct 6 08:41:51 PDT 2005


IPoIB: Add API to retrieve ib device, port, and pkey

(I'm also attaching my patch to at.c which uses this; If this is
accepted, I will make up a patch for SDP as well.)

Signed-off-by: Hal Rosenstock <halr at voltaire.com>

Index: ipoib.h
===================================================================
--- ipoib.h	(revision 3683)
+++ ipoib.h	(working copy)
@@ -210,6 +210,12 @@ struct ipoib_neigh {
 	struct list_head    list;
 };
 
+struct ipoib_info {
+	struct ib_device *dev;
+	int		  port;
+	u16		  pkey;
+};
+
 static inline struct ipoib_neigh **to_ipoib_neigh(struct neighbour *neigh)
 {
 	return (struct ipoib_neigh **) (neigh->ha + 24 -
@@ -239,6 +245,8 @@ void ipoib_reap_ah(void *dev_ptr);
 void ipoib_flush_paths(struct net_device *dev);
 struct ipoib_dev_priv *ipoib_intf_alloc(const char *format);
 
+int ipoib_get_info(struct net_device *dev, struct ipoib_info *info);
+
 int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port);
 void ipoib_ib_dev_flush(void *dev);
 void ipoib_ib_dev_cleanup(struct net_device *dev);
Index: ipoib_ib.c
===================================================================
--- ipoib_ib.c	(revision 3683)
+++ ipoib_ib.c	(working copy)
@@ -38,6 +38,8 @@
 #include <linux/delay.h>
 #include <linux/dma-mapping.h>
 
+#include <linux/if_arp.h>	/* For ARPHRD_xxx */
+
 #include <rdma/ib_cache.h>
 
 #include "ipoib.h"
@@ -569,6 +571,29 @@ int ipoib_ib_dev_init(struct net_device 
 	return 0;
 }
 
+int ipoib_get_info(struct net_device *dev, struct ipoib_info *info)
+{
+	struct ipoib_dev_priv *priv;
+
+	if (!info)
+		return -EINVAL;
+
+	/* Make sure IPoIB interface */
+	if (dev->type != ARPHRD_INFINIBAND)
+		return -ENODEV;
+
+	priv = netdev_priv(dev);
+	/* PKey assigned yet ? */
+	if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags))
+		return -ENOENT;
+
+	info->dev = priv->ca;
+	info->port = priv->port;
+	info->pkey = priv->pkey;	
+	return 0;
+}
+EXPORT_SYMBOL(ipoib_get_info);
+
 void ipoib_ib_dev_flush(void *_dev)
 {
 	struct net_device *dev = (struct net_device *)_dev;
Index: at.c
===================================================================
--- at.c	(revision 3683)
+++ at.c	(working copy)
@@ -416,10 +416,10 @@ static void ib_at_ats_reg(void *data)
 static int resolve_ip(struct ib_at_src *src, u32 dst_ip, u32 src_ip,
 			int tos, union ib_gid *dgid)
 {
-	struct ipoib_dev_priv *priv;
 	struct net_device *loopback = NULL;
 	struct net_device *ipoib_dev;
 	struct rtable *rt;
+	struct ipoib_info info;
 	struct flowi fl = {
 		.oif = 0, 	/* oif */
 		.nl_u = {
@@ -504,14 +504,16 @@ static int resolve_ip(struct ib_at_src *
 	}
 
 	/*
-	 * lookup local info.
+	 * Obtain ib_device, port, and PKey based on IPoIB net_device
 	 */
-	priv = ipoib_dev->priv;
-
 	src->netdev = ipoib_dev;
-	src->dev = priv->ca;
-	src->port = priv->port;
-	src->pkey = cpu_to_be16(priv->pkey);
+	if ((r = ipoib_get_info(ipoib_dev, &info))) {
+		DEBUG("ipoib_get_pkey failed %d", r);
+		goto done;
+	}
+	src->dev = info.dev;
+	src->port = info.port;
+	src->pkey = cpu_to_be16(info.pkey);
 	memcpy(&src->gid, ipoib_dev->dev_addr + 4, sizeof src->gid);
 
 	if (!dgid) {







More information about the general mailing list