git: 3e142e07675b - main - ofed: Mechanically convert to IfAPI

From: Justin Hibbits <jhibbits_at_FreeBSD.org>
Date: Fri, 24 Mar 2023 15:49:11 UTC
The branch main has been updated by jhibbits:

URL: https://cgit.FreeBSD.org/src/commit/?id=3e142e07675be6df39e4aaf5003637dca54cdcea

commit 3e142e07675be6df39e4aaf5003637dca54cdcea
Author:     Justin Hibbits <jhibbits@FreeBSD.org>
AuthorDate: 2023-02-09 02:31:24 +0000
Commit:     Justin Hibbits <jhibbits@FreeBSD.org>
CommitDate: 2023-03-24 14:04:33 +0000

    ofed: Mechanically convert to IfAPI
    
    Summary:
    Because of the intricacies of this code it wasn't purely scripted, but
    instead hand-mechanical.
    
    Reviewed by:    hselasky
    Sponsored by:   Juniper Networks, Inc.
    Differential Revision: https://reviews.freebsd.org/D38560
---
 sys/ofed/drivers/infiniband/core/core_priv.h       |  10 +-
 sys/ofed/drivers/infiniband/core/ib_addr.c         |  88 +++++----
 sys/ofed/drivers/infiniband/core/ib_cache.c        |  26 +--
 sys/ofed/drivers/infiniband/core/ib_cm.c           |   6 +-
 sys/ofed/drivers/infiniband/core/ib_cma.c          |  74 ++++----
 sys/ofed/drivers/infiniband/core/ib_device.c       |  12 +-
 sys/ofed/drivers/infiniband/core/ib_multicast.c    |   2 +-
 .../drivers/infiniband/core/ib_roce_gid_mgmt.c     | 152 +++++++++-------
 sys/ofed/drivers/infiniband/core/ib_sa_query.c     |   6 +-
 sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h      |  10 +-
 sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c   |  36 ++--
 .../drivers/infiniband/ulp/ipoib/ipoib_ethtool.c   |  16 +-
 sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_fs.c   |   4 +-
 sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_ib.c   |  26 +--
 sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c | 201 +++++++++++----------
 .../drivers/infiniband/ulp/ipoib/ipoib_multicast.c |  20 +-
 .../drivers/infiniband/ulp/ipoib/ipoib_verbs.c     |   8 +-
 sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_vlan.c |  10 +-
 sys/ofed/include/rdma/ib_addr.h                    |  43 ++---
 sys/ofed/include/rdma/ib_addr_freebsd.h            |  12 +-
 sys/ofed/include/rdma/ib_cache.h                   |   4 +-
 sys/ofed/include/rdma/ib_sa.h                      |   4 +-
 sys/ofed/include/rdma/ib_verbs.h                   |  10 +-
 23 files changed, 401 insertions(+), 379 deletions(-)

diff --git a/sys/ofed/drivers/infiniband/core/core_priv.h b/sys/ofed/drivers/infiniband/core/core_priv.h
index ebbb46d73933..db6cbac386ba 100644
--- a/sys/ofed/drivers/infiniband/core/core_priv.h
+++ b/sys/ofed/drivers/infiniband/core/core_priv.h
@@ -82,10 +82,10 @@ void ib_cache_setup(void);
 void ib_cache_cleanup(void);
 
 typedef void (*roce_netdev_callback)(struct ib_device *device, u8 port,
-	      struct ifnet *idev, void *cookie);
+	      if_t idev, void *cookie);
 
 typedef int (*roce_netdev_filter)(struct ib_device *device, u8 port,
-	     struct ifnet *idev, void *cookie);
+	     if_t idev, void *cookie);
 
 void ib_enum_roce_netdev(struct ib_device *ib_dev,
 			 roce_netdev_filter filter,
@@ -107,7 +107,7 @@ int ib_cache_gid_parse_type_str(const char *buf);
 const char *ib_cache_gid_type_str(enum ib_gid_type gid_type);
 
 void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u8 port,
-				  struct ifnet *ndev,
+				  if_t ndev,
 				  unsigned long gid_type_mask,
 				  enum ib_cache_gid_default_mode mode);
 
@@ -118,8 +118,8 @@ int ib_cache_gid_del(struct ib_device *ib_dev, u8 port,
 		     union ib_gid *gid, struct ib_gid_attr *attr);
 
 int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port,
-				     struct ifnet *ndev);
-void ib_cache_gid_del_all_by_netdev(struct ifnet *ndev);
+				     if_t ndev);
+void ib_cache_gid_del_all_by_netdev(if_t ndev);
 
 int roce_gid_mgmt_init(void);
 void roce_gid_mgmt_cleanup(void);
diff --git a/sys/ofed/drivers/infiniband/core/ib_addr.c b/sys/ofed/drivers/infiniband/core/ib_addr.c
index 974860b77caf..ee5e792027d3 100644
--- a/sys/ofed/drivers/infiniband/core/ib_addr.c
+++ b/sys/ofed/drivers/infiniband/core/ib_addr.c
@@ -140,32 +140,34 @@ rdma_copy_addr_sub(u8 *dst, const u8 *src, unsigned min, unsigned max)
 	memset(dst + min, 0, max - min);
 }
 
