Page MenuHomeFreeBSD

D38960.id119952.diff
No OneTemporary

D38960.id119952.diff

diff --git a/sys/contrib/rdma/krping/krping.c b/sys/contrib/rdma/krping/krping.c
--- a/sys/contrib/rdma/krping/krping.c
+++ b/sys/contrib/rdma/krping/krping.c
@@ -1988,7 +1988,7 @@
CURVNET_RESTORE();
if (ifp == NULL)
return (0);
- retval = ifp->if_index;
+ retval = if_getindex(ifp);
if_rele(ifp);
return (retval);
}
diff --git a/sys/dev/irdma/fbsd_kcompat.c b/sys/dev/irdma/fbsd_kcompat.c
--- a/sys/dev/irdma/fbsd_kcompat.c
+++ b/sys/dev/irdma/fbsd_kcompat.c
@@ -183,6 +183,32 @@
return ret_code;
}
+static u_int
+irdma_add_ipv6_cb(void *arg, struct ifaddr *addr, u_int count __unused)
+{
+ struct sockaddr_in6 *sin6;
+ struct irdma_device *iwdev = arg;
+ u32 local_ipaddr6[4] = {};
+ char ip6buf[INET6_ADDRSTRLEN];
+ u8 *mac_addr;
+
+ sin6 = (struct sockaddr_in6 *)addr->ifa_addr;
+
+ irdma_copy_ip_ntohl(local_ipaddr6, (u32 *)&sin6->sin6_addr);
+
+ mac_addr = if_getlladdr(addr->ifa_ifp);
+
+ printf("%s:%d IP=%s, MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ __func__, __LINE__,
+ ip6_sprintf(ip6buf, &sin6->sin6_addr),
+ mac_addr[0], mac_addr[1], mac_addr[2],
+ mac_addr[3], mac_addr[4], mac_addr[5]);
+
+ irdma_manage_arp_cache(iwdev->rf, mac_addr, local_ipaddr6,
+ IRDMA_ARP_ADD);
+ return (0);
+}
+
/**
* irdma_add_ipv6_addr - add ipv6 address to the hw arp table
* @iwdev: irdma device
@@ -191,32 +217,37 @@
static void
irdma_add_ipv6_addr(struct irdma_device *iwdev, struct ifnet *ifp)
{
- struct ifaddr *ifa, *tmp;
- struct sockaddr_in6 *sin6;
- u32 local_ipaddr6[4];
- u8 *mac_addr;
- char ip6buf[INET6_ADDRSTRLEN];
-
if_addr_rlock(ifp);
- IRDMA_TAILQ_FOREACH_SAFE(ifa, &ifp->if_addrhead, ifa_link, tmp) {
- sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
- if (sin6->sin6_family != AF_INET6)
- continue;
+ if_foreach_addr_type(ifp, AF_INET6, irdma_add_ipv6_cb, iwdev);
+ if_addr_runlock(ifp);
+}
- irdma_copy_ip_ntohl(local_ipaddr6, (u32 *)&sin6->sin6_addr);
- mac_addr = IF_LLADDR(ifp);
+static u_int
+irdma_add_ipv4_cb(void *arg, struct ifaddr *addr, u_int count __unused)
+{
+ struct sockaddr_in *sin;
+ struct irdma_device *iwdev = arg;
+ u32 ip_addr[4] = {};
+ uint8_t *mac_addr;
- printf("%s:%d IP=%s, MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
- __func__, __LINE__,
- ip6_sprintf(ip6buf, &sin6->sin6_addr),
- mac_addr[0], mac_addr[1], mac_addr[2],
- mac_addr[3], mac_addr[4], mac_addr[5]);
+ sin = (struct sockaddr_in *)addr->ifa_addr;
- irdma_manage_arp_cache(iwdev->rf, mac_addr, local_ipaddr6,
- IRDMA_ARP_ADD);
+ ip_addr[0] = ntohl(sin->sin_addr.s_addr);
- }
- if_addr_runlock(ifp);
+ mac_addr = if_getlladdr(addr->ifa_ifp);
+
+ printf("%s:%d IP=%d.%d.%d.%d, MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ __func__, __LINE__,
+ ip_addr[0] >> 24,
+ (ip_addr[0] >> 16) & 0xFF,
+ (ip_addr[0] >> 8) & 0xFF,
+ ip_addr[0] & 0xFF,
+ mac_addr[0], mac_addr[1], mac_addr[2],
+ mac_addr[3], mac_addr[4], mac_addr[5]);
+
+ irdma_manage_arp_cache(iwdev->rf, mac_addr, ip_addr,
+ IRDMA_ARP_ADD);
+ return (0);
}
/**
@@ -227,32 +258,8 @@
static void
irdma_add_ipv4_addr(struct irdma_device *iwdev, struct ifnet *ifp)
{
- struct ifaddr *ifa;
- struct sockaddr_in *sin;
- u32 ip_addr[4] = {};
- u8 *mac_addr;
-
if_addr_rlock(ifp);
- IRDMA_TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
- sin = (struct sockaddr_in *)ifa->ifa_addr;
- if (sin->sin_family != AF_INET)
- continue;
-
- ip_addr[0] = ntohl(sin->sin_addr.s_addr);
- mac_addr = IF_LLADDR(ifp);
-
- printf("%s:%d IP=%d.%d.%d.%d, MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
- __func__, __LINE__,
- ip_addr[0] >> 24,
- (ip_addr[0] >> 16) & 0xFF,
- (ip_addr[0] >> 8) & 0xFF,
- ip_addr[0] & 0xFF,
- mac_addr[0], mac_addr[1], mac_addr[2],
- mac_addr[3], mac_addr[4], mac_addr[5]);
-
- irdma_manage_arp_cache(iwdev->rf, mac_addr, ip_addr,
- IRDMA_ARP_ADD);
- }
+ if_foreach_addr_type(ifp, AF_INET, irdma_add_ipv4_cb, iwdev);
if_addr_runlock(ifp);
}
@@ -271,7 +278,7 @@
irdma_add_ipv4_addr(iwdev, ifp);
irdma_add_ipv6_addr(iwdev, ifp);
- for (i = 0; ifp->if_vlantrunk != NULL && i < VLAN_N_VID; ++i) {
+ for (i = 0; if_getvlantrunk(ifp) != NULL && i < VLAN_N_VID; ++i) {
ifv = VLAN_DEVAT(ifp, i);
if (!ifv)
continue;
@@ -293,7 +300,7 @@
if (!ifa || !ifa->ifa_addr || !ifp)
return;
if (rf->iwdev->netdev != ifp) {
- for (i = 0; rf->iwdev->netdev->if_vlantrunk != NULL && i < VLAN_N_VID; ++i) {
+ for (i = 0; if_getvlantrunk(rf->iwdev->netdev) != NULL && i < VLAN_N_VID; ++i) {
NET_EPOCH_ENTER(et);
ifv = VLAN_DEVAT(rf->iwdev->netdev, i);
NET_EPOCH_EXIT(et);
@@ -467,7 +474,7 @@
dst_addr.sin6_family = AF_INET6;
dst_addr.sin6_len = sizeof(dst_addr);
- dst_addr.sin6_scope_id = iwdev->netdev->if_index;
+ dst_addr.sin6_scope_id = if_getindex(iwdev->netdev);
irdma_copy_ip_htonl(dst_addr.sin6_addr.__u6_addr.__u6_addr32, dest);
err = irdma_get_dst_mac(cm_node, (struct sockaddr *)&dst_addr, dst_mac);
diff --git a/sys/dev/irdma/icrdma.c b/sys/dev/irdma/icrdma.c
--- a/sys/dev/irdma/icrdma.c
+++ b/sys/dev/irdma/icrdma.c
@@ -55,7 +55,7 @@
*/
char irdma_driver_version[] = "1.1.11-k";
-#define pf_if_d(peer) peer->ifp->if_dunit
+#define pf_if_d(peer) if_getdunit(peer->ifp)
/**
* irdma_init_tunable - prepare tunables
diff --git a/sys/dev/irdma/irdma_cm.c b/sys/dev/irdma/irdma_cm.c
--- a/sys/dev/irdma/irdma_cm.c
+++ b/sys/dev/irdma/irdma_cm.c
@@ -1630,12 +1630,13 @@
* Returns the net_device of the IPv6 address and also sets the
* vlan id and mac for that address.
*/
-struct ifnet *
+if_t
irdma_netdev_vlan_ipv6(u32 *addr, u16 *vlan_id, u8 *mac)
{
- struct ifnet *ip_dev = NULL;
+ if_t ip_dev = NULL;
struct in6_addr laddr6;
u16 scope_id = 0;
+ struct ifaddr *ifa;
irdma_copy_ip_htonl(laddr6.__u6_addr.__u6_addr32, addr);
if (vlan_id)
@@ -1651,8 +1652,9 @@
if (ip_dev) {
if (vlan_id)
*vlan_id = rdma_vlan_dev_vlan_id(ip_dev);
- if (ip_dev->if_addr && ip_dev->if_addr->ifa_addr && mac)
- ether_addr_copy(mac, IF_LLADDR(ip_dev));
+ ifa = if_getifaddr(ip_dev);
+ if (ifa && ifa->ifa_addr && mac)
+ ether_addr_copy(mac, if_getlladdr(ip_dev));
}
return ip_dev;
@@ -1665,7 +1667,7 @@
u16
irdma_get_vlan_ipv4(u32 *addr)
{
- struct ifnet *netdev;
+ if_t netdev;
u16 vlan_id = 0xFFFF;
netdev = ip_ifp_find(&init_net, htonl(addr[0]));
@@ -1677,179 +1679,150 @@
return vlan_id;
}
+struct irdma_add_mqh_cbs {
+ struct irdma_device *iwdev;
+ struct irdma_cm_info *cm_info;
+ struct irdma_cm_listener *cm_listen_node;
+};
+
/**
- * irdma_add_mqh_6 - Adds multiple qhashes for IPv6
- * @iwdev: iWarp device
- * @cm_info: CM info for parent listen node
- * @cm_parent_listen_node: The parent listen node
+ * irdma_add_mqh_6_ifa - Adds multiple qhashes for IPv6
+ * @arg: Calback argument structure from irdma_add_mqh
+ * @ifa: Current address to compute against
+ * @count: Current cumulative output of all callbacks in this iteration
*
- * Adds a qhash and a child listen node for every IPv6 address
+ * Adds a qhash and a child listen node for a single IPv6 address
* on the adapter and adds the associated qhash filter
*/
-static int
-irdma_add_mqh_6(struct irdma_device *iwdev,
- struct irdma_cm_info *cm_info,
- struct irdma_cm_listener *cm_parent_listen_node)
+static u_int
+irdma_add_mqh_6_ifa(void *arg, struct ifaddr *ifa, u_int count)
{
- struct ifnet *ip_dev;
- struct ifaddr *ifp;
+ struct irdma_add_mqh_cbs *cbs = arg;
struct irdma_cm_listener *child_listen_node;
+ struct irdma_cm_info *cm_info = cbs->cm_info;
+ struct irdma_device *iwdev = cbs->iwdev;
+ struct irdma_cm_listener *cm_parent_listen_node = cbs->cm_listen_node;
+ if_t ip_dev = ifa->ifa_ifp;
unsigned long flags;
- int ret = 0;
-
- IFNET_RLOCK();
- IRDMA_TAILQ_FOREACH((ip_dev), &V_ifnet, if_link) {
- if (!(ip_dev->if_flags & IFF_UP))
- continue;
-
- if (((rdma_vlan_dev_vlan_id(ip_dev) >= VLAN_N_VID) ||
- (rdma_vlan_dev_real_dev(ip_dev) != iwdev->netdev)) &&
- ip_dev != iwdev->netdev)
- continue;
-
- if_addr_rlock(ip_dev);
- IRDMA_TAILQ_FOREACH(ifp, &ip_dev->if_addrhead, ifa_link) {
- irdma_debug(&iwdev->rf->sc_dev, IRDMA_DEBUG_CM,
- "IP=%pI6, vlan_id=%d, MAC=%pM\n",
- &((struct sockaddr_in6 *)ifp->ifa_addr)->sin6_addr, rdma_vlan_dev_vlan_id(ip_dev),
- IF_LLADDR(ip_dev));
- if (((struct sockaddr_in6 *)ifp->ifa_addr)->sin6_family != AF_INET6)
- continue;
- child_listen_node = kzalloc(sizeof(*child_listen_node), GFP_KERNEL);
- irdma_debug(&iwdev->rf->sc_dev, IRDMA_DEBUG_CM,
- "Allocating child listener %p\n",
- child_listen_node);
- if (!child_listen_node) {
- irdma_debug(&iwdev->rf->sc_dev, IRDMA_DEBUG_CM, "listener memory allocation\n");
- ret = -ENOMEM;
- if_addr_runlock(ip_dev);
- goto exit;
- }
+ int ret;
- memcpy(child_listen_node, cm_parent_listen_node,
- sizeof(*child_listen_node));
- cm_info->vlan_id = rdma_vlan_dev_vlan_id(ip_dev);
- child_listen_node->vlan_id = cm_info->vlan_id;
- irdma_copy_ip_ntohl(child_listen_node->loc_addr,
- ((struct sockaddr_in6 *)ifp->ifa_addr)->sin6_addr.__u6_addr.__u6_addr32);
- memcpy(cm_info->loc_addr, child_listen_node->loc_addr,
- sizeof(cm_info->loc_addr));
- if (!iwdev->vsi.dscp_mode)
- cm_info->user_pri =
- irdma_get_egress_vlan_prio(child_listen_node->loc_addr,
- cm_info->user_pri,
- false);
- ret = irdma_manage_qhash(iwdev, cm_info,
- IRDMA_QHASH_TYPE_TCP_SYN,
- IRDMA_QHASH_MANAGE_TYPE_ADD,
- NULL, true);
- if (ret) {
- kfree(child_listen_node);
- continue;
- }
+ irdma_debug(iwdev_to_idev(iwdev), IRDMA_DEBUG_CM,
+ "IP=%pI6, vlan_id=%d, MAC=%pM\n",
+ &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr, rdma_vlan_dev_vlan_id(ip_dev),
+ if_getlladdr(ip_dev));
+ child_listen_node = kzalloc(sizeof(*child_listen_node), GFP_KERNEL);
+ irdma_debug(iwdev_to_idev(iwdev), IRDMA_DEBUG_CM,
+ "Allocating child listener %p\n",
+ child_listen_node);
+ if (!child_listen_node) {
+ irdma_debug(iwdev_to_idev(iwdev),
+ IRDMA_DEBUG_CM,
+ "listener memory allocation\n");
+ ret = -ENOMEM;
+ return (ret);
+ }
- child_listen_node->qhash_set = true;
- spin_lock_irqsave(&iwdev->cm_core.listen_list_lock, flags);
- list_add(&child_listen_node->child_listen_list,
- &cm_parent_listen_node->child_listen_list);
- spin_unlock_irqrestore(&iwdev->cm_core.listen_list_lock, flags);
- cm_parent_listen_node->cm_core->stats_listen_nodes_created++;
- }
- if_addr_runlock(ip_dev);
+ memcpy(child_listen_node, cm_parent_listen_node,
+ sizeof(*child_listen_node));
+ cm_info->vlan_id = rdma_vlan_dev_vlan_id(ip_dev);
+ child_listen_node->vlan_id = cm_info->vlan_id;
+ irdma_copy_ip_ntohl(child_listen_node->loc_addr,
+ ((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr.__u6_addr.__u6_addr32);
+ memcpy(cm_info->loc_addr, child_listen_node->loc_addr,
+ sizeof(cm_info->loc_addr));
+ if (!iwdev->vsi.dscp_mode)
+ cm_info->user_pri =
+ irdma_get_egress_vlan_prio(child_listen_node->loc_addr,
+ cm_info->user_pri,
+ false);
+ ret = irdma_manage_qhash(iwdev, cm_info,
+ IRDMA_QHASH_TYPE_TCP_SYN,
+ IRDMA_QHASH_MANAGE_TYPE_ADD,
+ NULL, true);
+ if (ret) {
+ kfree(child_listen_node);
+ return (ret);
}
-exit:
- IFNET_RUNLOCK();
- return ret;
+ child_listen_node->qhash_set = true;
+ spin_lock_irqsave(&iwdev->cm_core.listen_list_lock, flags);
+ list_add(&child_listen_node->child_listen_list,
+ &cm_parent_listen_node->child_listen_list);
+ spin_unlock_irqrestore(&iwdev->cm_core.listen_list_lock, flags);
+ cm_parent_listen_node->cm_core->stats_listen_nodes_created++;
+
+ return (0);
}
/**
- * irdma_add_mqh_4 - Adds multiple qhashes for IPv4
- * @iwdev: iWarp device
- * @cm_info: CM info for parent listen node
- * @cm_parent_listen_node: The parent listen node
+ * irdma_add_mqh_4_ifa - Adds multiple qhashes for IPv4
+ * @arg: Calback argument structure from irdma_add_mqh
+ * @ifa: Current address to compute against
+ * @count: Current cumulative output of all callbacks in this iteration
*
- * Adds a qhash and a child listen node for every IPv4 address
+ * Adds a qhash and a child listen node for a single IPv4 address
* on the adapter and adds the associated qhash filter
*/
-static int
-irdma_add_mqh_4(struct irdma_device *iwdev,
- struct irdma_cm_info *cm_info,
- struct irdma_cm_listener *cm_parent_listen_node)
+static u_int
+irdma_add_mqh_4_ifa(void *arg, struct ifaddr *ifa, u_int count)
{
- struct ifnet *ip_dev;
+ struct irdma_add_mqh_cbs *cbs = arg;
struct irdma_cm_listener *child_listen_node;
+ struct irdma_cm_info *cm_info = cbs->cm_info;
+ struct irdma_device *iwdev = cbs->iwdev;
+ struct irdma_cm_listener *cm_parent_listen_node = cbs->cm_listen_node;
+ if_t ip_dev = ifa->ifa_ifp;
unsigned long flags;
- struct ifaddr *ifa;
- int ret = 0;
-
- IFNET_RLOCK();
- IRDMA_TAILQ_FOREACH((ip_dev), &V_ifnet, if_link) {
- if (!(ip_dev->if_flags & IFF_UP))
- continue;
-
- if (((rdma_vlan_dev_vlan_id(ip_dev) >= VLAN_N_VID) ||
- (rdma_vlan_dev_real_dev(ip_dev) != iwdev->netdev)) &&
- ip_dev != iwdev->netdev)
- continue;
-
- if_addr_rlock(ip_dev);
- IRDMA_TAILQ_FOREACH(ifa, &ip_dev->if_addrhead, ifa_link) {
- irdma_debug(&iwdev->rf->sc_dev, IRDMA_DEBUG_CM,
- "Allocating child CM Listener forIP=%pI4, vlan_id=%d, MAC=%pM\n",
- &ifa->ifa_addr, rdma_vlan_dev_vlan_id(ip_dev),
- IF_LLADDR(ip_dev));
- if (((struct sockaddr_in *)ifa->ifa_addr)->sin_family != AF_INET)
- continue;
- child_listen_node = kzalloc(sizeof(*child_listen_node), GFP_KERNEL);
- cm_parent_listen_node->cm_core->stats_listen_nodes_created++;
- irdma_debug(&iwdev->rf->sc_dev, IRDMA_DEBUG_CM,
- "Allocating child listener %p\n",
- child_listen_node);
- if (!child_listen_node) {
- irdma_debug(&iwdev->rf->sc_dev, IRDMA_DEBUG_CM, "listener memory allocation\n");
- if_addr_runlock(ip_dev);
- ret = -ENOMEM;
- goto exit;
- }
+ int ret;
- memcpy(child_listen_node, cm_parent_listen_node,
- sizeof(*child_listen_node));
- child_listen_node->vlan_id = rdma_vlan_dev_vlan_id(ip_dev);
- cm_info->vlan_id = child_listen_node->vlan_id;
- child_listen_node->loc_addr[0] =
- ntohl(((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr);
- memcpy(cm_info->loc_addr, child_listen_node->loc_addr,
- sizeof(cm_info->loc_addr));
- if (!iwdev->vsi.dscp_mode)
- cm_info->user_pri =
- irdma_get_egress_vlan_prio(child_listen_node->loc_addr,
- cm_info->user_pri,
- true);
- ret = irdma_manage_qhash(iwdev, cm_info,
- IRDMA_QHASH_TYPE_TCP_SYN,
- IRDMA_QHASH_MANAGE_TYPE_ADD,
- NULL, true);
- if (ret) {
- kfree(child_listen_node);
- cm_parent_listen_node->cm_core
- ->stats_listen_nodes_created--;
- continue;
- }
+ irdma_debug(iwdev_to_idev(iwdev), IRDMA_DEBUG_CM,
+ "Allocating child CM Listener forIP=%pI4, vlan_id=%d, MAC=%pM\n",
+ &ifa->ifa_addr,
+ rdma_vlan_dev_vlan_id(ip_dev), if_getlladdr(ip_dev));
+ child_listen_node = kzalloc(sizeof(*child_listen_node), GFP_KERNEL);
+ cm_parent_listen_node->cm_core->stats_listen_nodes_created++;
+ irdma_debug(iwdev_to_idev(iwdev), IRDMA_DEBUG_CM,
+ "Allocating child listener %p\n",
+ child_listen_node);
+ if (!child_listen_node) {
+ irdma_debug(iwdev_to_idev(iwdev),
+ IRDMA_DEBUG_CM,
+ "listener memory allocation\n");
+ ret = -ENOMEM;
+ return (ret);
+ }
- child_listen_node->qhash_set = true;
- spin_lock_irqsave(&iwdev->cm_core.listen_list_lock,
- flags);
- list_add(&child_listen_node->child_listen_list,
- &cm_parent_listen_node->child_listen_list);
- spin_unlock_irqrestore(&iwdev->cm_core.listen_list_lock, flags);
- }
- if_addr_runlock(ip_dev);
+ memcpy(child_listen_node, cm_parent_listen_node,
+ sizeof(*child_listen_node));
+ cm_info->vlan_id = rdma_vlan_dev_vlan_id(ip_dev);
+ child_listen_node->vlan_id = cm_info->vlan_id;
+ child_listen_node->loc_addr[0] =
+ ntohl(((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr);
+ memcpy(cm_info->loc_addr, child_listen_node->loc_addr,
+ sizeof(cm_info->loc_addr));
+ if (!iwdev->vsi.dscp_mode)
+ cm_info->user_pri =
+ irdma_get_egress_vlan_prio(child_listen_node->loc_addr,
+ cm_info->user_pri,
+ false);
+ ret = irdma_manage_qhash(iwdev, cm_info,
+ IRDMA_QHASH_TYPE_TCP_SYN,
+ IRDMA_QHASH_MANAGE_TYPE_ADD,
+ NULL, true);
+ if (ret) {
+ kfree(child_listen_node);
+ cm_parent_listen_node->cm_core->stats_listen_nodes_created--;
+ return (ret);
}
-exit:
- IFNET_RUNLOCK();
- return ret;
+ child_listen_node->qhash_set = true;
+ spin_lock_irqsave(&iwdev->cm_core.listen_list_lock, flags);
+ list_add(&child_listen_node->child_listen_list,
+ &cm_parent_listen_node->child_listen_list);
+ spin_unlock_irqrestore(&iwdev->cm_core.listen_list_lock, flags);
+ cm_parent_listen_node->cm_core->stats_listen_nodes_created++;
+
+ return (0);
}
/**
@@ -1863,21 +1836,42 @@
struct irdma_cm_info *cm_info,
struct irdma_cm_listener *cm_listen_node)
{
+ struct epoch_tracker et;
+ struct irdma_add_mqh_cbs cbs;
+ struct if_iter iter;
+ if_t ifp;
int err;
+
+ cbs.iwdev = iwdev;
+ cbs.cm_info = cm_info;
+ cbs.cm_listen_node = cm_listen_node;
+
VNET_ITERATOR_DECL(vnet_iter);
VNET_LIST_RLOCK();
+ NET_EPOCH_ENTER(et);
VNET_FOREACH(vnet_iter) {
- IFNET_RLOCK();
CURVNET_SET_QUIET(vnet_iter);
+ for (ifp = if_iter_start(&iter); ifp != NULL; ifp = if_iter_next(&iter)) {
+ if (!(if_getflags(ifp) & IFF_UP))
+ continue;
- if (cm_info->ipv4)
- err = irdma_add_mqh_4(iwdev, cm_info, cm_listen_node);
- else
- err = irdma_add_mqh_6(iwdev, cm_info, cm_listen_node);
+ if (((rdma_vlan_dev_vlan_id(ifp) >= VLAN_N_VID) ||
+ (rdma_vlan_dev_real_dev(ifp) != iwdev->netdev)) &&
+ ifp != iwdev->netdev)
+ continue;
+
+ if_addr_rlock(ifp);
+ if (cm_info->ipv4)
+ err = if_foreach_addr_type(ifp, AF_INET, irdma_add_mqh_4_ifa, &cbs);
+ else
+ err = if_foreach_addr_type(ifp, AF_INET6, irdma_add_mqh_6_ifa, &cbs);
+ if_addr_runlock(ifp);
+ }
+ if_iter_finish(&iter);
CURVNET_RESTORE();
- IFNET_RUNLOCK();
}
+ NET_EPOCH_EXIT(et);
VNET_LIST_RUNLOCK();
return err;
@@ -2110,7 +2104,7 @@
struct vnet *vnet = rdma_id->route.addr.dev_addr.net;
#endif
- ether_addr_copy(ah_info.mac_addr, IF_LLADDR(iwdev->netdev));
+ ether_addr_copy(ah_info.mac_addr, if_getlladdr(iwdev->netdev));
ah_info.hop_ttl = 0x40;
ah_info.tc_tos = cm_node->tos;
@@ -2178,7 +2172,7 @@
{
struct irdma_cm_node *cm_node;
int arpindex;
- struct ifnet *netdev = iwdev->netdev;
+ if_t netdev = iwdev->netdev;
/* create an hte and cm_node for this instance */
cm_node = kzalloc(sizeof(*cm_node), GFP_ATOMIC);
@@ -2227,7 +2221,7 @@
cm_node->listener = listener;
cm_node->cm_id = cm_info->cm_id;
- ether_addr_copy(cm_node->loc_mac, IF_LLADDR(netdev));
+ ether_addr_copy(cm_node->loc_mac, if_getlladdr(netdev));
spin_lock_init(&cm_node->retrans_list_lock);
cm_node->ack_rcvd = false;
diff --git a/sys/dev/irdma/irdma_hw.c b/sys/dev/irdma/irdma_hw.c
--- a/sys/dev/irdma/irdma_hw.c
+++ b/sys/dev/irdma/irdma_hw.c
@@ -1122,7 +1122,7 @@
&iwdev->mac_ip_table_idx);
if (!status) {
status = irdma_add_local_mac_entry(iwdev->rf,
- (const u8 *)IF_LLADDR(iwdev->netdev),
+ (const u8 *)if_getlladdr(iwdev->netdev),
(u8)iwdev->mac_ip_table_idx);
if (status)
irdma_del_local_mac_entry(iwdev->rf,
@@ -2605,7 +2605,7 @@
}
info->ipv4_valid = cminfo->ipv4;
info->user_pri = cminfo->user_pri;
- ether_addr_copy(info->mac_addr, IF_LLADDR(iwdev->netdev));
+ ether_addr_copy(info->mac_addr, if_getlladdr(iwdev->netdev));
info->qp_num = cminfo->qh_qpid;
info->dest_port = cminfo->loc_port;
info->dest_ip[0] = cminfo->loc_addr[0];
diff --git a/sys/dev/irdma/irdma_kcompat.c b/sys/dev/irdma/irdma_kcompat.c
--- a/sys/dev/irdma/irdma_kcompat.c
+++ b/sys/dev/irdma/irdma_kcompat.c
@@ -777,7 +777,7 @@
ah_info = &sc_ah->ah_info;
ah_info->ah_idx = ah_id;
ah_info->pd_idx = pd->sc_pd.pd_id;
- ether_addr_copy(ah_info->mac_addr, IF_LLADDR(iwdev->netdev));
+ ether_addr_copy(ah_info->mac_addr, if_getlladdr(iwdev->netdev));
if (attr->ah_flags & IB_AH_GRH) {
ah_info->flow_label = attr->grh.flow_label;
@@ -787,7 +787,7 @@
ether_addr_copy(dmac, attr->dmac);
- irdma_fill_ah_info(iwdev->netdev->if_vnet, ah_info, &sgid_attr, &sgid_addr.saddr, &dgid_addr.saddr,
+ irdma_fill_ah_info(if_getvnet(iwdev->netdev), ah_info, &sgid_attr, &sgid_addr.saddr, &dgid_addr.saddr,
dmac, ah->av.net_type);
err = irdma_create_ah_vlan_tag(iwdev, pd, ah_info, &sgid_attr, dmac);
@@ -946,7 +946,7 @@
ah_info->ah_idx = ah_id;
ah_info->pd_idx = pd->sc_pd.pd_id;
- ether_addr_copy(ah_info->mac_addr, IF_LLADDR(iwdev->netdev));
+ ether_addr_copy(ah_info->mac_addr, if_getlladdr(iwdev->netdev));
if (attr->ah_flags & IB_AH_GRH) {
ah_info->flow_label = attr->grh.flow_label;
ah_info->hop_ttl = attr->grh.hop_limit;
@@ -957,7 +957,7 @@
ib_resolve_eth_dmac(ibpd->device, attr);
irdma_ether_copy(dmac, attr);
- irdma_fill_ah_info(iwdev->netdev->if_vnet, ah_info, &sgid_attr, &sgid_addr.saddr, &dgid_addr.saddr,
+ irdma_fill_ah_info(if_getvnet(iwdev->netdev), ah_info, &sgid_attr, &sgid_addr.saddr, &dgid_addr.saddr,
dmac, ah->av.net_type);
err = irdma_create_ah_vlan_tag(iwdev, pd, ah_info, &sgid_attr, dmac);
@@ -1733,7 +1733,7 @@
if (sgid_attr.ndev) {
*vlan_id = rdma_vlan_dev_vlan_id(sgid_attr.ndev);
- ether_addr_copy(iwqp->ctx_info.roce_info->mac_addr, IF_LLADDR(sgid_attr.ndev));
+ ether_addr_copy(iwqp->ctx_info.roce_info->mac_addr, if_getlladdr(sgid_attr.ndev));
}
av->net_type = kc_rdma_gid_attr_network_type(sgid_attr,
@@ -2002,7 +2002,7 @@
#endif
struct ib_device *
-ib_device_get_by_netdev(struct ifnet *netdev, int driver_id)
+ib_device_get_by_netdev(if_t netdev, int driver_id)
{
struct irdma_device *iwdev;
struct irdma_handler *hdl;
@@ -2131,17 +2131,18 @@
struct ib_port_attr *props)
{
struct irdma_device *iwdev = to_iwdev(ibdev);
- struct ifnet *netdev = iwdev->netdev;
+ if_t netdev = iwdev->netdev;
/* no need to zero out pros here. done by caller */
props->max_mtu = IB_MTU_4096;
- props->active_mtu = ib_mtu_int_to_enum(netdev->if_mtu);
+ props->active_mtu = ib_mtu_int_to_enum(if_getmtu(netdev));
props->lid = 1;
props->lmc = 0;
props->sm_lid = 0;
props->sm_sl = 0;
- if ((netdev->if_link_state == LINK_STATE_UP) && (netdev->if_drv_flags & IFF_DRV_RUNNING)) {
+ if ((if_getlinkstate(netdev) == LINK_STATE_UP) &&
+ (if_getdrvflags(netdev) & IFF_DRV_RUNNING)) {
props->state = IB_PORT_ACTIVE;
props->phys_state = IB_PORT_PHYS_STATE_LINK_UP;
} else {
@@ -2274,7 +2275,7 @@
struct irdma_device *iwdev = to_iwdev(ibdev);
memset(gid->raw, 0, sizeof(gid->raw));
- ether_addr_copy(gid->raw, IF_LLADDR(iwdev->netdev));
+ ether_addr_copy(gid->raw, if_getlladdr(iwdev->netdev));
return 0;
}
@@ -2355,7 +2356,7 @@
if (!netdev)
return -ENODEV;
- netdev_speed = netdev->if_baudrate;
+ netdev_speed = if_getbaudrate(netdev);
dev_put(netdev);
if (netdev_speed <= SPEED_1000) {
*width = IB_WIDTH_1X;
diff --git a/sys/dev/irdma/irdma_verbs.c b/sys/dev/irdma/irdma_verbs.c
--- a/sys/dev/irdma/irdma_verbs.c
+++ b/sys/dev/irdma/irdma_verbs.c
@@ -56,7 +56,7 @@
memset(props, 0, sizeof(*props));
addrconf_addr_eui48((u8 *)&props->sys_image_guid,
- IF_LLADDR(iwdev->netdev));
+ if_getlladdr(iwdev->netdev));
props->fw_ver = (u64)irdma_fw_major_ver(&rf->sc_dev) << 32 |
irdma_fw_minor_ver(&rf->sc_dev);
props->device_cap_flags = IB_DEVICE_MEM_WINDOW |
@@ -737,7 +737,7 @@
udp_info->src_port = 0xc000;
udp_info->dst_port = ROCE_V2_UDP_DPORT;
roce_info = &iwqp->roce_info;
- ether_addr_copy(roce_info->mac_addr, IF_LLADDR(iwdev->netdev));
+ ether_addr_copy(roce_info->mac_addr, if_getlladdr(iwdev->netdev));
roce_info->rd_en = true;
roce_info->wr_rdresp_en = true;
@@ -770,7 +770,7 @@
struct irdma_iwarp_offload_info *iwarp_info;
iwarp_info = &iwqp->iwarp_info;
- ether_addr_copy(iwarp_info->mac_addr, IF_LLADDR(iwdev->netdev));
+ ether_addr_copy(iwarp_info->mac_addr, if_getlladdr(iwdev->netdev));
iwarp_info->rd_en = true;
iwarp_info->wr_rdresp_en = true;
iwarp_info->bind_en = true;
@@ -3507,7 +3507,7 @@
return 0;
}
-static struct ifnet *
+static if_t
irdma_get_netdev(struct ib_device *ibdev, u8 port_num)
{
struct irdma_device *iwdev = to_iwdev(ibdev);
@@ -3627,7 +3627,7 @@
kc_set_roce_uverbs_cmd_mask(iwdev);
iwdev->ibdev.node_type = RDMA_NODE_IB_CA;
addrconf_addr_eui48((u8 *)&iwdev->ibdev.node_guid,
- IF_LLADDR(iwdev->netdev));
+ if_getlladdr(iwdev->netdev));
irdma_set_device_roce_ops(&iwdev->ibdev);
if (iwdev->rf->rdma_ver == IRDMA_GEN_2)
irdma_set_device_mcast_ops(&iwdev->ibdev);
@@ -3640,11 +3640,11 @@
static int
irdma_init_iw_device(struct irdma_device *iwdev)
{
- struct ifnet *netdev = iwdev->netdev;
+ if_t netdev = iwdev->netdev;
iwdev->ibdev.node_type = RDMA_NODE_RNIC;
addrconf_addr_eui48((u8 *)&iwdev->ibdev.node_guid,
- IF_LLADDR(netdev));
+ if_getlladdr(netdev));
iwdev->ibdev.iwcm = kzalloc(sizeof(*iwdev->ibdev.iwcm), GFP_KERNEL);
if (!iwdev->ibdev.iwcm)
return -ENOMEM;

File Metadata

Mime Type
text/plain
Expires
Wed, Oct 22, 4:27 AM (3 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24040599
Default Alt Text
D38960.id119952.diff (24 KB)

Event Timeline