Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F147315324
D41592.id127345.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D41592.id127345.diff
View Options
diff --git a/sys/dev/irdma/fbsd_kcompat.h b/sys/dev/irdma/fbsd_kcompat.h
--- a/sys/dev/irdma/fbsd_kcompat.h
+++ b/sys/dev/irdma/fbsd_kcompat.h
@@ -121,6 +121,20 @@
return (*pinfo)->addr;
}
+
+static inline struct vnet *
+irdma_cmid_to_vnet(struct iw_cm_id *cm_id)
+{
+ struct rdma_cm_id *rdma_id;
+
+ if (!cm_id)
+ return &init_net;
+
+ rdma_id = (struct rdma_cm_id *)cm_id->context;
+
+ return rdma_id->route.addr.dev_addr.net;
+}
+
#if __FreeBSD_version < 1400026
struct ib_cq *irdma_create_cq(struct ib_device *ibdev,
const struct ib_cq_init_attr *attr,
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
@@ -393,8 +393,7 @@
{
struct ifnet *netdev = cm_node->iwdev->netdev;
#ifdef VIMAGE
- struct rdma_cm_id *rdma_id = (struct rdma_cm_id *)cm_node->cm_id->context;
- struct vnet *vnet = rdma_id->route.addr.dev_addr.net;
+ struct vnet *vnet = irdma_cmid_to_vnet(cm_node->cm_id);
#endif
struct ifnet *ifp;
struct llentry *lle;
@@ -492,8 +491,7 @@
struct irdma_cm_info *cm_info)
{
#ifdef VIMAGE
- struct rdma_cm_id *rdma_id = (struct rdma_cm_id *)cm_node->cm_id->context;
- struct vnet *vnet = rdma_id->route.addr.dev_addr.net;
+ struct vnet *vnet = irdma_cmid_to_vnet(cm_node->cm_id);
#endif
int arpindex;
int oldarpindex;
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
@@ -1624,10 +1624,13 @@
* vlan id and mac for that address.
*/
if_t
-irdma_netdev_vlan_ipv6(u32 *addr, u16 *vlan_id, u8 *mac)
+irdma_netdev_vlan_ipv6(struct iw_cm_id *cm_id, u32 *addr, u16 *vlan_id, u8 *mac)
{
if_t ip_dev = NULL;
struct in6_addr laddr6;
+#ifdef VIMAGE
+ struct vnet *vnet = irdma_cmid_to_vnet(cm_id);
+#endif
struct ifaddr *ifa;
u16 scope_id = 0;
@@ -1641,7 +1644,11 @@
IN6_IS_ADDR_MC_INTFACELOCAL(&laddr6))
scope_id = ntohs(laddr6.__u6_addr.__u6_addr16[1]);
+#ifdef VIMAGE
+ ip_dev = ip6_ifp_find(vnet, laddr6, scope_id);
+#else
ip_dev = ip6_ifp_find(&init_net, laddr6, scope_id);
+#endif
if (ip_dev) {
if (vlan_id)
*vlan_id = rdma_vlan_dev_vlan_id(ip_dev);
@@ -1658,12 +1665,19 @@
* @addr: local IPv4 address
*/
u16
-irdma_get_vlan_ipv4(u32 *addr)
+irdma_get_vlan_ipv4(struct iw_cm_id *cm_id, u32 *addr)
{
if_t netdev;
+#ifdef VIMAGE
+ struct vnet *vnet = irdma_cmid_to_vnet(cm_id);
+#endif
u16 vlan_id = 0xFFFF;
+#ifdef VIMAGE
+ netdev = ip_ifp_find(vnet, htonl(addr[0]));
+#else
netdev = ip_ifp_find(&init_net, htonl(addr[0]));
+#endif
if (netdev) {
vlan_id = rdma_vlan_dev_vlan_id(netdev);
dev_put(netdev);
@@ -2060,8 +2074,7 @@
struct irdma_ah_info ah_info = {0};
struct irdma_device *iwdev = cm_node->iwdev;
#ifdef VIMAGE
- struct rdma_cm_id *rdma_id = (struct rdma_cm_id *)cm_node->cm_id->context;
- struct vnet *vnet = rdma_id->route.addr.dev_addr.net;
+ struct vnet *vnet = irdma_cmid_to_vnet(cm_node->cm_id);
#endif
ether_addr_copy(ah_info.mac_addr, if_getlladdr(iwdev->netdev));
@@ -3520,11 +3533,11 @@
if (((struct sockaddr_in *)&cm_id->local_addr)->sin_family == AF_INET) {
cm_node->ipv4 = true;
- cm_node->vlan_id = irdma_get_vlan_ipv4(cm_node->loc_addr);
+ cm_node->vlan_id = irdma_get_vlan_ipv4(cm_id, cm_node->loc_addr);
} else {
cm_node->ipv4 = false;
- irdma_netdev_vlan_ipv6(cm_node->loc_addr, &cm_node->vlan_id,
- NULL);
+ irdma_netdev_vlan_ipv6(cm_id, cm_node->loc_addr,
+ &cm_node->vlan_id, NULL);
}
irdma_debug(&iwdev->rf->sc_dev, IRDMA_DEBUG_CM, "Accept vlan_id=%d\n",
cm_node->vlan_id);
@@ -3719,7 +3732,7 @@
cm_info.rem_addr[0] = ntohl(raddr->sin_addr.s_addr);
cm_info.loc_port = ntohs(laddr->sin_port);
cm_info.rem_port = ntohs(raddr->sin_port);
- cm_info.vlan_id = irdma_get_vlan_ipv4(cm_info.loc_addr);
+ cm_info.vlan_id = irdma_get_vlan_ipv4(cm_id, cm_info.loc_addr);
} else {
if (iwdev->vsi.mtu < IRDMA_MIN_MTU_IPV6)
return -EINVAL;
@@ -3731,7 +3744,7 @@
raddr6->sin6_addr.__u6_addr.__u6_addr32);
cm_info.loc_port = ntohs(laddr6->sin6_port);
cm_info.rem_port = ntohs(raddr6->sin6_port);
- irdma_netdev_vlan_ipv6(cm_info.loc_addr, &cm_info.vlan_id, NULL);
+ irdma_netdev_vlan_ipv6(cm_id, cm_info.loc_addr, &cm_info.vlan_id, NULL);
}
cm_info.cm_id = cm_id;
cm_info.qh_qpid = iwdev->vsi.ilq->qp_id;
@@ -3846,7 +3859,7 @@
cm_info.loc_port = ntohs(laddr->sin_port);
if (laddr->sin_addr.s_addr != htonl(INADDR_ANY)) {
- cm_info.vlan_id = irdma_get_vlan_ipv4(cm_info.loc_addr);
+ cm_info.vlan_id = irdma_get_vlan_ipv4(cm_id, cm_info.loc_addr);
} else {
cm_info.vlan_id = 0xFFFF;
wildcard = true;
@@ -3860,7 +3873,7 @@
laddr6->sin6_addr.__u6_addr.__u6_addr32);
cm_info.loc_port = ntohs(laddr6->sin6_port);
if (!IN6_IS_ADDR_UNSPECIFIED(&laddr6->sin6_addr)) {
- irdma_netdev_vlan_ipv6(cm_info.loc_addr,
+ irdma_netdev_vlan_ipv6(cm_id, cm_info.loc_addr,
&cm_info.vlan_id, NULL);
} else {
cm_info.vlan_id = 0xFFFF;
diff --git a/sys/dev/irdma/irdma_main.h b/sys/dev/irdma/irdma_main.h
--- a/sys/dev/irdma/irdma_main.h
+++ b/sys/dev/irdma/irdma_main.h
@@ -584,8 +584,9 @@
struct irdma_gen_ae_info *info, bool wait);
void irdma_copy_ip_ntohl(u32 *dst, __be32 *src);
void irdma_copy_ip_htonl(__be32 *dst, u32 *src);
-u16 irdma_get_vlan_ipv4(u32 *addr);
-if_t irdma_netdev_vlan_ipv6(u32 *addr, u16 *vlan_id, u8 *mac);
+u16 irdma_get_vlan_ipv4(struct iw_cm_id *cm_id, u32 *addr);
+if_t irdma_netdev_vlan_ipv6(struct iw_cm_id *cm_id, u32 *addr, u16 *vlan_id,
+ u8 *mac);
struct ib_mr *irdma_reg_phys_mr(struct ib_pd *ib_pd, u64 addr, u64 size,
int acc, u64 *iova_start);
int irdma_upload_qp_context(struct irdma_qp *iwqp, bool freeze, bool raw);
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
@@ -3336,7 +3336,7 @@
if (!ipv6_addr_v4mapped((struct in6_addr *)ibgid)) {
irdma_copy_ip_ntohl(ip_addr,
sgid_addr.saddr_in6.sin6_addr.__u6_addr.__u6_addr32);
- irdma_netdev_vlan_ipv6(ip_addr, &vlan_id, NULL);
+ irdma_netdev_vlan_ipv6(iwqp->cm_id, ip_addr, &vlan_id, NULL);
ipv4 = false;
irdma_debug(&iwdev->rf->sc_dev, IRDMA_DEBUG_VERBS,
"qp_id=%d, IP6address=%x:%x:%x:%x\n", ibqp->qp_num,
@@ -3345,7 +3345,7 @@
} else {
ip_addr[0] = ntohl(sgid_addr.saddr_in.sin_addr.s_addr);
ipv4 = true;
- vlan_id = irdma_get_vlan_ipv4(ip_addr);
+ vlan_id = irdma_get_vlan_ipv4(iwqp->cm_id, ip_addr);
irdma_mcast_mac_v4(ip_addr, dmac);
irdma_debug(&iwdev->rf->sc_dev, IRDMA_DEBUG_VERBS,
"qp_id=%d, IP4address=%x, MAC=%x:%x:%x:%x:%x:%x\n",
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Mar 10, 9:54 PM (1 h, 47 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29514668
Default Alt Text
D41592.id127345.diff (6 KB)
Attached To
Mode
D41592: irdma(4): use related vnet for searching netdev
Attached
Detach File
Event Timeline
Log In to Comment