-int rdma_copy_addr(struct rdma_dev_addr *dev_addr, struct ifnet *dev,
+int rdma_copy_addr(struct rdma_dev_addr *dev_addr, if_t dev,
 		     const unsigned char *dst_dev_addr)
 {
+	int dev_type = if_gettype(dev);
+
 	/* check for loopback device */
-	if (dev->if_flags & IFF_LOOPBACK) {
+	if (if_getflags(dev) & IFF_LOOPBACK) {
 		dev_addr->dev_type = ARPHRD_ETHER;
 		memset(dev_addr->src_dev_addr, 0, MAX_ADDR_LEN);
 		memset(dev_addr->broadcast, 0, MAX_ADDR_LEN);
 		memset(dev_addr->dst_dev_addr, 0, MAX_ADDR_LEN);
-		dev_addr->bound_dev_if = dev->if_index;
+		dev_addr->bound_dev_if = if_getindex(dev);
 		return (0);
-	} else if (dev->if_type == IFT_INFINIBAND)
+	} else if (dev_type == IFT_INFINIBAND)
 		dev_addr->dev_type = ARPHRD_INFINIBAND;
-	else if (dev->if_type == IFT_ETHER || dev->if_type == IFT_L2VLAN)
+	else if (dev_type == IFT_ETHER || dev_type == IFT_L2VLAN)
 		dev_addr->dev_type = ARPHRD_ETHER;
 	else
 		dev_addr->dev_type = 0;
-	rdma_copy_addr_sub(dev_addr->src_dev_addr, IF_LLADDR(dev),
-			   dev->if_addrlen, MAX_ADDR_LEN);
-	rdma_copy_addr_sub(dev_addr->broadcast, dev->if_broadcastaddr,
-			   dev->if_addrlen, MAX_ADDR_LEN);
+	rdma_copy_addr_sub(dev_addr->src_dev_addr, if_getlladdr(dev),
+			   if_getaddrlen(dev), MAX_ADDR_LEN);
+	rdma_copy_addr_sub(dev_addr->broadcast, if_getbroadcastaddr(dev),
+			   if_getaddrlen(dev), MAX_ADDR_LEN);
 	if (dst_dev_addr != NULL) {
 		rdma_copy_addr_sub(dev_addr->dst_dev_addr, dst_dev_addr,
-				   dev->if_addrlen, MAX_ADDR_LEN);
+				   if_getaddrlen(dev), MAX_ADDR_LEN);
 	}
-	dev_addr->bound_dev_if = dev->if_index;
+	dev_addr->bound_dev_if = if_getindex(dev);
 	return 0;
 }
 EXPORT_SYMBOL(rdma_copy_addr);
