View | Details | Raw Unified | Return to bug 266054 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/dev/irdma/fbsd_kcompat.c (-1 / +3 lines)
Lines 467-477 int Link Here
467
irdma_resolve_neigh_lpb_chk(struct irdma_device *iwdev, struct irdma_cm_node *cm_node,
467
irdma_resolve_neigh_lpb_chk(struct irdma_device *iwdev, struct irdma_cm_node *cm_node,
468
			    struct irdma_cm_info *cm_info)
468
			    struct irdma_cm_info *cm_info)
469
{
469
{
470
  	struct rdma_cm_id *rdma_id = (struct rdma_cm_id *)cm_node->cm_id->context;
471
	struct vnet *vnet = rdma_id->route.addr.dev_addr.net;
470
	int arpindex;
472
	int arpindex;
471
	int oldarpindex;
473
	int oldarpindex;
472
474
473
	if ((cm_node->ipv4 &&
475
	if ((cm_node->ipv4 &&
474
	     irdma_ipv4_is_lpb(cm_node->loc_addr[0], cm_node->rem_addr[0])) ||
476
	     irdma_ipv4_is_lpb(vnet, cm_node->loc_addr[0], cm_node->rem_addr[0])) ||
475
	    (!cm_node->ipv4 &&
477
	    (!cm_node->ipv4 &&
476
	     irdma_ipv6_is_lpb(cm_node->loc_addr, cm_node->rem_addr))) {
478
	     irdma_ipv6_is_lpb(cm_node->loc_addr, cm_node->rem_addr))) {
477
		cm_node->do_lpb = true;
479
		cm_node->do_lpb = true;
(-)b/sys/dev/irdma/irdma_cm.c (-3 / +12 lines)
Lines 2055-2063 irdma_add_hte_node(struct irdma_cm_core *cm_core, Link Here
2055
 * @rem_addr: remote address
2055
 * @rem_addr: remote address
2056
 */
2056
 */
2057
bool
2057
bool
2058
irdma_ipv4_is_lpb(u32 loc_addr, u32 rem_addr)
2058
irdma_ipv4_is_lpb(struct vnet *vnet, u32 loc_addr, u32 rem_addr)
2059
{
2059
{
2060
	return ipv4_is_loopback(htonl(rem_addr)) || (loc_addr == rem_addr);
2060
	bool ret;
2061
2062
  	CURVNET_SET_QUIET(vnet);
2063
	ret = ipv4_is_loopback(htonl(rem_addr)) || (loc_addr == rem_addr);
2064
	CURVNET_RESTORE();
2065
2066
	return (ret);
2061
}
2067
}
2062
2068
2063
/**
2069
/**
Lines 2083-2088 irdma_ipv6_is_lpb(u32 *loc_addr, u32 *rem_addr) Link Here
2083
static int
2089
static int
2084
irdma_cm_create_ah(struct irdma_cm_node *cm_node, bool wait)
2090
irdma_cm_create_ah(struct irdma_cm_node *cm_node, bool wait)
2085
{
2091
{
2092
	struct rdma_cm_id *rdma_id = (struct rdma_cm_id *)cm_node->cm_id->context;
2093
	struct vnet *vnet = rdma_id->route.addr.dev_addr.net;
2086
	struct irdma_ah_info ah_info = {0};
2094
	struct irdma_ah_info ah_info = {0};
2087
	struct irdma_device *iwdev = cm_node->iwdev;
2095
	struct irdma_device *iwdev = cm_node->iwdev;
2088
2096
Lines 2096-2102 irdma_cm_create_ah(struct irdma_cm_node *cm_node, bool wait) Link Here
2096
		ah_info.ipv4_valid = true;
2104
		ah_info.ipv4_valid = true;
2097
		ah_info.dest_ip_addr[0] = cm_node->rem_addr[0];
2105
		ah_info.dest_ip_addr[0] = cm_node->rem_addr[0];
2098
		ah_info.src_ip_addr[0] = cm_node->loc_addr[0];
2106
		ah_info.src_ip_addr[0] = cm_node->loc_addr[0];
2099
		ah_info.do_lpbk = irdma_ipv4_is_lpb(ah_info.src_ip_addr[0],
2107
		ah_info.do_lpbk = irdma_ipv4_is_lpb(vnet,
2108
						    ah_info.src_ip_addr[0],
2100
						    ah_info.dest_ip_addr[0]);
2109
						    ah_info.dest_ip_addr[0]);
2101
	} else {
2110
	} else {
2102
		memcpy(ah_info.dest_ip_addr, cm_node->rem_addr,
2111
		memcpy(ah_info.dest_ip_addr, cm_node->rem_addr,
(-)b/sys/dev/irdma/irdma_cm.h (-1 / +1 lines)
Lines 441-447 void irdma_cm_teardown_connections(struct irdma_device *iwdev, u32 *ipaddr, Link Here
441
				   bool disconnect_all);
441
				   bool disconnect_all);
442
int irdma_cm_start(struct irdma_device *dev);
442
int irdma_cm_start(struct irdma_device *dev);
443
int irdma_cm_stop(struct irdma_device *dev);
443
int irdma_cm_stop(struct irdma_device *dev);
444
bool irdma_ipv4_is_lpb(u32 loc_addr, u32 rem_addr);
444
bool irdma_ipv4_is_lpb(struct vnet *, u32 loc_addr, u32 rem_addr);
445
bool irdma_ipv6_is_lpb(u32 *loc_addr, u32 *rem_addr);
445
bool irdma_ipv6_is_lpb(u32 *loc_addr, u32 *rem_addr);
446
int irdma_arp_table(struct irdma_pci_f *rf, u32 *ip_addr,
446
int irdma_arp_table(struct irdma_pci_f *rf, u32 *ip_addr,
447
		    u8 *mac_addr, u32 action);
447
		    u8 *mac_addr, u32 action);
(-)b/sys/dev/irdma/irdma_kcompat.c (-3 / +6 lines)
Lines 284-290 irdma_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata) Link Here
284
}
284
}
285
285
286
static void
286
static void
287
irdma_fill_ah_info(struct irdma_ah_info *ah_info,
287
irdma_fill_ah_info(struct vnet *vnet,
288
		   struct irdma_ah_info *ah_info,
288
		   const struct ib_gid_attr *sgid_attr,
289
		   const struct ib_gid_attr *sgid_attr,
289
		   struct sockaddr *sgid_addr, struct sockaddr *dgid_addr,
290
		   struct sockaddr *sgid_addr, struct sockaddr *dgid_addr,
290
		   u8 *dmac, u8 net_type)
291
		   u8 *dmac, u8 net_type)
Lines 295-301 irdma_fill_ah_info(struct irdma_ah_info *ah_info, Link Here
295
		    ntohl(((struct sockaddr_in *)dgid_addr)->sin_addr.s_addr);
296
		    ntohl(((struct sockaddr_in *)dgid_addr)->sin_addr.s_addr);
296
		ah_info->src_ip_addr[0] =
297
		ah_info->src_ip_addr[0] =
297
		    ntohl(((struct sockaddr_in *)sgid_addr)->sin_addr.s_addr);
298
		    ntohl(((struct sockaddr_in *)sgid_addr)->sin_addr.s_addr);
298
		ah_info->do_lpbk = irdma_ipv4_is_lpb(ah_info->src_ip_addr[0],
299
		ah_info->do_lpbk = irdma_ipv4_is_lpb(vnet,
300
						     ah_info->src_ip_addr[0],
299
						     ah_info->dest_ip_addr[0]);
301
						     ah_info->dest_ip_addr[0]);
300
		if (ipv4_is_multicast(((struct sockaddr_in *)dgid_addr)->sin_addr.s_addr)) {
302
		if (ipv4_is_multicast(((struct sockaddr_in *)dgid_addr)->sin_addr.s_addr)) {
301
			irdma_mcast_mac_v4(ah_info->dest_ip_addr, dmac);
303
			irdma_mcast_mac_v4(ah_info->dest_ip_addr, dmac);
Lines 440-446 irdma_create_ah(struct ib_ah *ib_ah, Link Here
440
442
441
	ether_addr_copy(dmac, attr->dmac);
443
	ether_addr_copy(dmac, attr->dmac);
442
444
443
	irdma_fill_ah_info(ah_info, &sgid_attr, &sgid_addr.saddr, &dgid_addr.saddr,
445
	irdma_fill_ah_info(iwdev->netdev->if_vnet,
446
			   ah_info, &sgid_attr, &sgid_addr.saddr, &dgid_addr.saddr,
444
			   dmac, ah->av.net_type);
447
			   dmac, ah->av.net_type);
445
448
446
	err = irdma_create_ah_vlan_tag(iwdev, ah_info, &sgid_attr, dmac);
449
	err = irdma_create_ah_vlan_tag(iwdev, ah_info, &sgid_attr, dmac);
(-)b/sys/ofed/drivers/infiniband/core/ib_cma.c (-27 / +54 lines)
Lines 1070-1078 static inline int cma_loopback_addr(struct sockaddr *addr) Link Here
1070
	}
1070
	}
1071
}
1071
}
1072
1072
1073
static inline int cma_any_addr(struct sockaddr *addr)
1073
static inline bool cma_any_addr(struct vnet *vnet, struct sockaddr *addr)
1074
{
1074
{
1075
	return cma_zero_addr(addr) || cma_loopback_addr(addr);
1075
	bool ret;
1076
1077
	CURVNET_SET_QUIET(vnet);
1078
	ret = cma_zero_addr(addr) || cma_loopback_addr(addr);
1079
	CURVNET_RESTORE();
1080
1081
	return (ret);
1076
}
1082
}
1077
1083
1078
static int cma_addr_cmp(struct sockaddr *src, struct sockaddr *dst)
1084
static int cma_addr_cmp(struct sockaddr *src, struct sockaddr *dst)
Lines 1375-1380 static int cma_save_req_info(const struct ib_cm_event *ib_event, Link Here
1375
	return 0;
1381
	return 0;
1376
}
1382
}
1377
1383
1384
#ifdef INET
1385
static bool validate_ipv4_net_dev_addr(struct vnet *vnet,
1386
    const __be32 saddr, const __be32 daddr)
1387
{
1388
	bool ret;
1389
	CURVNET_SET(vnet);
1390
	ret = ipv4_is_multicast(saddr) || ipv4_is_lbcast(saddr) ||
1391
	    ipv4_is_lbcast(daddr) || ipv4_is_zeronet(saddr) ||
1392
	    ipv4_is_zeronet(daddr) || ipv4_is_loopback(daddr) ||
1393
	    ipv4_is_loopback(saddr);
1394
	CURVNET_RESTORE();
1395
	return (ret);
1396
}
1397
#endif
1398
1378
static bool validate_ipv4_net_dev(struct ifnet *net_dev,
1399
static bool validate_ipv4_net_dev(struct ifnet *net_dev,
1379
				  const struct sockaddr_in *dst_addr,
1400
				  const struct sockaddr_in *dst_addr,
1380
				  const struct sockaddr_in *src_addr)
1401
				  const struct sockaddr_in *src_addr)
Lines 1386-1395 static bool validate_ipv4_net_dev(struct ifnet *net_dev, Link Here
1386
	struct nhop_object *nh;
1407
	struct nhop_object *nh;
1387
	bool ret;
1408
	bool ret;
1388
1409
1389
	if (ipv4_is_multicast(saddr) || ipv4_is_lbcast(saddr) ||
1410
	if (validate_ipv4_net_dev_addr(net_dev->if_vnet, saddr, daddr))
1390
	    ipv4_is_lbcast(daddr) || ipv4_is_zeronet(saddr) ||
1391
	    ipv4_is_zeronet(daddr) || ipv4_is_loopback(daddr) ||
1392
	    ipv4_is_loopback(saddr))
1393
		return false;
1411
		return false;
1394
1412
1395
	dst_dev = ip_ifp_find(net_dev->if_vnet, daddr);
1413
	dst_dev = ip_ifp_find(net_dev->if_vnet, daddr);
Lines 1565-1577 static bool sdp_match_private_data(struct rdma_id_private *id_priv, Link Here
1565
{
1583
{
1566
	__be32 ip4_addr;
1584
	__be32 ip4_addr;
1567
	struct in6_addr ip6_addr;
1585
	struct in6_addr ip6_addr;
1586
	struct vnet *vnet = id_priv->id.route.addr.dev_addr.net;
1568
1587
1569
	switch (addr->sa_family) {
1588
	switch (addr->sa_family) {
1570
	case AF_INET:
1589
	case AF_INET:
1571
		ip4_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
1590
		ip4_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
1572
		if (sdp_get_ip_ver(hdr) != 4)
1591
		if (sdp_get_ip_ver(hdr) != 4)
1573
			return false;
1592
			return false;
1574
		if (!cma_any_addr(addr) &&
1593
		if (!cma_any_addr(vnet, addr) &&
1575
		    hdr->dst_addr.ip4.addr != ip4_addr)
1594
		    hdr->dst_addr.ip4.addr != ip4_addr)
1576
			return false;
1595
			return false;
1577
		break;
1596
		break;
Lines 1580-1586 static bool sdp_match_private_data(struct rdma_id_private *id_priv, Link Here
1580
		if (sdp_get_ip_ver(hdr) != 6)
1599
		if (sdp_get_ip_ver(hdr) != 6)
1581
			return false;
1600
			return false;
1582
		cma_ip6_clear_scope_id(&ip6_addr);
1601
		cma_ip6_clear_scope_id(&ip6_addr);
1583
		if (!cma_any_addr(addr) &&
1602
		if (!cma_any_addr(vnet, addr) &&
1584
		    memcmp(&hdr->dst_addr.ip6, &ip6_addr, sizeof(ip6_addr)))
1603
		    memcmp(&hdr->dst_addr.ip6, &ip6_addr, sizeof(ip6_addr)))
1585
			return false;
1604
			return false;
1586
		break;
1605
		break;
Lines 1598-1607 static bool cma_match_private_data(struct rdma_id_private *id_priv, Link Here
1598
{
1617
{
1599
	const struct cma_hdr *hdr = vhdr;
1618
	const struct cma_hdr *hdr = vhdr;
1600
	struct sockaddr *addr = cma_src_addr(id_priv);
1619
	struct sockaddr *addr = cma_src_addr(id_priv);
1620
	struct vnet *vnet = id_priv->id.route.addr.dev_addr.net;
1601
	__be32 ip4_addr;
1621
	__be32 ip4_addr;
1602
	struct in6_addr ip6_addr;
1622
	struct in6_addr ip6_addr;
1603
1623
1604
	if (cma_any_addr(addr) && !id_priv->afonly)
1624
	if (cma_any_addr(vnet, addr) && !id_priv->afonly)
1605
		return true;
1625
		return true;
1606
1626
1607
	if (id_priv->id.ps == RDMA_PS_SDP)
1627
	if (id_priv->id.ps == RDMA_PS_SDP)
Lines 1612-1618 static bool cma_match_private_data(struct rdma_id_private *id_priv, Link Here
1612
		ip4_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
1632
		ip4_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
1613
		if (cma_get_ip_ver(hdr) != 4)
1633
		if (cma_get_ip_ver(hdr) != 4)
1614
			return false;
1634
			return false;
1615
		if (!cma_any_addr(addr) &&
1635
		if (!cma_any_addr(vnet, addr) &&
1616
		    hdr->dst_addr.ip4.addr != ip4_addr)
1636
		    hdr->dst_addr.ip4.addr != ip4_addr)
1617
			return false;
1637
			return false;
1618
		break;
1638
		break;
Lines 1621-1627 static bool cma_match_private_data(struct rdma_id_private *id_priv, Link Here
1621
		if (cma_get_ip_ver(hdr) != 6)
1641
		if (cma_get_ip_ver(hdr) != 6)
1622
			return false;
1642
			return false;
1623
		cma_ip6_clear_scope_id(&ip6_addr);
1643
		cma_ip6_clear_scope_id(&ip6_addr);
1624
		if (!cma_any_addr(addr) &&
1644
		if (!cma_any_addr(vnet, addr) &&
1625
		    memcmp(&hdr->dst_addr.ip6, &ip6_addr, sizeof(ip6_addr)))
1645
		    memcmp(&hdr->dst_addr.ip6, &ip6_addr, sizeof(ip6_addr)))
1626
			return false;
1646
			return false;
1627
		break;
1647
		break;
Lines 1793-1798 static void cma_cancel_listens(struct rdma_id_private *id_priv) Link Here
1793
static void cma_cancel_operation(struct rdma_id_private *id_priv,
1813
static void cma_cancel_operation(struct rdma_id_private *id_priv,
1794
				 enum rdma_cm_state state)
1814
				 enum rdma_cm_state state)
1795
{
1815
{
1816
  	struct vnet *vnet = id_priv->id.route.addr.dev_addr.net;
1817
1796
	switch (state) {
1818
	switch (state) {
1797
	case RDMA_CM_ADDR_QUERY:
1819
	case RDMA_CM_ADDR_QUERY:
1798
		rdma_addr_cancel(&id_priv->id.route.addr.dev_addr);
1820
		rdma_addr_cancel(&id_priv->id.route.addr.dev_addr);
Lines 1801-1807 static void cma_cancel_operation(struct rdma_id_private *id_priv, Link Here
1801
		cma_cancel_route(id_priv);
1823
		cma_cancel_route(id_priv);
1802
		break;
1824
		break;
1803
	case RDMA_CM_LISTEN:
1825
	case RDMA_CM_LISTEN:
1804
		if (cma_any_addr(cma_src_addr(id_priv)) && !id_priv->cma_dev)
1826
		if (cma_any_addr(vnet, cma_src_addr(id_priv)) && !id_priv->cma_dev)
1805
			cma_cancel_listens(id_priv);
1827
			cma_cancel_listens(id_priv);
1806
		break;
1828
		break;
1807
	default:
1829
	default:
Lines 2039-2047 static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id, Link Here
2039
	const sa_family_t ss_family = listen_id->route.addr.src_addr.ss_family;
2061
	const sa_family_t ss_family = listen_id->route.addr.src_addr.ss_family;
2040
	const __be64 service_id =
2062
	const __be64 service_id =
2041
		      ib_event->param.req_rcvd.primary_path->service_id;
2063
		      ib_event->param.req_rcvd.primary_path->service_id;
2064
	struct vnet *vnet = listen_id->route.addr.dev_addr.net;
2042
	int ret;
2065
	int ret;
2043
2066
2044
	id = rdma_create_id(listen_id->route.addr.dev_addr.net,
2067
	id = rdma_create_id(vnet,
2045
			    listen_id->event_handler, listen_id->context,
2068
			    listen_id->event_handler, listen_id->context,
2046
			    listen_id->ps, ib_event->param.req_rcvd.qp_type);
2069
			    listen_id->ps, ib_event->param.req_rcvd.qp_type);
2047
	if (IS_ERR(id))
2070
	if (IS_ERR(id))
Lines 2070-2080 static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id, Link Here
2070
			goto err;
2093
			goto err;
2071
	} else {
2094
	} else {
2072
		if (!cma_protocol_roce(listen_id) &&
2095
		if (!cma_protocol_roce(listen_id) &&
2073
		    cma_any_addr(cma_src_addr(id_priv))) {
2096
		    cma_any_addr(vnet, cma_src_addr(id_priv))) {
2074
			rt->addr.dev_addr.dev_type = ARPHRD_INFINIBAND;
2097
			rt->addr.dev_addr.dev_type = ARPHRD_INFINIBAND;
2075
			rdma_addr_set_sgid(&rt->addr.dev_addr, &rt->path_rec[0].sgid);
2098
			rdma_addr_set_sgid(&rt->addr.dev_addr, &rt->path_rec[0].sgid);
2076
			ib_addr_set_pkey(&rt->addr.dev_addr, be16_to_cpu(rt->path_rec[0].pkey));
2099
			ib_addr_set_pkey(&rt->addr.dev_addr, be16_to_cpu(rt->path_rec[0].pkey));
2077
		} else if (!cma_any_addr(cma_src_addr(id_priv))) {
2100
		} else if (!cma_any_addr(vnet, cma_src_addr(id_priv))) {
2078
			ret = cma_translate_addr(cma_src_addr(id_priv), &rt->addr.dev_addr);
2101
			ret = cma_translate_addr(cma_src_addr(id_priv), &rt->addr.dev_addr);
2079
			if (ret)
2102
			if (ret)
2080
				goto err;
2103
				goto err;
Lines 2097-2106 static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id, Link Here
2097
	struct rdma_id_private *id_priv;
2120
	struct rdma_id_private *id_priv;
2098
	struct rdma_cm_id *id;
2121
	struct rdma_cm_id *id;
2099
	const sa_family_t ss_family = listen_id->route.addr.src_addr.ss_family;
2122
	const sa_family_t ss_family = listen_id->route.addr.src_addr.ss_family;
2100
	struct vnet *net = listen_id->route.addr.dev_addr.net;
2123
	struct vnet *vnet = listen_id->route.addr.dev_addr.net;
2101
	int ret;
2124
	int ret;
2102
2125
2103
	id = rdma_create_id(net, listen_id->event_handler, listen_id->context,
2126
	id = rdma_create_id(vnet, listen_id->event_handler, listen_id->context,
2104
			    listen_id->ps, IB_QPT_UD);
2127
			    listen_id->ps, IB_QPT_UD);
2105
	if (IS_ERR(id))
2128
	if (IS_ERR(id))
2106
		return NULL;
2129
		return NULL;
Lines 2117-2123 static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id, Link Here
2117
		if (ret)
2140
		if (ret)
2118
			goto err;
2141
			goto err;
2119
	} else {
2142
	} else {
2120
		if (!cma_any_addr(cma_src_addr(id_priv))) {
2143
		if (!cma_any_addr(vnet, cma_src_addr(id_priv))) {
2121
			ret = cma_translate_addr(cma_src_addr(id_priv),
2144
			ret = cma_translate_addr(cma_src_addr(id_priv),
2122
						 &id->route.addr.dev_addr);
2145
						 &id->route.addr.dev_addr);
2123
			if (ret)
2146
			if (ret)
Lines 3053-3058 int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr, Link Here
3053
		      struct sockaddr *dst_addr, int timeout_ms)
3076
		      struct sockaddr *dst_addr, int timeout_ms)
3054
{
3077
{
3055
	struct rdma_id_private *id_priv;
3078
	struct rdma_id_private *id_priv;
3079
	struct vnet *vnet = id->route.addr.dev_addr.net;
3056
	int ret;
3080
	int ret;
3057
3081
3058
	id_priv = container_of(id, struct rdma_id_private, id);
3082
	id_priv = container_of(id, struct rdma_id_private, id);
Lines 3070-3076 int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr, Link Here
3070
3094
3071
	atomic_inc(&id_priv->refcount);
3095
	atomic_inc(&id_priv->refcount);
3072
	memcpy(cma_dst_addr(id_priv), dst_addr, rdma_addr_size(dst_addr));
3096
	memcpy(cma_dst_addr(id_priv), dst_addr, rdma_addr_size(dst_addr));
3073
	if (cma_any_addr(dst_addr)) {
3097
	if (cma_any_addr(vnet, dst_addr)) {
3074
		ret = cma_resolve_loopback(id_priv);
3098
		ret = cma_resolve_loopback(id_priv);
3075
	} else {
3099
	} else {
3076
		if (dst_addr->sa_family == AF_IB) {
3100
		if (dst_addr->sa_family == AF_IB) {
Lines 3235-3240 static int cma_check_port(struct rdma_bind_list *bind_list, Link Here
3235
{
3259
{
3236
	struct rdma_id_private *cur_id;
3260
	struct rdma_id_private *cur_id;
3237
	struct sockaddr *addr, *cur_addr;
3261
	struct sockaddr *addr, *cur_addr;
3262
	struct vnet *vnet;
3238
3263
3239
	addr = cma_src_addr(id_priv);
3264
	addr = cma_src_addr(id_priv);
3240
	hlist_for_each_entry(cur_id, &bind_list->owners, node) {
3265
	hlist_for_each_entry(cur_id, &bind_list->owners, node) {
Lines 3250-3256 static int cma_check_port(struct rdma_bind_list *bind_list, Link Here
3250
		    (addr->sa_family != cur_addr->sa_family))
3275
		    (addr->sa_family != cur_addr->sa_family))
3251
			continue;
3276
			continue;
3252
3277
3253
		if (cma_any_addr(addr) || cma_any_addr(cur_addr))
3278
		vnet = cur_id->id.route.addr.dev_addr.net;
3279
		if (cma_any_addr(vnet, addr) || cma_any_addr(vnet, cur_addr))
3254
			return -EADDRNOTAVAIL;
3280
			return -EADDRNOTAVAIL;
3255
3281
3256
		if (!cma_addr_cmp(addr, cur_addr))
3282
		if (!cma_addr_cmp(addr, cur_addr))
Lines 3441-3446 EXPORT_SYMBOL(rdma_listen); Link Here
3441
int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
3467
int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
3442
{
3468
{
3443
	struct rdma_id_private *id_priv;
3469
	struct rdma_id_private *id_priv;
3470
	struct vnet *vnet = id->route.addr.dev_addr.net;
3444
	int ret;
3471
	int ret;
3445
3472
3446
	if (addr->sa_family != AF_INET && addr->sa_family != AF_INET6 &&
3473
	if (addr->sa_family != AF_INET && addr->sa_family != AF_INET6 &&
Lines 3456-3462 int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr) Link Here
3456
		goto err1;
3483
		goto err1;
3457
3484
3458
	memcpy(cma_src_addr(id_priv), addr, rdma_addr_size(addr));
3485
	memcpy(cma_src_addr(id_priv), addr, rdma_addr_size(addr));
3459
	if (!cma_any_addr(addr)) {
3486
	if (!cma_any_addr(vnet, addr)) {
3460
		ret = cma_translate_addr(addr, &id->route.addr.dev_addr);
3487
		ret = cma_translate_addr(addr, &id->route.addr.dev_addr);
3461
		if (ret)
3488
		if (ret)
3462
			goto err1;
3489
			goto err1;
Lines 3471-3477 int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr) Link Here
3471
			id_priv->afonly = 1;
3498
			id_priv->afonly = 1;
3472
#ifdef INET6
3499
#ifdef INET6
3473
		else if (addr->sa_family == AF_INET6) {
3500
		else if (addr->sa_family == AF_INET6) {
3474
			CURVNET_SET_QUIET(id_priv->id.route.addr.dev_addr.net);
3501
			CURVNET_SET_QUIET(vnet);
3475
			id_priv->afonly = V_ip6_v6only;
3502
			id_priv->afonly = V_ip6_v6only;
3476
			CURVNET_RESTORE();
3503
			CURVNET_RESTORE();
3477
		}
3504
		}
Lines 4099-4105 static void cma_set_mgid(struct rdma_id_private *id_priv, Link Here
4099
	struct sockaddr_in *sin = (struct sockaddr_in *) addr;
4126
	struct sockaddr_in *sin = (struct sockaddr_in *) addr;
4100
	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) addr;
4127
	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) addr;
4101
4128
4102
	if (cma_any_addr(addr)) {
4129
	if (cma_any_addr(dev_addr->net, addr)) {
4103
		memset(mgid, 0, sizeof *mgid);
4130
		memset(mgid, 0, sizeof *mgid);
4104
	} else if ((addr->sa_family == AF_INET6) &&
4131
	} else if ((addr->sa_family == AF_INET6) &&
4105
		   ((be32_to_cpu(sin6->sin6_addr.s6_addr32[0]) & 0xFFF0FFFF) ==
4132
		   ((be32_to_cpu(sin6->sin6_addr.s6_addr32[0]) & 0xFFF0FFFF) ==
Lines 4247-4259 static void iboe_mcast_work_handler(struct work_struct *work) Link Here
4247
	kfree(mw);
4274
	kfree(mw);
4248
}
4275
}
4249
4276
4250
static void cma_iboe_set_mgid(struct sockaddr *addr, union ib_gid *mgid,
4277
static void cma_iboe_set_mgid(struct vnet *vnet, struct sockaddr *addr,
4251
			      enum ib_gid_type gid_type)
4278
			      union ib_gid *mgid, enum ib_gid_type gid_type)
4252
{
4279
{
4253
	struct sockaddr_in *sin = (struct sockaddr_in *)addr;
4280
	struct sockaddr_in *sin = (struct sockaddr_in *)addr;
4254
	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;
4281
	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;
4255
4282
4256
	if (cma_any_addr(addr)) {
4283
	if (cma_any_addr(vnet, addr)) {
4257
		memset(mgid, 0, sizeof *mgid);
4284
		memset(mgid, 0, sizeof *mgid);
4258
	} else if (addr->sa_family == AF_INET6) {
4285
	} else if (addr->sa_family == AF_INET6) {
4259
		memcpy(mgid, &sin6->sin6_addr, sizeof *mgid);
4286
		memcpy(mgid, &sin6->sin6_addr, sizeof *mgid);
Lines 4304-4310 static int cma_iboe_join_multicast(struct rdma_id_private *id_priv, Link Here
4304
4331
4305
	gid_type = id_priv->cma_dev->default_gid_type[id_priv->id.port_num -
4332
	gid_type = id_priv->cma_dev->default_gid_type[id_priv->id.port_num -
4306
		   rdma_start_port(id_priv->cma_dev->device)];
4333
		   rdma_start_port(id_priv->cma_dev->device)];
4307
	cma_iboe_set_mgid(addr, &mc->multicast.ib->rec.mgid, gid_type);
4334
	cma_iboe_set_mgid(dev_addr->net, addr, &mc->multicast.ib->rec.mgid, gid_type);
4308
4335
4309
	mc->multicast.ib->rec.pkey = cpu_to_be16(0xffff);
4336
	mc->multicast.ib->rec.pkey = cpu_to_be16(0xffff);
4310
	if (id_priv->id.ps == RDMA_PS_UDP)
4337
	if (id_priv->id.ps == RDMA_PS_UDP)

Return to bug 266054