@@ -173,7 +175,7 @@ EXPORT_SYMBOL(rdma_copy_addr);
 int rdma_translate_ip(const struct sockaddr *addr,
 		      struct rdma_dev_addr *dev_addr)
 {
-	struct ifnet *dev;
+	if_t dev;
 	int ret;
 
 	if (dev_addr->bound_dev_if) {
@@ -198,7 +200,7 @@ int rdma_translate_ip(const struct sockaddr *addr,
 
 	if (dev != NULL) {
 		/* disallow connections through 127.0.0.1 itself */
-		if (dev->if_flags & IFF_LOOPBACK)
+		if (if_getflags(dev) & IFF_LOOPBACK)
 			ret = -EINVAL;
 		else
 			ret = rdma_copy_addr(dev_addr, dev, NULL);
@@ -241,7 +243,7 @@ static void queue_req(struct addr_req *req)
 }
 
 #if defined(INET) || defined(INET6)
-static int addr_resolve_multi(u8 *edst, struct ifnet *ifp, struct sockaddr *dst_in)
+static int addr_resolve_multi(u8 *edst, if_t ifp, struct sockaddr *dst_in)
 {
 	struct sockaddr *llsa;
 	struct sockaddr_dl sdl;
@@ -250,14 +252,10 @@ static int addr_resolve_multi(u8 *edst, struct ifnet *ifp, struct sockaddr *dst_
 	sdl.sdl_len = sizeof(sdl);
 	llsa = (struct sockaddr *)&sdl;
 
-	if (ifp->if_resolvemulti == NULL) {
-		error = EOPNOTSUPP;
-	} else {
-		error = ifp->if_resolvemulti(ifp, &llsa, dst_in);
-		if (error == 0) {
-			rdma_copy_addr_sub(edst, LLADDR((struct sockaddr_dl *)llsa),
-			    ifp->if_addrlen, MAX_ADDR_LEN);
-		}
+	error = if_resolvemulti(ifp, &llsa, dst_in);
+	if (error == 0) {
+		rdma_copy_addr_sub(edst, LLADDR((struct sockaddr_dl *)llsa),
+		    if_getaddrlen(ifp), MAX_ADDR_LEN);
 	}
 	return (error);
 }
@@ -268,7 +266,7 @@ static int addr4_resolve(struct sockaddr_in *src_in,
 			 const struct sockaddr_in *dst_in,
 			 struct rdma_dev_addr *addr,
 			 u8 *edst,
-			 struct ifnet **ifpp)
+			 if_t *ifpp)
 {
 	enum {
 		ADDR_VALID = 0,
@@ -279,7 +277,7 @@ static int addr4_resolve(struct sockaddr_in *src_in,
 	in_port_t src_port;
 	struct sockaddr *saddr = NULL;
 	struct nhop_object *nh;
-	struct ifnet *ifp;
+	if_t ifp;
 	int error;
 	int type;
 
@@ -332,13 +330,13 @@ static int addr4_resolve(struct sockaddr_in *src_in,
 		if (ifp == NULL) {
 			error = ENETUNREACH;
 			goto done;
-		} else if (ifp->if_flags & IFF_LOOPBACK) {
+		} else if (if_getflags(ifp) & IFF_LOOPBACK) {
 			/*
 			 * Source address cannot be a loopback device.
 			 */
 			error = EHOSTUNREACH;
 			goto error_put_ifp;
-		} else if (nh->nh_ifp->if_flags & IFF_LOOPBACK) {
+		} else if (if_getflags(nh->nh_ifp) & IFF_LOOPBACK) {
 			if (memcmp(&src_in->sin_addr, &dst_in->sin_addr,
 			    sizeof(src_in->sin_addr))) {
 				/*
@@ -364,7 +362,7 @@ static int addr4_resolve(struct sockaddr_in *src_in,
 		break;
 	case ADDR_SRC_ANY:
 		/* check for loopback device */
-		if (nh->nh_ifp->if_flags & IFF_LOOPBACK)
+		if (if_getflags(nh->nh_ifp) & IFF_LOOPBACK)
 			saddr = (struct sockaddr *)&dst_tmp;
 		else
 			saddr = nh->nh_ifa->ifa_addr;
@@ -381,8 +379,8 @@ static int addr4_resolve(struct sockaddr_in *src_in,
 	 * Step 3 - resolve destination MAC address
 	 */
 	if (dst_tmp.sin_addr.s_addr == INADDR_BROADCAST) {
-		rdma_copy_addr_sub(edst, ifp->if_broadcastaddr,
-		    ifp->if_addrlen, MAX_ADDR_LEN);
+		rdma_copy_addr_sub(edst, if_getbroadcastaddr(ifp),
+		    if_getaddrlen(ifp), MAX_ADDR_LEN);
 		error = 0;
 	} else if (IN_MULTICAST(ntohl(dst_tmp.sin_addr.s_addr))) {
 		bool is_gw = (nh->nh_flags & NHF_GATEWAY) != 0;
@@ -391,7 +389,7 @@ static int addr4_resolve(struct sockaddr_in *src_in,
 			goto error_put_ifp;
 		else if (is_gw)
 			addr->network = RDMA_NETWORK_IPV4;
-	} else if (ifp->if_flags & IFF_LOOPBACK) {
+	} else if (if_getflags(ifp) & IFF_LOOPBACK) {
 		memset(edst, 0, MAX_ADDR_LEN);
 		error = 0;
 	} else {
@@ -440,7 +438,7 @@ static int addr4_resolve(struct sockaddr_in *src_in,
 			 const struct sockaddr_in *dst_in,
 			 struct rdma_dev_addr *addr,
 			 u8 *edst,
-			 struct ifnet **ifpp)
+			 if_t *ifpp)
 {
 	return -EADDRNOTAVAIL;
 }
@@ -451,7 +449,7 @@ static int addr6_resolve(struct sockaddr_in6 *src_in,
 			 const struct sockaddr_in6 *dst_in,
 			 struct rdma_dev_addr *addr,
 			 u8 *edst,
-			 struct ifnet **ifpp)
+			 if_t *ifpp)
 {
 	enum {
 		ADDR_VALID = 0,
@@ -462,7 +460,7 @@ static int addr6_resolve(struct sockaddr_in6 *src_in,
 	in_port_t src_port;
 	struct sockaddr *saddr = NULL;
 	struct nhop_object *nh;
-	struct ifnet *ifp;
+	if_t ifp;
 	int error;
 	int type;
 
@@ -530,13 +528,13 @@ static int addr6_resolve(struct sockaddr_in6 *src_in,
 		if (ifp == NULL) {
 			error = ENETUNREACH;
 			goto done;
-		} else if (ifp->if_flags & IFF_LOOPBACK) {
+		} else if (if_getflags(ifp) & IFF_LOOPBACK) {
 			/*
 			 * Source address cannot be a loopback device.
 			 */
 			error = EHOSTUNREACH;
 			goto error_put_ifp;
-		} else if (nh->nh_ifp->if_flags & IFF_LOOPBACK) {
+		} else if (if_getflags(nh->nh_ifp) & IFF_LOOPBACK) {
 			if (memcmp(&src_in->sin6_addr, &dst_in->sin6_addr,
 			    sizeof(src_in->sin6_addr))) {
 				/*
@@ -562,7 +560,7 @@ static int addr6_resolve(struct sockaddr_in6 *src_in,
 		break;
 	case ADDR_SRC_ANY:
 		/* check for loopback device */
-		if (nh->nh_ifp->if_flags & IFF_LOOPBACK)
+		if (if_getflags(nh->nh_ifp) & IFF_LOOPBACK)
 			saddr = (struct sockaddr *)&dst_tmp;
 		else
 			saddr = nh->nh_ifa->ifa_addr;
@@ -586,7 +584,7 @@ static int addr6_resolve(struct sockaddr_in6 *src_in,
 			goto error_put_ifp;
 		else if (is_gw)
 			addr->network = RDMA_NETWORK_IPV6;
-	} else if (nh->nh_ifp->if_flags & IFF_LOOPBACK) {
+	} else if (if_getflags(nh->nh_ifp) & IFF_LOOPBACK) {
 		memset(edst, 0, MAX_ADDR_LEN);
 		error = 0;
 	} else {
@@ -628,18 +626,18 @@ static int addr6_resolve(struct sockaddr_in6 *src_in,
 			 const struct sockaddr_in6 *dst_in,
 			 struct rdma_dev_addr *addr,
 			 u8 *edst,
-			 struct ifnet **ifpp)
+			 if_t *ifpp)
 {
 	return -EADDRNOTAVAIL;
 }
 #endif
 
-static int addr_resolve_neigh(struct ifnet *dev,
+static int addr_resolve_neigh(if_t dev,
 			      const struct sockaddr *dst_in,
 			      u8 *edst,
 			      struct rdma_dev_addr *addr)
 {
-	if (dev->if_flags & IFF_LOOPBACK) {
+	if (if_getflags(dev) & IFF_LOOPBACK) {
 		int ret;
 
 		/*
@@ -647,7 +645,7 @@ static int addr_resolve_neigh(struct ifnet *dev,
 		 * sure the destination device address is global by
 		 * clearing the bound device interface:
 		 */
-		if (addr->bound_dev_if == dev->if_index)
+		if (addr->bound_dev_if == if_getindex(dev))
 			addr->bound_dev_if = 0;
 
 		ret = rdma_translate_ip(dst_in, addr);
@@ -659,7 +657,7 @@ static int addr_resolve_neigh(struct ifnet *dev,
 	}
 
 	/* If the device doesn't do ARP internally */
-	if (!(dev->if_flags & IFF_NOARP))
+	if (!(if_getflags(dev) & IFF_NOARP))
 		return rdma_copy_addr(addr, dev, edst);
 
 	return rdma_copy_addr(addr, dev, NULL);
@@ -670,7 +668,7 @@ static int addr_resolve(struct sockaddr *src_in,
 			struct rdma_dev_addr *addr)
 {
 	struct epoch_tracker et;
-	struct ifnet *ndev = NULL;
+	if_t ndev = NULL;
 	u8 edst[MAX_ADDR_LEN];
 	int ret;
 
@@ -860,7 +858,7 @@ static void resolve_cb(int status, struct sockaddr *src_addr,
 
 int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid,
 				 const union ib_gid *dgid,
-				 u8 *dmac, struct ifnet *dev,
+				 u8 *dmac, if_t dev,
 				 int *hoplimit)
 {
 	int ret = 0;
@@ -874,7 +872,7 @@ int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid,
 
 	memset(&dev_addr, 0, sizeof(dev_addr));
 
-	dev_addr.bound_dev_if = dev->if_index;
+	dev_addr.bound_dev_if = if_getindex(dev);
 	dev_addr.net = dev_net(dev);
 
 	ctx.addr = &dev_addr;
diff --git a/sys/ofed/drivers/infiniband/core/ib_cache.c b/sys/ofed/drivers/infiniband/core/ib_cache.c
index 1f44841348fe..17b283c48e14 100644
--- a/sys/ofed/drivers/infiniband/core/ib_cache.c
+++ b/sys/ofed/drivers/infiniband/core/ib_cache.c
@@ -183,7 +183,7 @@ static int write_gid(struct ib_device *ib_dev, u8 port,
 	__releases(&table->rwlock) __acquires(&table->rwlock)
 {
 	int ret = 0;
-	struct ifnet *old_net_dev;
+	if_t old_net_dev;
 	enum ib_gid_type old_gid_type;
 
 	/* in rdma_cap_roce_gid_table, this funciton should be protected by a
@@ -311,12 +311,12 @@ static int find_gid(struct ib_gid_table *table, const union ib_gid *gid,
 	return found;
 }
 
-static void addrconf_ifid_eui48(u8 *eui, struct ifnet *dev)
+static void addrconf_ifid_eui48(u8 *eui, if_t dev)
 {
-	if (dev->if_addrlen != ETH_ALEN)
+	if (if_getaddrlen(dev) != ETH_ALEN)
 		return;
-	memcpy(eui, IF_LLADDR(dev), 3);
-	memcpy(eui + 5, IF_LLADDR(dev) + 3, 3);
+	memcpy(eui, if_getlladdr(dev), 3);
+	memcpy(eui + 5, if_getlladdr(dev) + 3, 3);
 
 	/* NOTE: The scope ID is added by the GID to IP conversion */
 
@@ -325,7 +325,7 @@ static void addrconf_ifid_eui48(u8 *eui, struct ifnet *dev)
 	eui[0] ^= 2;
 }
 
-static void make_default_gid(struct ifnet *dev, union ib_gid *gid)
+static void make_default_gid(if_t dev, union ib_gid *gid)
 {
 	gid->global.subnet_prefix = cpu_to_be64(0xfe80000000000000LL);
 	addrconf_ifid_eui48(&gid->raw[8], dev);
@@ -400,7 +400,7 @@ out_unlock:
 }
 
 int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port,
-				     struct ifnet *ndev)
+				     if_t ndev)
 {
 	struct ib_gid_table **ports_table = ib_dev->cache.gid_cache;
 	struct ib_gid_table *table;
@@ -447,8 +447,8 @@ static int __ib_cache_gid_get(struct ib_device *ib_dev, u8 port, int index,
 		memcpy(attr, &table->data_vec[index].attr, sizeof(*attr));
 		/* make sure network device is valid and attached */
 		if (attr->ndev != NULL &&
-		    (attr->ndev->if_flags & IFF_DYING) == 0 &&
-		    attr->ndev->if_addr != NULL)
+		    (if_getflags(attr->ndev) & IFF_DYING) == 0 &&
+		    if_getifaddr(attr->ndev) != NULL)
 			dev_hold(attr->ndev);
 		else
 			attr->ndev = NULL;
@@ -490,7 +490,7 @@ static int _ib_cache_gid_table_find(struct ib_device *ib_dev,
 static int ib_cache_gid_find(struct ib_device *ib_dev,
 			     const union ib_gid *gid,
 			     enum ib_gid_type gid_type,
-			     struct ifnet *ndev, u8 *port,
+			     if_t ndev, u8 *port,
 			     u16 *index)
 {
 	unsigned long mask = GID_ATTR_FIND_MASK_GID |
@@ -507,7 +507,7 @@ static int ib_cache_gid_find(struct ib_device *ib_dev,
 int ib_find_cached_gid_by_port(struct ib_device *ib_dev,
 			       const union ib_gid *gid,
 			       enum ib_gid_type gid_type,
-			       u8 port, struct ifnet *ndev,
+			       u8 port, if_t ndev,
 			       u16 *index)
 {
 	int local_index;
@@ -672,7 +672,7 @@ static void cleanup_gid_table_port(struct ib_device *ib_dev, u8 port,
 }
 
 void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u8 port,
-				  struct ifnet *ndev,
+				  if_t ndev,
 				  unsigned long gid_type_mask,
 				  enum ib_cache_gid_default_mode mode)
 {
@@ -899,7 +899,7 @@ EXPORT_SYMBOL(ib_get_cached_gid);
 int ib_find_cached_gid(struct ib_device *device,
 		       const union ib_gid *gid,
 		       enum ib_gid_type gid_type,
-		       struct ifnet *ndev,
+		       if_t ndev,
 		       u8               *port_num,
 		       u16              *index)
 {
diff --git a/sys/ofed/drivers/infiniband/core/ib_cm.c b/sys/ofed/drivers/infiniband/core/ib_cm.c
index 45f316252b69..f7812fe4259a 100644
--- a/sys/ofed/drivers/infiniband/core/ib_cm.c
+++ b/sys/ofed/drivers/infiniband/core/ib_cm.c
@@ -503,7 +503,7 @@ static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av,
 	unsigned long flags;
 	int ret;
 	u8 p;
-	struct ifnet *ndev = ib_get_ndev_from_path(path);
+	if_t ndev = ib_get_ndev_from_path(path);
 
 	read_lock_irqsave(&cm.device_lock, flags);
 	list_for_each_entry(cm_dev, &cm.device_list, list) {
@@ -1819,7 +1819,7 @@ static int cm_req_handler(struct cm_work *work)
 				&gid, &gid_attr);
 	if (!ret) {
 		if (gid_attr.ndev) {
-			work->path[0].ifindex = gid_attr.ndev->if_index;
+			work->path[0].ifindex = if_getindex(gid_attr.ndev);
 			work->path[0].net = dev_net(gid_attr.ndev);
 			dev_put(gid_attr.ndev);
 		}
@@ -1833,7 +1833,7 @@ static int cm_req_handler(struct cm_work *work)
 					    &work->path[0].sgid,
 					    &gid_attr);
 		if (!err && gid_attr.ndev) {
-			work->path[0].ifindex = gid_attr.ndev->if_index;
+			work->path[0].ifindex = if_getindex(gid_attr.ndev);
 			work->path[0].net = dev_net(gid_attr.ndev);
 			dev_put(gid_attr.ndev);
 		}
diff --git a/sys/ofed/drivers/infiniband/core/ib_cma.c b/sys/ofed/drivers/infiniband/core/ib_cma.c
index 85af3330f08a..f8a346dac35e 100644
--- a/sys/ofed/drivers/infiniband/core/ib_cma.c
+++ b/sys/ofed/drivers/infiniband/core/ib_cma.c
@@ -461,7 +461,7 @@ static inline void sdp_set_ip_ver(struct sdp_hh *hh, u8 ip_ver)
 	hh->ipv_cap = (ip_ver << 4) | (hh->ipv_cap & 0xF);
 }
 
-static int cma_igmp_send(struct ifnet *ndev, const union ib_gid *mgid, bool join)
+static int cma_igmp_send(if_t ndev, const union ib_gid *mgid, bool join)
 {
 	int retval;
 
@@ -470,7 +470,7 @@ static int cma_igmp_send(struct ifnet *ndev, const union ib_gid *mgid, bool join
 
 		rdma_gid2ip(&addr._sockaddr, mgid);
 
-		CURVNET_SET_QUIET(ndev->if_vnet);
+		CURVNET_SET_QUIET(if_getvnet(ndev));
 		if (join)
 			retval = -if_addmulti(ndev, &addr._sockaddr, NULL);
 		else
@@ -603,7 +603,7 @@ static inline int cma_validate_port(struct ib_device *device, u8 port,
 				    const struct rdma_dev_addr *dev_addr)
 {
 	const int dev_type = dev_addr->dev_type;
-	struct ifnet *ndev;
+	if_t ndev;
 	int ret = -ENODEV;
 
 	if ((dev_type == ARPHRD_INFINIBAND) && !rdma_protocol_ib(device, port))
@@ -1396,21 +1396,21 @@ static bool validate_ipv4_net_dev_addr(struct vnet *vnet,
 }
 #endif
 
-static bool validate_ipv4_net_dev(struct ifnet *net_dev,
+static bool validate_ipv4_net_dev(if_t net_dev,
 				  const struct sockaddr_in *dst_addr,
 				  const struct sockaddr_in *src_addr)
 {
 #ifdef INET
 	__be32 daddr = dst_addr->sin_addr.s_addr,
 	       saddr = src_addr->sin_addr.s_addr;
-	struct ifnet *dst_dev;
+	if_t dst_dev;
 	struct nhop_object *nh;
 	bool ret;
 
-	if (validate_ipv4_net_dev_addr(net_dev->if_vnet, saddr, daddr))
+	if (validate_ipv4_net_dev_addr(if_getvnet(net_dev), saddr, daddr))
 		return false;
 
-	dst_dev = ip_ifp_find(net_dev->if_vnet, daddr);
+	dst_dev = ip_ifp_find(if_getvnet(net_dev), daddr);
 	if (dst_dev != net_dev) {
 		if (dst_dev != NULL)
 			dev_put(dst_dev);
@@ -1424,7 +1424,7 @@ static bool validate_ipv4_net_dev(struct ifnet *net_dev,
 	if (saddr == daddr)
 		return true;
 
-	CURVNET_SET(net_dev->if_vnet);
+	CURVNET_SET(if_getvnet(net_dev));
 	nh = fib4_lookup(RT_DEFAULT_FIB, src_addr->sin_addr, 0, NHR_NONE, 0);
 	if (nh != NULL)
 		ret = (nh->nh_ifp == net_dev);
@@ -1437,19 +1437,19 @@ static bool validate_ipv4_net_dev(struct ifnet *net_dev,
 #endif
 }
 
-static bool validate_ipv6_net_dev(struct ifnet *net_dev,
+static bool validate_ipv6_net_dev(if_t net_dev,
 				  const struct sockaddr_in6 *dst_addr,
 				  const struct sockaddr_in6 *src_addr)
 {
 #ifdef INET6
 	struct sockaddr_in6 src_tmp = *src_addr;
 	struct sockaddr_in6 dst_tmp = *dst_addr;
-	struct ifnet *dst_dev;
+	if_t dst_dev;
 	struct nhop_object *nh;
 	bool ret;
 
-	dst_dev = ip6_ifp_find(net_dev->if_vnet, dst_tmp.sin6_addr,
-	    net_dev->if_index);
+	dst_dev = ip6_ifp_find(if_getvnet(net_dev), dst_tmp.sin6_addr,
+	    if_getindex(net_dev));
 	if (dst_dev != net_dev) {
 		if (dst_dev != NULL)
 			dev_put(dst_dev);
@@ -1457,15 +1457,15 @@ static bool validate_ipv6_net_dev(struct ifnet *net_dev,
 	}
 	dev_put(dst_dev);
 
-	CURVNET_SET(net_dev->if_vnet);
+	CURVNET_SET(if_getvnet(net_dev));
 
 	/*
 	 * Make sure the scope ID gets embedded.
 	 */
-	src_tmp.sin6_scope_id = net_dev->if_index;
+	src_tmp.sin6_scope_id = if_getindex(net_dev);
 	sa6_embedscope(&src_tmp, 0);
 
-	dst_tmp.sin6_scope_id = net_dev->if_index;
+	dst_tmp.sin6_scope_id = if_getindex(net_dev);
 	sa6_embedscope(&dst_tmp, 0);
 
 	/*
@@ -1478,7 +1478,7 @@ static bool validate_ipv6_net_dev(struct ifnet *net_dev,
 	} else {
 		/* non-loopback case */
 		nh = fib6_lookup(RT_DEFAULT_FIB, &src_addr->sin6_addr,
-		    net_dev->if_index, NHR_NONE, 0);
+		    if_getindex(net_dev), NHR_NONE, 0);
 		if (nh != NULL)
 			ret = (nh->nh_ifp == net_dev);
 		else
@@ -1491,7 +1491,7 @@ static bool validate_ipv6_net_dev(struct ifnet *net_dev,
 #endif
 }
 
-static bool validate_net_dev(struct ifnet *net_dev,
+static bool validate_net_dev(if_t net_dev,
 			     const struct sockaddr *daddr,
 			     const struct sockaddr *saddr)
 {
@@ -1514,7 +1514,7 @@ static bool validate_net_dev(struct ifnet *net_dev,
 	}
 }
 
-static struct ifnet *
+static if_t
 roce_get_net_dev_by_cm_event(struct ib_device *device, u8 port_num,
     const struct ib_cm_event *ib_event)
 {
@@ -1534,13 +1534,13 @@ roce_get_net_dev_by_cm_event(struct ib_device *device, u8 port_num,
 	return (sgid_attr.ndev);
 }
 
-static struct ifnet *cma_get_net_dev(struct ib_cm_event *ib_event,
+static if_t cma_get_net_dev(struct ib_cm_event *ib_event,
 					  const struct cma_req_info *req)
 {
 	struct sockaddr_storage listen_addr_storage, src_addr_storage;
 	struct sockaddr *listen_addr = (struct sockaddr *)&listen_addr_storage,
 			*src_addr = (struct sockaddr *)&src_addr_storage;
-	struct ifnet *net_dev;
+	if_t net_dev;
 	const union ib_gid *gid = req->has_gid ? &req->local_gid : NULL;
 	struct epoch_tracker et;
 	int err;
@@ -1672,7 +1672,7 @@ static bool cma_protocol_roce(const struct rdma_cm_id *id)
 }
 
 static bool cma_match_net_dev(const struct rdma_cm_id *id,
-			      const struct ifnet *net_dev,
+			      const if_t net_dev,
 			      u8 port_num)
 {
 	const struct rdma_addr *addr = &id->route.addr;
@@ -1694,7 +1694,7 @@ static bool cma_match_net_dev(const struct rdma_cm_id *id,
 
 	return !addr->dev_addr.bound_dev_if ||
 	       (net_eq(dev_net(net_dev), addr->dev_addr.net) &&
-		addr->dev_addr.bound_dev_if == net_dev->if_index);
+		addr->dev_addr.bound_dev_if == if_getindex(net_dev));
 }
 
 static struct rdma_id_private *cma_find_listener(
@@ -1702,7 +1702,7 @@ static struct rdma_id_private *cma_find_listener(
 		const struct ib_cm_id *cm_id,
 		const struct ib_cm_event *ib_event,
 		const struct cma_req_info *req,
-		const struct ifnet *net_dev)
+		const if_t net_dev)
 {
 	struct rdma_id_private *id_priv, *id_priv_dev;
 
@@ -1729,7 +1729,7 @@ static struct rdma_id_private *cma_find_listener(
 
 static struct rdma_id_private *cma_id_from_event(struct ib_cm_id *cm_id,
 						 struct ib_cm_event *ib_event,
-						 struct ifnet **net_dev)
+						 if_t *net_dev)
 {
 	struct cma_req_info req;
 	struct rdma_bind_list *bind_list;
@@ -1864,7 +1864,7 @@ static void cma_leave_mc_groups(struct rdma_id_private *id_priv)
 			if (mc->igmp_joined) {
 				struct rdma_dev_addr *dev_addr =
 					&id_priv->id.route.addr.dev_addr;
-				struct ifnet *ndev = NULL;
+				if_t ndev = NULL;
 
 				if (dev_addr->bound_dev_if)
 					ndev = dev_get_by_index(dev_addr->net,
@@ -2053,7 +2053,7 @@ out:
 
 static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
 					       struct ib_cm_event *ib_event,
-					       struct ifnet *net_dev)
+					       if_t net_dev)
 {
 	struct rdma_id_private *id_priv;
 	struct rdma_cm_id *id;
@@ -2115,7 +2115,7 @@ err:
 
 static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id,
 					      struct ib_cm_event *ib_event,
-					      struct ifnet *net_dev)
+					      if_t net_dev)
 {
 	struct rdma_id_private *id_priv;
 	struct rdma_cm_id *id;
@@ -2183,7 +2183,7 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
 {
 	struct rdma_id_private *listen_id, *conn_id = NULL;
 	struct rdma_cm_event event;
-	struct ifnet *net_dev;
+	if_t net_dev;
 	int offset, ret;
 
 	listen_id = cma_id_from_event(cm_id, ib_event, &net_dev);
@@ -2731,7 +2731,7 @@ static int cma_resolve_iw_route(struct rdma_id_private *id_priv, int timeout_ms)
 	return 0;
 }
 
-static int iboe_tos_to_sl(struct ifnet *ndev, int tos)
+static int iboe_tos_to_sl(if_t ndev, int tos)
 {
 	/* get service level, SL, from IPv4 type of service, TOS */
 	int sl = (tos >> 5) & 0x7;
@@ -2758,7 +2758,7 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
 	struct rdma_addr *addr = &route->addr;
 	struct cma_work *work;
 	int ret;
-	struct ifnet *ndev = NULL;
+	if_t ndev = NULL;
 
 
 	work = kzalloc(sizeof *work, GFP_KERNEL);
@@ -2786,8 +2786,8 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
 			goto err2;
 		}
 
-		route->path_rec->net = ndev->if_vnet;
-		route->path_rec->ifindex = ndev->if_index;
+		route->path_rec->net = if_getvnet(ndev);
+		route->path_rec->ifindex = if_getindex(ndev);
 		supported_gids = roce_gid_type_mask_support(id_priv->id.device,
 							    id_priv->id.port_num);
 		route->path_rec->gid_type =
@@ -2820,7 +2820,7 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
 	route->path_rec->mtu_selector = IB_SA_EQ;
 	route->path_rec->sl = iboe_tos_to_sl(ndev, id_priv->tos);
 	route->path_rec->traffic_class = id_priv->tos;
-	route->path_rec->mtu = iboe_get_mtu(ndev->if_mtu);
+	route->path_rec->mtu = iboe_get_mtu(if_getmtu(ndev));
 	route->path_rec->rate_selector = IB_SA_EQ;
 	route->path_rec->rate = iboe_get_rate(ndev);
 	dev_put(ndev);
@@ -4083,7 +4083,7 @@ static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast)
 	if (!status) {
 		struct rdma_dev_addr *dev_addr =
 			&id_priv->id.route.addr.dev_addr;
-		struct ifnet *ndev =
+		if_t ndev =
 			dev_get_by_index(dev_addr->net, dev_addr->bound_dev_if);
 		enum ib_gid_type gid_type =
 			id_priv->cma_dev->default_gid_type[id_priv->id.port_num -
@@ -4310,7 +4310,7 @@ static int cma_iboe_join_multicast(struct rdma_id_private *id_priv,
 	struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
 	int err = 0;
 	struct sockaddr *addr = (struct sockaddr *)&mc->addr;
-	struct ifnet *ndev = NULL;
+	if_t ndev = NULL;
 	enum ib_gid_type gid_type;
 	bool send_only;
 
@@ -4345,7 +4345,7 @@ static int cma_iboe_join_multicast(struct rdma_id_private *id_priv,
 	}
 	mc->multicast.ib->rec.rate = iboe_get_rate(ndev);
 	mc->multicast.ib->rec.hop_limit = 1;
-	mc->multicast.ib->rec.mtu = iboe_get_mtu(ndev->if_mtu);
+	mc->multicast.ib->rec.mtu = iboe_get_mtu(if_getmtu(ndev));
 
 	if (addr->sa_family == AF_INET || addr->sa_family == AF_INET6) {
 		if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) {
@@ -4456,7 +4456,7 @@ void rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr)
 				if (mc->igmp_joined) {
 					struct rdma_dev_addr *dev_addr =
 						&id->route.addr.dev_addr;
-					struct ifnet *ndev = NULL;
+					if_t ndev = NULL;
 
 					if (dev_addr->bound_dev_if)
 						ndev = dev_get_by_index(dev_addr->net,
diff --git a/sys/ofed/drivers/infiniband/core/ib_device.c b/sys/ofed/drivers/infiniband/core/ib_device.c
index dc0e6a5866d2..f4ab1f945f58 100644
--- a/sys/ofed/drivers/infiniband/core/ib_device.c
+++ b/sys/ofed/drivers/infiniband/core/ib_device.c
@@ -732,12 +732,12 @@ void ib_enum_roce_netdev(struct ib_device *ib_dev,
 	for (port = rdma_start_port(ib_dev); port <= rdma_end_port(ib_dev);
 	     port++)
 		if (rdma_protocol_roce(ib_dev, port)) {
-			struct ifnet *idev = NULL;
+			if_t idev = NULL;
 
 			if (ib_dev->get_netdev)
 				idev = ib_dev->get_netdev(ib_dev, port);
 
-			if (idev && (idev->if_flags & IFF_DYING)) {
+			if (idev && (if_getflags(idev) & IFF_DYING)) {
 				dev_put(idev);
 				idev = NULL;
 			}
@@ -779,7 +779,7 @@ void ib_enum_all_roce_netdevs(roce_netdev_filter filter,
  *
  * @ndev: Pointer to netdevice
  */
-void ib_cache_gid_del_all_by_netdev(struct ifnet *ndev)
+void ib_cache_gid_del_all_by_netdev(if_t ndev)
 {
 	struct ib_device *ib_dev;
 	u8 port;
@@ -875,7 +875,7 @@ EXPORT_SYMBOL(ib_modify_port);
  *   parameter may be NULL.
  */
 int ib_find_gid(struct ib_device *device, union ib_gid *gid,
-		enum ib_gid_type gid_type, struct ifnet *ndev,
+		enum ib_gid_type gid_type, if_t ndev,
 		u8 *port_num, u16 *index)
 {
 	union ib_gid tmp_gid;
@@ -959,13 +959,13 @@ EXPORT_SYMBOL(ib_find_pkey);
  * @addr:	Contains the IP address that the request specified as its
  *		destination.
  */
-struct ifnet *ib_get_net_dev_by_params(struct ib_device *dev,
+if_t ib_get_net_dev_by_params(struct ib_device *dev,
 					    u8 port,
 					    u16 pkey,
 					    const union ib_gid *gid,
 					    const struct sockaddr *addr)
 {
-	struct ifnet *net_dev = NULL;
+	if_t net_dev = NULL;
 	struct ib_client_data *context;
 
 	if (!rdma_protocol_ib(dev, port))
diff --git a/sys/ofed/drivers/infiniband/core/ib_multicast.c b/sys/ofed/drivers/infiniband/core/ib_multicast.c
index 3784a3e5e290..b323f17a99ea 100644
--- a/sys/ofed/drivers/infiniband/core/ib_multicast.c
+++ b/sys/ofed/drivers/infiniband/core/ib_multicast.c
@@ -723,7 +723,7 @@ EXPORT_SYMBOL(ib_sa_get_mcmember_rec);
 
 int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
 			     struct ib_sa_mcmember_rec *rec,
-			     struct ifnet *ndev,
+			     if_t ndev,
 			     enum ib_gid_type gid_type,
 			     struct ib_ah_attr *ah_attr)
 {
diff --git a/sys/ofed/drivers/infiniband/core/ib_roce_gid_mgmt.c b/sys/ofed/drivers/infiniband/core/ib_roce_gid_mgmt.c
index fb19f2944180..1396a4aacf3a 100644
--- a/sys/ofed/drivers/infiniband/core/ib_roce_gid_mgmt.c
+++ b/sys/ofed/drivers/infiniband/core/ib_roce_gid_mgmt.c
@@ -56,7 +56,7 @@ enum gid_op_type {
 
 struct roce_netdev_event_work {
 	struct work_struct work;
-	struct ifnet *ndev;
+	if_t ndev;
 };
 
 struct roce_rescan_work {
@@ -91,7 +91,7 @@ unsigned long roce_gid_type_mask_support(struct ib_device *ib_dev, u8 port)
 EXPORT_SYMBOL(roce_gid_type_mask_support);
 
 static void update_gid(enum gid_op_type gid_op, struct ib_device *ib_dev,
-    u8 port, union ib_gid *gid, struct ifnet *ndev)
+    u8 port, union ib_gid *gid, if_t ndev)
 {
 	int i;
 	unsigned long gid_type_mask = roce_gid_type_mask_support(ib_dev, port);
@@ -119,9 +119,9 @@ static void update_gid(enum gid_op_type gid_op, struct ib_device *ib_dev,
 
 static int
 roce_gid_match_netdev(struct ib_device *ib_dev, u8 port,
-    struct ifnet *idev, void *cookie)
+    if_t idev, void *cookie)
 {
-	struct ifnet *ndev = (struct ifnet *)cookie;
+	if_t ndev = (if_t )cookie;
 	if (idev == NULL)
 		return (0);
 	return (ndev == idev);
@@ -129,7 +129,7 @@ roce_gid_match_netdev(struct ib_device *ib_dev, u8 port,
 
 static int
 roce_gid_match_all(struct ib_device *ib_dev, u8 port,
-    struct ifnet *idev, void *cookie)
+    if_t idev, void *cookie)
 {
 	if (idev == NULL)
 		return (0);
@@ -138,7 +138,7 @@ roce_gid_match_all(struct ib_device *ib_dev, u8 port,
 
 static int
 roce_gid_enum_netdev_default(struct ib_device *ib_dev,
-    u8 port, struct ifnet *idev)
+    u8 port, if_t idev)
 {
 	unsigned long gid_type_mask;
 
@@ -150,32 +150,81 @@ roce_gid_enum_netdev_default(struct ib_device *ib_dev,
 	return (hweight_long(gid_type_mask));
 }
 
+struct ipx_entry {
+	STAILQ_ENTRY(ipx_entry)	entry;
+	union ipx_addr {
+		struct sockaddr sa[0];
+		struct sockaddr_in v4;
+		struct sockaddr_in6 v6;
+	} ipx_addr;
+	if_t ndev;
+};
+
+STAILQ_HEAD(ipx_queue, ipx_entry);
+
+#ifdef INET
+static u_int
+roce_gid_update_addr_ifa4_cb(void *arg, struct ifaddr *ifa, u_int count)
+{
+	struct ipx_queue *ipx_head = arg;
+	struct ipx_entry *entry;
+
+	entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
+	if (entry == NULL) {
+		pr_warn("roce_gid_update_addr_callback: "
+		    "couldn't allocate entry for IPv4 update\n");
+		return (0);
+	}
+	entry->ipx_addr.v4 = *((struct sockaddr_in *)ifa->ifa_addr);
+	entry->ndev = ifa->ifa_ifp;
+	STAILQ_INSERT_TAIL(ipx_head, entry, entry);
+
+	return (1);
+}
+#endif
+
+#ifdef INET6
+static u_int
+roce_gid_update_addr_ifa6_cb(void *arg, struct ifaddr *ifa, u_int count)
+{
+	struct ipx_queue *ipx_head = arg;
+	struct ipx_entry *entry;
+
+	entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
+	if (entry == NULL) {
+		pr_warn("roce_gid_update_addr_callback: "
+		    "couldn't allocate entry for IPv6 update\n");
+		return (0);
+	}
+	entry->ipx_addr.v6 = *((struct sockaddr_in6 *)ifa->ifa_addr);
+	entry->ndev = ifa->ifa_ifp;
+
+	/* trash IPv6 scope ID */
+	sa6_recoverscope(&entry->ipx_addr.v6);
+	entry->ipx_addr.v6.sin6_scope_id = 0;
+
+	STAILQ_INSERT_TAIL(ipx_head, entry, entry);
+
+	return (1);
+}
+#endif
+
 static void
 roce_gid_update_addr_callback(struct ib_device *device, u8 port,
-    struct ifnet *ndev, void *cookie)
+    if_t ndev, void *cookie)
 {
-	struct ipx_entry {
-		STAILQ_ENTRY(ipx_entry)	entry;
-		union ipx_addr {
-			struct sockaddr sa[0];
-			struct sockaddr_in v4;
-			struct sockaddr_in6 v6;
-		} ipx_addr;
-		struct ifnet *ndev;
*** 1566 LINES SKIPPED ***