aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFaisal Latif <faisal.latif@intel.com>2016-02-26 10:18:01 -0500
committerDoug Ledford <dledford@redhat.com>2016-03-16 13:50:52 -0400
commit8d8cd0bf67982a2b400ca3fd5d6807b834f6a38e (patch)
tree828efe85ad1f3d52301ad813b29775bf80608cb1
parentd37498417947cb2299fc749ae4af1d204c768cba (diff)
i40iw: use shared code for port mapper
Removei/change for port mapper code which has been moved to iwcm. Signed-off-by: Mustafa Ismail <mustafa.ismail@intel.com> Signed-off-by: Faisal Latif <faisal.latif@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_cm.c427
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_hw.c20
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_main.c20
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_verbs.c3
4 files changed, 76 insertions, 394 deletions
diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.c b/drivers/infiniband/hw/i40iw/i40iw_cm.c
index 0589bd156cfc..92745d755272 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_cm.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_cm.c
@@ -208,207 +208,6 @@ static inline void i40iw_fill_sockaddr6(struct i40iw_cm_node *cm_node,
208} 208}
209 209
210/** 210/**
211 * i40iw_set_sockaddr - Record ip addr and tcp port in a sockaddr storage
212 * @ip_addr: v4/v6 ip addr
213 * @port: tcp port
214 * @addr: sockaddr to store ip/tcp info
215 */
216static void i40iw_set_sockaddr(u32 *ip_addr,
217 u16 port,
218 struct sockaddr_storage *addr,
219 bool ipv4)
220{
221 if (ipv4) {
222 struct sockaddr_in *in4_addr = (struct sockaddr_in *)addr;
223
224 in4_addr->sin_family = AF_INET;
225 in4_addr->sin_addr.s_addr = htonl(ip_addr[0]);
226 in4_addr->sin_port = htons(port);
227 } else {
228 struct sockaddr_in6 *in6_addr = (struct sockaddr_in6 *)addr;
229
230 in6_addr->sin6_family = AF_INET6;
231 i40iw_copy_ip_htonl(in6_addr->sin6_addr.in6_u.u6_addr32,
232 ip_addr);
233 in6_addr->sin6_port = htons(port);
234 }
235}
236
237/**
238 * i40iw_get_sockaddr - Get ip addr and tcp port from a sockaddr storage
239 * @addr: sockaddr to get ip/tcp info
240 * @ip_addr: v4/v6 ip addr
241 * @port: tcp port
242 */
243static void i40iw_get_addrinfo(struct sockaddr_storage *addr, u32 *ip_addr, u16 *port)
244{
245 if (addr->ss_family == AF_INET) {
246 struct sockaddr_in *in4_addr = (struct sockaddr_in *)addr;
247
248 ip_addr[0] = ntohl(in4_addr->sin_addr.s_addr);
249 *port = ntohs(in4_addr->sin_port);
250 } else {
251 struct sockaddr_in6 *in6_addr = (struct sockaddr_in6 *)addr;
252
253 i40iw_copy_ip_ntohl(ip_addr,
254 in6_addr->sin6_addr.in6_u.u6_addr32);
255 *port = ntohs(in6_addr->sin6_port);
256 }
257}
258
259/**
260 * i40iw_is_wildcard - Check if it is a wildcard ip address
261 * @addr: sockaddr containing the ip to check
262 */
263static bool i40iw_is_wildcard(struct sockaddr_storage *addr)
264{
265 if (addr->ss_family == AF_INET) {
266 struct sockaddr_in *in4_addr = (struct sockaddr_in *)addr;
267
268 return (in4_addr->sin_addr.s_addr == INADDR_ANY);
269 } else {
270 struct sockaddr_in6 *in6_addr = (struct sockaddr_in6 *)addr;
271
272 return (ipv6_addr_type(&in6_addr->sin6_addr) == IPV6_ADDR_ANY);
273 }
274}
275
276/**
277 * i40iw_create_mapinfo - Create a mapinfo object in the port mapper data base
278 * @cm_info: contains ip/tcp info
279 */
280static int i40iw_create_mapinfo(struct i40iw_cm_info *cm_info)
281{
282 struct sockaddr_storage local_sockaddr;
283 struct sockaddr_storage mapped_sockaddr;
284
285 i40iw_set_sockaddr(cm_info->loc_addr, cm_info->loc_port,
286 &local_sockaddr, cm_info->ipv4);
287 i40iw_set_sockaddr(cm_info->map_loc_addr, cm_info->map_loc_port,
288 &mapped_sockaddr, cm_info->ipv4);
289 return iwpm_create_mapinfo(&local_sockaddr,
290 &mapped_sockaddr,
291 RDMA_NL_I40IW);
292}
293
294/**
295 * i40iw_remove_mapinfo - Remove a mapinfo object
296 * @cm_info: contains ip/tcp info
297 *
298 * Removes a mapinfo object from the port mapper data base
299 * and sends a remove mapping message to the userspace port mapper
300 */
301static int i40iw_remove_mapinfo(struct i40iw_cm_info *cm_info)
302{
303 struct sockaddr_storage local_sockaddr;
304 struct sockaddr_storage mapped_sockaddr;
305
306 i40iw_set_sockaddr(cm_info->loc_addr, cm_info->loc_port,
307 &local_sockaddr, cm_info->ipv4);
308 i40iw_set_sockaddr(cm_info->map_loc_addr, cm_info->map_loc_port,
309 &mapped_sockaddr, cm_info->ipv4);
310
311 iwpm_remove_mapinfo(&local_sockaddr, &mapped_sockaddr);
312 return iwpm_remove_mapping(&local_sockaddr, RDMA_NL_I40IW);
313}
314
315/**
316 * i40iw_form_reg_msg - Form a port mapper message with dev info
317 * @iwdev: iWarp device
318 * @pm_msg: msg to record device data
319 */
320static void i40iw_form_reg_msg(struct i40iw_device *iwdev, struct iwpm_dev_data *pm_msg)
321{
322 memcpy(pm_msg->dev_name, iwdev->iwibdev->ibdev.name, IWPM_DEVNAME_SIZE);
323 memcpy(pm_msg->if_name, iwdev->netdev->name, IWPM_IFNAME_SIZE);
324}
325
326/**
327 * i40iw_form_pm_msg - Form a port mapper message with mapping info
328 * @cm_info: contains ip/tcp info
329 * @pm_msg: msg to record ip/tcp info
330 */
331static void i40iw_form_pm_msg(struct i40iw_cm_info *cm_info,
332 struct iwpm_sa_data *pm_msg)
333{
334 i40iw_set_sockaddr(cm_info->loc_addr, cm_info->loc_port,
335 &pm_msg->loc_addr, cm_info->ipv4);
336 i40iw_set_sockaddr(cm_info->rem_addr, cm_info->rem_port,
337 &pm_msg->rem_addr, cm_info->ipv4);
338}
339
340/**
341 * i40iw_record_pm_msg - Record the received mapping info
342 * @cm_info: ip/tcp info to be updated with mapped info
343 * @pm_msg: received msg with mapped ip/tcp
344 */
345static void i40iw_record_pm_msg(struct i40iw_cm_info *cm_info,
346 struct iwpm_sa_data *pm_msg,
347 bool remote)
348{
349 i40iw_get_addrinfo(&pm_msg->mapped_loc_addr,
350 cm_info->map_loc_addr,
351 &cm_info->map_loc_port);
352 if (remote) {
353 i40iw_get_addrinfo(&pm_msg->mapped_rem_addr,
354 cm_info->map_rem_addr, &cm_info->map_rem_port);
355 if (i40iw_is_wildcard(&pm_msg->mapped_rem_addr))
356 memcpy(cm_info->map_rem_addr, cm_info->rem_addr,
357 sizeof(cm_info->map_rem_addr));
358 }
359}
360
361/**
362 * i40iw_get_reminfo - Get the address info of the remote connecting peer
363 * @cm_node: provides mapped ip/tcp info (local and remote)
364 *
365 * Gets the actual non-mapped ip/tcp info of the remote connecting peer
366 * from the port mapper data base
367 */
368static int i40iw_get_remote_addr(struct i40iw_cm_node *cm_node)
369{
370 struct sockaddr_storage mapped_loc_addr, mapped_rem_addr;
371 struct sockaddr_storage remote_addr;
372 int ret;
373
374 i40iw_set_sockaddr(cm_node->map_loc_addr,
375 cm_node->map_loc_port,
376 &mapped_loc_addr,
377 cm_node->ipv4);
378 i40iw_set_sockaddr(cm_node->map_rem_addr,
379 cm_node->map_rem_port,
380 &mapped_rem_addr,
381 cm_node->ipv4);
382 ret = iwpm_get_remote_info(&mapped_loc_addr,
383 &mapped_rem_addr,
384 &remote_addr,
385 RDMA_NL_I40IW);
386 if (ret)
387 i40iw_debug(cm_node->dev,
388 I40IW_DEBUG_CM,
389 "Unable to find remote peer address info\n");
390 else
391 i40iw_get_addrinfo(&remote_addr,
392 cm_node->rem_addr,
393 &cm_node->rem_port);
394 return ret;
395}
396
397/**
398 * i40iw_init_mapinfo - Initialize the mapped ip/tcp info
399 * @cm_info: ip/tcp info (actual and mapped)
400*/
401static void i40iw_init_mapinfo(struct i40iw_cm_info *cm_info)
402{
403 memcpy(cm_info->map_loc_addr, cm_info->loc_addr,
404 sizeof(cm_info->map_loc_addr));
405 memcpy(cm_info->map_rem_addr, cm_info->rem_addr,
406 sizeof(cm_info->map_rem_addr));
407 cm_info->map_loc_port = cm_info->loc_port;
408 cm_info->map_rem_port = cm_info->rem_port;
409}
410
411/**
412 * i40iw_get_addr_info 211 * i40iw_get_addr_info
413 * @cm_node: contains ip/tcp info 212 * @cm_node: contains ip/tcp info
414 * @cm_info: to get a copy of the cm_node ip/tcp info 213 * @cm_info: to get a copy of the cm_node ip/tcp info
@@ -420,12 +219,8 @@ static void i40iw_get_addr_info(struct i40iw_cm_node *cm_node,
420 cm_info->vlan_id = cm_node->vlan_id; 219 cm_info->vlan_id = cm_node->vlan_id;
421 memcpy(cm_info->loc_addr, cm_node->loc_addr, sizeof(cm_info->loc_addr)); 220 memcpy(cm_info->loc_addr, cm_node->loc_addr, sizeof(cm_info->loc_addr));
422 memcpy(cm_info->rem_addr, cm_node->rem_addr, sizeof(cm_info->rem_addr)); 221 memcpy(cm_info->rem_addr, cm_node->rem_addr, sizeof(cm_info->rem_addr));
423 memcpy(cm_info->map_loc_addr, cm_node->map_loc_addr, sizeof(cm_info->map_loc_addr));
424 memcpy(cm_info->map_rem_addr, cm_node->map_rem_addr, sizeof(cm_info->map_rem_addr));
425 cm_info->loc_port = cm_node->loc_port; 222 cm_info->loc_port = cm_node->loc_port;
426 cm_info->rem_port = cm_node->rem_port; 223 cm_info->rem_port = cm_node->rem_port;
427 cm_info->map_loc_port = cm_node->map_loc_port;
428 cm_info->map_rem_port = cm_node->map_rem_port;
429} 224}
430 225
431/** 226/**
@@ -438,9 +233,9 @@ static inline void i40iw_get_cmevent_info(struct i40iw_cm_node *cm_node,
438 struct iw_cm_id *cm_id, 233 struct iw_cm_id *cm_id,
439 struct iw_cm_event *event) 234 struct iw_cm_event *event)
440{ 235{
441 memcpy(&event->local_addr, &cm_id->local_addr, 236 memcpy(&event->local_addr, &cm_id->m_local_addr,
442 sizeof(event->local_addr)); 237 sizeof(event->local_addr));
443 memcpy(&event->remote_addr, &cm_id->remote_addr, 238 memcpy(&event->remote_addr, &cm_id->m_remote_addr,
444 sizeof(event->remote_addr)); 239 sizeof(event->remote_addr));
445 if (cm_node) { 240 if (cm_node) {
446 event->private_data = (void *)cm_node->pdata_buf; 241 event->private_data = (void *)cm_node->pdata_buf;
@@ -666,9 +461,8 @@ static struct i40iw_puda_buf *i40iw_form_cm_frame(struct i40iw_cm_node *cm_node,
666 iph->frag_off = htons(0x4000); 461 iph->frag_off = htons(0x4000);
667 iph->ttl = 0x40; 462 iph->ttl = 0x40;
668 iph->protocol = IPPROTO_TCP; 463 iph->protocol = IPPROTO_TCP;
669 464 iph->saddr = htonl(cm_node->loc_addr[0]);
670 iph->saddr = htonl(cm_node->map_loc_addr[0]); 465 iph->daddr = htonl(cm_node->rem_addr[0]);
671 iph->daddr = htonl(cm_node->map_rem_addr[0]);
672 } else { 466 } else {
673 sqbuf->ipv4 = false; 467 sqbuf->ipv4 = false;
674 ip6h = (struct ipv6hdr *)buf; 468 ip6h = (struct ipv6hdr *)buf;
@@ -692,15 +486,14 @@ static struct i40iw_puda_buf *i40iw_form_cm_frame(struct i40iw_cm_node *cm_node,
692 ip6h->payload_len = htons(packetsize - sizeof(*ip6h)); 486 ip6h->payload_len = htons(packetsize - sizeof(*ip6h));
693 ip6h->nexthdr = 6; 487 ip6h->nexthdr = 6;
694 ip6h->hop_limit = 128; 488 ip6h->hop_limit = 128;
695
696 i40iw_copy_ip_htonl(ip6h->saddr.in6_u.u6_addr32, 489 i40iw_copy_ip_htonl(ip6h->saddr.in6_u.u6_addr32,
697 cm_node->map_loc_addr); 490 cm_node->loc_addr);
698 i40iw_copy_ip_htonl(ip6h->daddr.in6_u.u6_addr32, 491 i40iw_copy_ip_htonl(ip6h->daddr.in6_u.u6_addr32,
699 cm_node->map_rem_addr); 492 cm_node->rem_addr);
700 } 493 }
701 494
702 tcph->source = htons(cm_node->map_loc_port); 495 tcph->source = htons(cm_node->loc_port);
703 tcph->dest = htons(cm_node->map_rem_port); 496 tcph->dest = htons(cm_node->rem_port);
704 497
705 tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num); 498 tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num);
706 499
@@ -1079,7 +872,6 @@ static int i40iw_send_mpa_request(struct i40iw_cm_node *cm_node)
1079 i40iw_pr_err("sq_buf == NULL\n"); 872 i40iw_pr_err("sq_buf == NULL\n");
1080 return -1; 873 return -1;
1081 } 874 }
1082
1083 return i40iw_schedule_cm_timer(cm_node, sqbuf, I40IW_TIMER_TYPE_SEND, 1, 0); 875 return i40iw_schedule_cm_timer(cm_node, sqbuf, I40IW_TIMER_TYPE_SEND, 1, 0);
1084} 876}
1085 877
@@ -1635,10 +1427,10 @@ struct i40iw_cm_node *i40iw_find_node(struct i40iw_cm_core *cm_core,
1635 /* walk list and find cm_node associated with this session ID */ 1427 /* walk list and find cm_node associated with this session ID */
1636 spin_lock_irqsave(&cm_core->ht_lock, flags); 1428 spin_lock_irqsave(&cm_core->ht_lock, flags);
1637 list_for_each_entry(cm_node, hte, list) { 1429 list_for_each_entry(cm_node, hte, list) {
1638 if (!memcmp(cm_node->map_loc_addr, loc_addr, sizeof(cm_node->map_loc_addr)) && 1430 if (!memcmp(cm_node->loc_addr, loc_addr, sizeof(cm_node->loc_addr)) &&
1639 (cm_node->map_loc_port == loc_port) && 1431 (cm_node->loc_port == loc_port) &&
1640 !memcmp(cm_node->map_rem_addr, rem_addr, sizeof(cm_node->map_rem_addr)) && 1432 !memcmp(cm_node->rem_addr, rem_addr, sizeof(cm_node->rem_addr)) &&
1641 (cm_node->map_rem_port == rem_port)) { 1433 (cm_node->rem_port == rem_port)) {
1642 if (add_refcnt) 1434 if (add_refcnt)
1643 atomic_inc(&cm_node->ref_count); 1435 atomic_inc(&cm_node->ref_count);
1644 spin_unlock_irqrestore(&cm_core->ht_lock, flags); 1436 spin_unlock_irqrestore(&cm_core->ht_lock, flags);
@@ -1664,8 +1456,7 @@ static struct i40iw_cm_listener *i40iw_find_listener(
1664 u16 dst_port, 1456 u16 dst_port,
1665 u16 vlan_id, 1457 u16 vlan_id,
1666 enum i40iw_cm_listener_state 1458 enum i40iw_cm_listener_state
1667 listener_state, 1459 listener_state)
1668 bool mapped)
1669{ 1460{
1670 struct i40iw_cm_listener *listen_node; 1461 struct i40iw_cm_listener *listen_node;
1671 static const u32 ip_zero[4] = { 0, 0, 0, 0 }; 1462 static const u32 ip_zero[4] = { 0, 0, 0, 0 };
@@ -1676,13 +1467,8 @@ static struct i40iw_cm_listener *i40iw_find_listener(
1676 /* walk list and find cm_node associated with this session ID */ 1467 /* walk list and find cm_node associated with this session ID */
1677 spin_lock_irqsave(&cm_core->listen_list_lock, flags); 1468 spin_lock_irqsave(&cm_core->listen_list_lock, flags);
1678 list_for_each_entry(listen_node, &cm_core->listen_nodes, list) { 1469 list_for_each_entry(listen_node, &cm_core->listen_nodes, list) {
1679 if (mapped) { 1470 memcpy(listen_addr, listen_node->loc_addr, sizeof(listen_addr));
1680 memcpy(listen_addr, listen_node->map_loc_addr, sizeof(listen_addr)); 1471 listen_port = listen_node->loc_port;
1681 listen_port = listen_node->map_loc_port;
1682 } else {
1683 memcpy(listen_addr, listen_node->loc_addr, sizeof(listen_addr));
1684 listen_port = listen_node->loc_port;
1685 }
1686 /* compare node pair, return node handle if a match */ 1472 /* compare node pair, return node handle if a match */
1687 if ((!memcmp(listen_addr, dst_addr, sizeof(listen_addr)) || 1473 if ((!memcmp(listen_addr, dst_addr, sizeof(listen_addr)) ||
1688 !memcmp(listen_addr, ip_zero, sizeof(listen_addr))) && 1474 !memcmp(listen_addr, ip_zero, sizeof(listen_addr))) &&
@@ -1732,7 +1518,7 @@ static bool i40iw_listen_port_in_use(struct i40iw_cm_core *cm_core, u16 port)
1732 1518
1733 spin_lock_irqsave(&cm_core->listen_list_lock, flags); 1519 spin_lock_irqsave(&cm_core->listen_list_lock, flags);
1734 list_for_each_entry(listen_node, &cm_core->listen_nodes, list) { 1520 list_for_each_entry(listen_node, &cm_core->listen_nodes, list) {
1735 if (listen_node->map_loc_port == port) { 1521 if (listen_node->loc_port == port) {
1736 ret = true; 1522 ret = true;
1737 break; 1523 break;
1738 } 1524 }
@@ -1774,8 +1560,6 @@ static enum i40iw_status_code i40iw_del_multiple_qhash(
1774 child_listen_node->loc_port, 1560 child_listen_node->loc_port,
1775 child_listen_node->vlan_id); 1561 child_listen_node->vlan_id);
1776 list_del(pos); 1562 list_del(pos);
1777 memcpy(cm_info->map_loc_addr, child_listen_node->map_loc_addr,
1778 sizeof(cm_info->map_loc_addr));
1779 memcpy(cm_info->loc_addr, child_listen_node->loc_addr, 1563 memcpy(cm_info->loc_addr, child_listen_node->loc_addr,
1780 sizeof(cm_info->loc_addr)); 1564 sizeof(cm_info->loc_addr));
1781 cm_info->vlan_id = child_listen_node->vlan_id; 1565 cm_info->vlan_id = child_listen_node->vlan_id;
@@ -1902,11 +1686,6 @@ static enum i40iw_status_code i40iw_add_mqh_6(struct i40iw_device *iwdev,
1902 1686
1903 i40iw_copy_ip_ntohl(child_listen_node->loc_addr, 1687 i40iw_copy_ip_ntohl(child_listen_node->loc_addr,
1904 ifp->addr.in6_u.u6_addr32); 1688 ifp->addr.in6_u.u6_addr32);
1905 i40iw_copy_ip_ntohl(child_listen_node->map_loc_addr,
1906 ifp->addr.in6_u.u6_addr32);
1907
1908 memcpy(cm_info->map_loc_addr, child_listen_node->map_loc_addr,
1909 sizeof(cm_info->map_loc_addr));
1910 memcpy(cm_info->loc_addr, child_listen_node->loc_addr, 1689 memcpy(cm_info->loc_addr, child_listen_node->loc_addr,
1911 sizeof(cm_info->loc_addr)); 1690 sizeof(cm_info->loc_addr));
1912 1691
@@ -1983,10 +1762,6 @@ static enum i40iw_status_code i40iw_add_mqh_4(
1983 sizeof(*child_listen_node)); 1762 sizeof(*child_listen_node));
1984 1763
1985 child_listen_node->loc_addr[0] = ntohl(ifa->ifa_address); 1764 child_listen_node->loc_addr[0] = ntohl(ifa->ifa_address);
1986 child_listen_node->map_loc_addr[0] = ntohl(ifa->ifa_address);
1987
1988 memcpy(cm_info->map_loc_addr, child_listen_node->map_loc_addr,
1989 sizeof(cm_info->map_loc_addr));
1990 memcpy(cm_info->loc_addr, child_listen_node->loc_addr, 1765 memcpy(cm_info->loc_addr, child_listen_node->loc_addr,
1991 sizeof(cm_info->loc_addr)); 1766 sizeof(cm_info->loc_addr));
1992 1767
@@ -2095,20 +1870,16 @@ static int i40iw_dec_refcnt_listen(struct i40iw_cm_core *cm_core,
2095 spin_unlock_irqrestore(&cm_core->listen_list_lock, flags); 1870 spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
2096 1871
2097 if (listener->iwdev) { 1872 if (listener->iwdev) {
2098 if (apbvt_del && !i40iw_listen_port_in_use(cm_core, listener->map_loc_port)) 1873 if (apbvt_del && !i40iw_listen_port_in_use(cm_core, listener->loc_port))
2099 i40iw_manage_apbvt(listener->iwdev, 1874 i40iw_manage_apbvt(listener->iwdev,
2100 listener->map_loc_port, 1875 listener->loc_port,
2101 I40IW_MANAGE_APBVT_DEL); 1876 I40IW_MANAGE_APBVT_DEL);
2102 1877
2103 memcpy(nfo.loc_addr, listener->loc_addr, sizeof(nfo.loc_addr)); 1878 memcpy(nfo.loc_addr, listener->loc_addr, sizeof(nfo.loc_addr));
2104 memcpy(nfo.map_loc_addr, listener->map_loc_addr, sizeof(nfo.map_loc_addr));
2105 nfo.loc_port = listener->loc_port; 1879 nfo.loc_port = listener->loc_port;
2106 nfo.map_loc_port = listener->map_loc_port;
2107 nfo.ipv4 = listener->ipv4; 1880 nfo.ipv4 = listener->ipv4;
2108 nfo.vlan_id = listener->vlan_id; 1881 nfo.vlan_id = listener->vlan_id;
2109 1882
2110 i40iw_remove_mapinfo(&nfo);
2111
2112 if (!list_empty(&listener->child_listen_list)) { 1883 if (!list_empty(&listener->child_listen_list)) {
2113 i40iw_del_multiple_qhash(listener->iwdev, &nfo, listener); 1884 i40iw_del_multiple_qhash(listener->iwdev, &nfo, listener);
2114 } else { 1885 } else {
@@ -2372,14 +2143,8 @@ static struct i40iw_cm_node *i40iw_make_cm_node(
2372 cm_node->vlan_id = cm_info->vlan_id; 2143 cm_node->vlan_id = cm_info->vlan_id;
2373 memcpy(cm_node->loc_addr, cm_info->loc_addr, sizeof(cm_node->loc_addr)); 2144 memcpy(cm_node->loc_addr, cm_info->loc_addr, sizeof(cm_node->loc_addr));
2374 memcpy(cm_node->rem_addr, cm_info->rem_addr, sizeof(cm_node->rem_addr)); 2145 memcpy(cm_node->rem_addr, cm_info->rem_addr, sizeof(cm_node->rem_addr));
2375 memcpy(cm_node->map_loc_addr, cm_info->map_loc_addr,
2376 sizeof(cm_node->map_loc_addr));
2377 memcpy(cm_node->map_rem_addr, cm_info->map_rem_addr,
2378 sizeof(cm_node->map_rem_addr));
2379 cm_node->loc_port = cm_info->loc_port; 2146 cm_node->loc_port = cm_info->loc_port;
2380 cm_node->rem_port = cm_info->rem_port; 2147 cm_node->rem_port = cm_info->rem_port;
2381 cm_node->map_loc_port = cm_info->map_loc_port;
2382 cm_node->map_rem_port = cm_info->map_rem_port;
2383 2148
2384 cm_node->mpa_frame_rev = iwdev->mpa_version; 2149 cm_node->mpa_frame_rev = iwdev->mpa_version;
2385 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; 2150 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO;
@@ -2410,26 +2175,26 @@ static struct i40iw_cm_node *i40iw_make_cm_node(
2410 (!cm_node->ipv4 && i40iw_ipv6_is_loopback(cm_node->loc_addr, 2175 (!cm_node->ipv4 && i40iw_ipv6_is_loopback(cm_node->loc_addr,
2411 cm_node->rem_addr))) { 2176 cm_node->rem_addr))) {
2412 arpindex = i40iw_arp_table(iwdev, 2177 arpindex = i40iw_arp_table(iwdev,
2413 cm_node->map_rem_addr, 2178 cm_node->rem_addr,
2414 false, 2179 false,
2415 NULL, 2180 NULL,
2416 I40IW_ARP_RESOLVE); 2181 I40IW_ARP_RESOLVE);
2417 } else { 2182 } else {
2418 oldarpindex = i40iw_arp_table(iwdev, 2183 oldarpindex = i40iw_arp_table(iwdev,
2419 cm_node->map_rem_addr, 2184 cm_node->rem_addr,
2420 false, 2185 false,
2421 NULL, 2186 NULL,
2422 I40IW_ARP_RESOLVE); 2187 I40IW_ARP_RESOLVE);
2423 if (cm_node->ipv4) 2188 if (cm_node->ipv4)
2424 arpindex = i40iw_addr_resolve_neigh(iwdev, 2189 arpindex = i40iw_addr_resolve_neigh(iwdev,
2425 cm_info->map_loc_addr[0], 2190 cm_info->loc_addr[0],
2426 cm_info->map_rem_addr[0], 2191 cm_info->rem_addr[0],
2427 oldarpindex); 2192 oldarpindex);
2428#if IS_ENABLED(CONFIG_IPV6) 2193#if IS_ENABLED(CONFIG_IPV6)
2429 else 2194 else
2430 arpindex = i40iw_addr_resolve_neigh_ipv6(iwdev, 2195 arpindex = i40iw_addr_resolve_neigh_ipv6(iwdev,
2431 cm_info->map_loc_addr, 2196 cm_info->loc_addr,
2432 cm_info->map_rem_addr, 2197 cm_info->rem_addr,
2433 oldarpindex); 2198 oldarpindex);
2434#endif 2199#endif
2435 } 2200 }
@@ -2473,13 +2238,12 @@ static void i40iw_rem_ref_cm_node(struct i40iw_cm_node *cm_node)
2473 if (cm_node->listener) { 2238 if (cm_node->listener) {
2474 i40iw_dec_refcnt_listen(cm_core, cm_node->listener, 0, true); 2239 i40iw_dec_refcnt_listen(cm_core, cm_node->listener, 0, true);
2475 } else { 2240 } else {
2476 if (!i40iw_listen_port_in_use(cm_core, htons(cm_node->map_loc_port)) && 2241 if (!i40iw_listen_port_in_use(cm_core, htons(cm_node->loc_port)) &&
2477 cm_node->apbvt_set && cm_node->iwdev) { 2242 cm_node->apbvt_set && cm_node->iwdev) {
2478 i40iw_manage_apbvt(cm_node->iwdev, 2243 i40iw_manage_apbvt(cm_node->iwdev,
2479 cm_node->map_loc_port, 2244 cm_node->loc_port,
2480 I40IW_MANAGE_APBVT_DEL); 2245 I40IW_MANAGE_APBVT_DEL);
2481 i40iw_get_addr_info(cm_node, &nfo); 2246 i40iw_get_addr_info(cm_node, &nfo);
2482 i40iw_remove_mapinfo(&nfo);
2483 if (cm_node->qhash_set) { 2247 if (cm_node->qhash_set) {
2484 i40iw_manage_qhash(cm_node->iwdev, 2248 i40iw_manage_qhash(cm_node->iwdev,
2485 &nfo, 2249 &nfo,
@@ -2499,7 +2263,6 @@ static void i40iw_rem_ref_cm_node(struct i40iw_cm_node *cm_node)
2499 cm_node->iwqp = NULL; 2263 cm_node->iwqp = NULL;
2500 } else if (cm_node->qhash_set) { 2264 } else if (cm_node->qhash_set) {
2501 i40iw_get_addr_info(cm_node, &nfo); 2265 i40iw_get_addr_info(cm_node, &nfo);
2502 i40iw_remove_mapinfo(&nfo);
2503 i40iw_manage_qhash(cm_node->iwdev, 2266 i40iw_manage_qhash(cm_node->iwdev,
2504 &nfo, 2267 &nfo,
2505 I40IW_QHASH_TYPE_TCP_ESTABLISHED, 2268 I40IW_QHASH_TYPE_TCP_ESTABLISHED,
@@ -2916,7 +2679,6 @@ static int i40iw_handle_ack_pkt(struct i40iw_cm_node *cm_node,
2916 cm_node->state = I40IW_CM_STATE_ESTABLISHED; 2679 cm_node->state = I40IW_CM_STATE_ESTABLISHED;
2917 if (datasize) { 2680 if (datasize) {
2918 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; 2681 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;
2919 i40iw_get_remote_addr(cm_node);
2920 i40iw_handle_rcv_mpa(cm_node, rbuf); 2682 i40iw_handle_rcv_mpa(cm_node, rbuf);
2921 } 2683 }
2922 break; 2684 break;
@@ -3028,17 +2790,13 @@ static struct i40iw_cm_listener *i40iw_make_listen_node(
3028 struct i40iw_cm_info *cm_info) 2790 struct i40iw_cm_info *cm_info)
3029{ 2791{
3030 struct i40iw_cm_listener *listener; 2792 struct i40iw_cm_listener *listener;
3031 struct iwpm_dev_data pm_reg_msg;
3032 struct iwpm_sa_data pm_msg;
3033 int iwpm_err;
3034 unsigned long flags; 2793 unsigned long flags;
3035 2794
3036 /* cannot have multiple matching listeners */ 2795 /* cannot have multiple matching listeners */
3037 listener = i40iw_find_listener(cm_core, cm_info->loc_addr, 2796 listener = i40iw_find_listener(cm_core, cm_info->loc_addr,
3038 cm_info->loc_port, 2797 cm_info->loc_port,
3039 cm_info->vlan_id, 2798 cm_info->vlan_id,
3040 I40IW_CM_LISTENER_EITHER_STATE, 2799 I40IW_CM_LISTENER_EITHER_STATE);
3041 false);
3042 if (listener && 2800 if (listener &&
3043 (listener->listener_state == I40IW_CM_LISTENER_ACTIVE_STATE)) { 2801 (listener->listener_state == I40IW_CM_LISTENER_ACTIVE_STATE)) {
3044 atomic_dec(&listener->ref_count); 2802 atomic_dec(&listener->ref_count);
@@ -3049,32 +2807,13 @@ static struct i40iw_cm_listener *i40iw_make_listen_node(
3049 } 2807 }
3050 2808
3051 if (!listener) { 2809 if (!listener) {
3052 i40iw_form_reg_msg(iwdev, &pm_reg_msg);
3053 iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_I40IW);
3054 if (iwpm_err)
3055 i40iw_pr_err("PM register fail err = %d\n",
3056 iwpm_err);
3057
3058 if (iwpm_valid_pid() && !iwpm_err) {
3059 i40iw_form_pm_msg(cm_info, &pm_msg);
3060 iwpm_err = iwpm_add_mapping(&pm_msg, RDMA_NL_I40IW);
3061 if (iwpm_err)
3062 i40iw_pr_err("PM query fail err = %d\n",
3063 iwpm_err);
3064 else
3065 i40iw_record_pm_msg(cm_info, &pm_msg, false);
3066 }
3067
3068 /* create a CM listen node (1/2 node to compare incoming traffic to) */ 2810 /* create a CM listen node (1/2 node to compare incoming traffic to) */
3069 listener = kzalloc(sizeof(*listener), GFP_ATOMIC); 2811 listener = kzalloc(sizeof(*listener), GFP_ATOMIC);
3070 if (!listener) 2812 if (!listener)
3071 return NULL; 2813 return NULL;
3072 cm_core->stats_listen_nodes_created++; 2814 cm_core->stats_listen_nodes_created++;
3073 memcpy(listener->loc_addr, cm_info->loc_addr, sizeof(listener->loc_addr)); 2815 memcpy(listener->loc_addr, cm_info->loc_addr, sizeof(listener->loc_addr));
3074 memcpy(listener->map_loc_addr, cm_info->map_loc_addr,
3075 sizeof(listener->map_loc_addr));
3076 listener->loc_port = cm_info->loc_port; 2816 listener->loc_port = cm_info->loc_port;
3077 listener->map_loc_port = cm_info->map_loc_port;
3078 2817
3079 INIT_LIST_HEAD(&listener->child_listen_list); 2818 INIT_LIST_HEAD(&listener->child_listen_list);
3080 2819
@@ -3134,19 +2873,16 @@ static struct i40iw_cm_node *i40iw_create_cm_node(
3134 if (!memcmp(cm_info->loc_addr, cm_info->rem_addr, sizeof(cm_info->loc_addr))) { 2873 if (!memcmp(cm_info->loc_addr, cm_info->rem_addr, sizeof(cm_info->loc_addr))) {
3135 loopback_remotelistener = i40iw_find_listener( 2874 loopback_remotelistener = i40iw_find_listener(
3136 cm_core, 2875 cm_core,
3137 cm_info->map_rem_addr, 2876 cm_info->rem_addr,
3138 cm_node->map_rem_port, 2877 cm_node->rem_port,
3139 cm_node->vlan_id, 2878 cm_node->vlan_id,
3140 I40IW_CM_LISTENER_ACTIVE_STATE, 2879 I40IW_CM_LISTENER_ACTIVE_STATE);
3141 true);
3142 if (!loopback_remotelistener) { 2880 if (!loopback_remotelistener) {
3143 i40iw_create_event(cm_node, I40IW_CM_EVENT_ABORTED); 2881 i40iw_create_event(cm_node, I40IW_CM_EVENT_ABORTED);
3144 } else { 2882 } else {
3145 loopback_cm_info = *cm_info; 2883 loopback_cm_info = *cm_info;
3146 loopback_cm_info.loc_port = cm_info->rem_port; 2884 loopback_cm_info.loc_port = cm_info->rem_port;
3147 loopback_cm_info.rem_port = cm_info->loc_port; 2885 loopback_cm_info.rem_port = cm_info->loc_port;
3148 loopback_cm_info.map_loc_port = cm_info->map_rem_port;
3149 loopback_cm_info.map_rem_port = cm_info->map_loc_port;
3150 loopback_cm_info.cm_id = loopback_remotelistener->cm_id; 2886 loopback_cm_info.cm_id = loopback_remotelistener->cm_id;
3151 loopback_cm_info.ipv4 = cm_info->ipv4; 2887 loopback_cm_info.ipv4 = cm_info->ipv4;
3152 loopback_remotenode = i40iw_make_cm_node(cm_core, 2888 loopback_remotenode = i40iw_make_cm_node(cm_core,
@@ -3385,13 +3121,11 @@ void i40iw_receive_ilq(struct i40iw_sc_dev *dev, struct i40iw_puda_buf *rbuf)
3385 } 3121 }
3386 cm_info.loc_port = ntohs(tcph->dest); 3122 cm_info.loc_port = ntohs(tcph->dest);
3387 cm_info.rem_port = ntohs(tcph->source); 3123 cm_info.rem_port = ntohs(tcph->source);
3388 i40iw_init_mapinfo(&cm_info);
3389
3390 cm_node = i40iw_find_node(cm_core, 3124 cm_node = i40iw_find_node(cm_core,
3391 cm_info.map_rem_port, 3125 cm_info.rem_port,
3392 cm_info.map_rem_addr, 3126 cm_info.rem_addr,
3393 cm_info.map_loc_port, 3127 cm_info.loc_port,
3394 cm_info.map_loc_addr, 3128 cm_info.loc_addr,
3395 true); 3129 true);
3396 3130
3397 if (!cm_node) { 3131 if (!cm_node) {
@@ -3401,11 +3135,10 @@ void i40iw_receive_ilq(struct i40iw_sc_dev *dev, struct i40iw_puda_buf *rbuf)
3401 return; 3135 return;
3402 listener = 3136 listener =
3403 i40iw_find_listener(cm_core, 3137 i40iw_find_listener(cm_core,
3404 cm_info.map_loc_addr, 3138 cm_info.loc_addr,
3405 cm_info.map_loc_port, 3139 cm_info.loc_port,
3406 cm_info.vlan_id, 3140 cm_info.vlan_id,
3407 I40IW_CM_LISTENER_ACTIVE_STATE, 3141 I40IW_CM_LISTENER_ACTIVE_STATE);
3408 true);
3409 if (!listener) { 3142 if (!listener) {
3410 cm_info.cm_id = NULL; 3143 cm_info.cm_id = NULL;
3411 i40iw_debug(cm_core->dev, 3144 i40iw_debug(cm_core->dev,
@@ -3532,27 +3265,27 @@ static void i40iw_init_tcp_ctx(struct i40iw_cm_node *cm_node,
3532 tcp_info->vlan_tag = cpu_to_le16(cm_node->vlan_id); 3265 tcp_info->vlan_tag = cpu_to_le16(cm_node->vlan_id);
3533 } 3266 }
3534 if (cm_node->ipv4) { 3267 if (cm_node->ipv4) {
3535 tcp_info->src_port = cpu_to_le16(cm_node->map_loc_port); 3268 tcp_info->src_port = cpu_to_le16(cm_node->loc_port);
3536 tcp_info->dst_port = cpu_to_le16(cm_node->map_rem_port); 3269 tcp_info->dst_port = cpu_to_le16(cm_node->rem_port);
3537 3270
3538 tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->map_rem_addr[0]); 3271 tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->rem_addr[0]);
3539 tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->map_loc_addr[0]); 3272 tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[0]);
3540 tcp_info->arp_idx = cpu_to_le32(i40iw_arp_table(iwqp->iwdev, 3273 tcp_info->arp_idx = cpu_to_le32(i40iw_arp_table(iwqp->iwdev,
3541 &tcp_info->dest_ip_addr3, 3274 &tcp_info->dest_ip_addr3,
3542 true, 3275 true,
3543 NULL, 3276 NULL,
3544 I40IW_ARP_RESOLVE)); 3277 I40IW_ARP_RESOLVE));
3545 } else { 3278 } else {
3546 tcp_info->src_port = cpu_to_le16(cm_node->map_loc_port); 3279 tcp_info->src_port = cpu_to_le16(cm_node->loc_port);
3547 tcp_info->dst_port = cpu_to_le16(cm_node->map_rem_port); 3280 tcp_info->dst_port = cpu_to_le16(cm_node->rem_port);
3548 tcp_info->dest_ip_addr0 = cpu_to_le32(cm_node->map_rem_addr[0]); 3281 tcp_info->dest_ip_addr0 = cpu_to_le32(cm_node->rem_addr[0]);
3549 tcp_info->dest_ip_addr1 = cpu_to_le32(cm_node->map_rem_addr[1]); 3282 tcp_info->dest_ip_addr1 = cpu_to_le32(cm_node->rem_addr[1]);
3550 tcp_info->dest_ip_addr2 = cpu_to_le32(cm_node->map_rem_addr[2]); 3283 tcp_info->dest_ip_addr2 = cpu_to_le32(cm_node->rem_addr[2]);
3551 tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->map_rem_addr[3]); 3284 tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->rem_addr[3]);
3552 tcp_info->local_ipaddr0 = cpu_to_le32(cm_node->map_loc_addr[0]); 3285 tcp_info->local_ipaddr0 = cpu_to_le32(cm_node->loc_addr[0]);
3553 tcp_info->local_ipaddr1 = cpu_to_le32(cm_node->map_loc_addr[1]); 3286 tcp_info->local_ipaddr1 = cpu_to_le32(cm_node->loc_addr[1]);
3554 tcp_info->local_ipaddr2 = cpu_to_le32(cm_node->map_loc_addr[2]); 3287 tcp_info->local_ipaddr2 = cpu_to_le32(cm_node->loc_addr[2]);
3555 tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->map_loc_addr[3]); 3288 tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[3]);
3556 tcp_info->arp_idx = cpu_to_le32(i40iw_arp_table( 3289 tcp_info->arp_idx = cpu_to_le32(i40iw_arp_table(
3557 iwqp->iwdev, 3290 iwqp->iwdev,
3558 &tcp_info->dest_ip_addr0, 3291 &tcp_info->dest_ip_addr0,
@@ -4023,11 +3756,8 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
4023 struct sockaddr_in *raddr; 3756 struct sockaddr_in *raddr;
4024 struct sockaddr_in6 *laddr6; 3757 struct sockaddr_in6 *laddr6;
4025 struct sockaddr_in6 *raddr6; 3758 struct sockaddr_in6 *raddr6;
4026 struct iwpm_dev_data pm_reg_msg;
4027 struct iwpm_sa_data pm_msg;
4028 int apbvt_set = 0; 3759 int apbvt_set = 0;
4029 enum i40iw_status_code status; 3760 enum i40iw_status_code status;
4030 int iwpm_err;
4031 3761
4032 ibqp = i40iw_get_qp(cm_id->device, conn_param->qpn); 3762 ibqp = i40iw_get_qp(cm_id->device, conn_param->qpn);
4033 if (!ibqp) 3763 if (!ibqp)
@@ -4039,10 +3769,10 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
4039 if (!iwdev) 3769 if (!iwdev)
4040 return -EINVAL; 3770 return -EINVAL;
4041 3771
4042 laddr = (struct sockaddr_in *)&cm_id->local_addr; 3772 laddr = (struct sockaddr_in *)&cm_id->m_local_addr;
4043 raddr = (struct sockaddr_in *)&cm_id->remote_addr; 3773 raddr = (struct sockaddr_in *)&cm_id->m_remote_addr;
4044 laddr6 = (struct sockaddr_in6 *)&cm_id->local_addr; 3774 laddr6 = (struct sockaddr_in6 *)&cm_id->m_local_addr;
4045 raddr6 = (struct sockaddr_in6 *)&cm_id->remote_addr; 3775 raddr6 = (struct sockaddr_in6 *)&cm_id->m_remote_addr;
4046 3776
4047 if (!(laddr->sin_port) || !(raddr->sin_port)) 3777 if (!(laddr->sin_port) || !(raddr->sin_port))
4048 return -EINVAL; 3778 return -EINVAL;
@@ -4071,30 +3801,7 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
4071 cm_info.rem_port = ntohs(raddr6->sin6_port); 3801 cm_info.rem_port = ntohs(raddr6->sin6_port);
4072 i40iw_netdev_vlan_ipv6(cm_info.loc_addr, &cm_info.vlan_id, NULL); 3802 i40iw_netdev_vlan_ipv6(cm_info.loc_addr, &cm_info.vlan_id, NULL);
4073 } 3803 }
4074 i40iw_init_mapinfo(&cm_info);
4075 cm_info.cm_id = cm_id; 3804 cm_info.cm_id = cm_id;
4076
4077 i40iw_form_reg_msg(iwdev, &pm_reg_msg);
4078 iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_I40IW);
4079 if (iwpm_err)
4080 i40iw_pr_err("PM register fail err = %d\n",
4081 iwpm_err);
4082
4083 if (iwpm_valid_pid() && !iwpm_err) {
4084 i40iw_form_pm_msg(&cm_info, &pm_msg);
4085 iwpm_err = iwpm_add_and_query_mapping(&pm_msg, RDMA_NL_I40IW);
4086 if (iwpm_err)
4087 i40iw_pr_err("PM query fail err = %d\n",
4088 iwpm_err);
4089 else
4090 i40iw_record_pm_msg(&cm_info, &pm_msg, true);
4091 }
4092
4093 if (i40iw_create_mapinfo(&cm_info)) {
4094 i40iw_pr_err("Fail to create mapinfo\n");
4095 return -ENOMEM;
4096 }
4097
4098 if ((cm_info.ipv4 && (laddr->sin_addr.s_addr != raddr->sin_addr.s_addr)) || 3805 if ((cm_info.ipv4 && (laddr->sin_addr.s_addr != raddr->sin_addr.s_addr)) ||
4099 (!cm_info.ipv4 && memcmp(laddr6->sin6_addr.in6_u.u6_addr32, 3806 (!cm_info.ipv4 && memcmp(laddr6->sin6_addr.in6_u.u6_addr32,
4100 raddr6->sin6_addr.in6_u.u6_addr32, 3807 raddr6->sin6_addr.in6_u.u6_addr32,
@@ -4105,14 +3812,11 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
4105 I40IW_QHASH_MANAGE_TYPE_ADD, 3812 I40IW_QHASH_MANAGE_TYPE_ADD,
4106 NULL, 3813 NULL,
4107 true); 3814 true);
4108 if (status) { 3815 if (status)
4109 i40iw_remove_mapinfo(&cm_info);
4110 return -EINVAL; 3816 return -EINVAL;
4111 }
4112 } 3817 }
4113 status = i40iw_manage_apbvt(iwdev, cm_info.map_loc_port, I40IW_MANAGE_APBVT_ADD); 3818 status = i40iw_manage_apbvt(iwdev, cm_info.loc_port, I40IW_MANAGE_APBVT_ADD);
4114 if (status) { 3819 if (status) {
4115 i40iw_remove_mapinfo(&cm_info);
4116 i40iw_manage_qhash(iwdev, 3820 i40iw_manage_qhash(iwdev,
4117 &cm_info, 3821 &cm_info,
4118 I40IW_QHASH_TYPE_TCP_ESTABLISHED, 3822 I40IW_QHASH_TYPE_TCP_ESTABLISHED,
@@ -4137,12 +3841,10 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
4137 false); 3841 false);
4138 3842
4139 if (apbvt_set && !i40iw_listen_port_in_use(&iwdev->cm_core, 3843 if (apbvt_set && !i40iw_listen_port_in_use(&iwdev->cm_core,
4140 cm_info.map_loc_port)) 3844 cm_info.loc_port))
4141 i40iw_manage_apbvt(iwdev, 3845 i40iw_manage_apbvt(iwdev,
4142 cm_info.map_loc_port, 3846 cm_info.loc_port,
4143 I40IW_MANAGE_APBVT_DEL); 3847 I40IW_MANAGE_APBVT_DEL);
4144
4145 i40iw_remove_mapinfo(&cm_info);
4146 cm_id->rem_ref(cm_id); 3848 cm_id->rem_ref(cm_id);
4147 iwdev->cm_core.stats_connect_errs++; 3849 iwdev->cm_core.stats_connect_errs++;
4148 return -ENOMEM; 3850 return -ENOMEM;
@@ -4181,8 +3883,8 @@ int i40iw_create_listen(struct iw_cm_id *cm_id, int backlog)
4181 if (!iwdev) 3883 if (!iwdev)
4182 return -EINVAL; 3884 return -EINVAL;
4183 3885
4184 laddr = (struct sockaddr_in *)&cm_id->local_addr; 3886 laddr = (struct sockaddr_in *)&cm_id->m_local_addr;
4185 laddr6 = (struct sockaddr_in6 *)&cm_id->local_addr; 3887 laddr6 = (struct sockaddr_in6 *)&cm_id->m_local_addr;
4186 memset(&cm_info, 0, sizeof(cm_info)); 3888 memset(&cm_info, 0, sizeof(cm_info));
4187 if (laddr->sin_family == AF_INET) { 3889 if (laddr->sin_family == AF_INET) {
4188 cm_info.ipv4 = true; 3890 cm_info.ipv4 = true;
@@ -4206,7 +3908,6 @@ int i40iw_create_listen(struct iw_cm_id *cm_id, int backlog)
4206 else 3908 else
4207 wildcard = true; 3909 wildcard = true;
4208 } 3910 }
4209 i40iw_init_mapinfo(&cm_info);
4210 cm_info.backlog = backlog; 3911 cm_info.backlog = backlog;
4211 cm_info.cm_id = cm_id; 3912 cm_info.cm_id = cm_id;
4212 3913
@@ -4219,8 +3920,6 @@ int i40iw_create_listen(struct iw_cm_id *cm_id, int backlog)
4219 cm_id->provider_data = cm_listen_node; 3920 cm_id->provider_data = cm_listen_node;
4220 3921
4221 if (!cm_listen_node->reused_node) { 3922 if (!cm_listen_node->reused_node) {
4222 if (i40iw_create_mapinfo(&cm_info))
4223 goto error;
4224 if (wildcard) { 3923 if (wildcard) {
4225 if (cm_info.ipv4) 3924 if (cm_info.ipv4)
4226 ret = i40iw_add_mqh_4(iwdev, 3925 ret = i40iw_add_mqh_4(iwdev,
@@ -4234,7 +3933,7 @@ int i40iw_create_listen(struct iw_cm_id *cm_id, int backlog)
4234 goto error; 3933 goto error;
4235 3934
4236 ret = i40iw_manage_apbvt(iwdev, 3935 ret = i40iw_manage_apbvt(iwdev,
4237 cm_info.map_loc_port, 3936 cm_info.loc_port,
4238 I40IW_MANAGE_APBVT_ADD); 3937 I40IW_MANAGE_APBVT_ADD);
4239 3938
4240 if (ret) 3939 if (ret)
@@ -4250,7 +3949,7 @@ int i40iw_create_listen(struct iw_cm_id *cm_id, int backlog)
4250 goto error; 3949 goto error;
4251 cm_listen_node->qhash_set = true; 3950 cm_listen_node->qhash_set = true;
4252 ret = i40iw_manage_apbvt(iwdev, 3951 ret = i40iw_manage_apbvt(iwdev,
4253 cm_info.map_loc_port, 3952 cm_info.loc_port,
4254 I40IW_MANAGE_APBVT_ADD); 3953 I40IW_MANAGE_APBVT_ADD);
4255 if (ret) 3954 if (ret)
4256 goto error; 3955 goto error;
diff --git a/drivers/infiniband/hw/i40iw/i40iw_hw.c b/drivers/infiniband/hw/i40iw/i40iw_hw.c
index bee9ba61ba2e..9fd302425563 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_hw.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_hw.c
@@ -553,17 +553,17 @@ enum i40iw_status_code i40iw_manage_qhash(struct i40iw_device *iwdev,
553 info->ipv4_valid = cminfo->ipv4; 553 info->ipv4_valid = cminfo->ipv4;
554 ether_addr_copy(info->mac_addr, iwdev->netdev->dev_addr); 554 ether_addr_copy(info->mac_addr, iwdev->netdev->dev_addr);
555 info->qp_num = cpu_to_le32(dev->ilq->qp_id); 555 info->qp_num = cpu_to_le32(dev->ilq->qp_id);
556 info->dest_port = cpu_to_le16(cminfo->map_loc_port); 556 info->dest_port = cpu_to_le16(cminfo->loc_port);
557 info->dest_ip[0] = cpu_to_le32(cminfo->map_loc_addr[0]); 557 info->dest_ip[0] = cpu_to_le32(cminfo->loc_addr[0]);
558 info->dest_ip[1] = cpu_to_le32(cminfo->map_loc_addr[1]); 558 info->dest_ip[1] = cpu_to_le32(cminfo->loc_addr[1]);
559 info->dest_ip[2] = cpu_to_le32(cminfo->map_loc_addr[2]); 559 info->dest_ip[2] = cpu_to_le32(cminfo->loc_addr[2]);
560 info->dest_ip[3] = cpu_to_le32(cminfo->map_loc_addr[3]); 560 info->dest_ip[3] = cpu_to_le32(cminfo->loc_addr[3]);
561 if (etype == I40IW_QHASH_TYPE_TCP_ESTABLISHED) { 561 if (etype == I40IW_QHASH_TYPE_TCP_ESTABLISHED) {
562 info->src_port = cpu_to_le16(cminfo->map_rem_port); 562 info->src_port = cpu_to_le16(cminfo->rem_port);
563 info->src_ip[0] = cpu_to_le32(cminfo->map_rem_addr[0]); 563 info->src_ip[0] = cpu_to_le32(cminfo->rem_addr[0]);
564 info->src_ip[1] = cpu_to_le32(cminfo->map_rem_addr[1]); 564 info->src_ip[1] = cpu_to_le32(cminfo->rem_addr[1]);
565 info->src_ip[2] = cpu_to_le32(cminfo->map_rem_addr[2]); 565 info->src_ip[2] = cpu_to_le32(cminfo->rem_addr[2]);
566 info->src_ip[3] = cpu_to_le32(cminfo->map_rem_addr[3]); 566 info->src_ip[3] = cpu_to_le32(cminfo->rem_addr[3]);
567 } 567 }
568 if (cmnode) { 568 if (cmnode) {
569 cqp_request->callback_fcn = i40iw_send_syn_cqp_callback; 569 cqp_request->callback_fcn = i40iw_send_syn_cqp_callback;
diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c
index a1ceef712ee7..90e5af21737e 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_main.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_main.c
@@ -102,17 +102,6 @@ static struct notifier_block i40iw_net_notifier = {
102 102
103static int i40iw_notifiers_registered; 103static int i40iw_notifiers_registered;
104 104
105/* registered port mapper netlink callbacks */
106static struct ibnl_client_cbs i40iw_nl_cb_table[] = {
107 [RDMA_NL_IWPM_REG_PID] = {.dump = iwpm_register_pid_cb},
108 [RDMA_NL_IWPM_ADD_MAPPING] = {.dump = iwpm_add_mapping_cb},
109 [RDMA_NL_IWPM_QUERY_MAPPING] = {.dump = iwpm_add_and_query_mapping_cb},
110 [RDMA_NL_IWPM_REMOTE_INFO] = {.dump = iwpm_remote_info_cb},
111 [RDMA_NL_IWPM_HANDLE_ERR] = {.dump = iwpm_mapping_error_cb},
112 [RDMA_NL_IWPM_MAPINFO] = {.dump = iwpm_mapping_info_cb},
113 [RDMA_NL_IWPM_MAPINFO_NUM] = {.dump = iwpm_ack_mapping_info_cb}
114};
115
116/** 105/**
117 * i40iw_find_i40e_handler - find a handler given a client info 106 * i40iw_find_i40e_handler - find a handler given a client info
118 * @ldev: pointer to a client info 107 * @ldev: pointer to a client info
@@ -1903,13 +1892,6 @@ static int __init i40iw_init_module(void)
1903 i40iw_client.type = I40E_CLIENT_IWARP; 1892 i40iw_client.type = I40E_CLIENT_IWARP;
1904 spin_lock_init(&i40iw_handler_lock); 1893 spin_lock_init(&i40iw_handler_lock);
1905 ret = i40e_register_client(&i40iw_client); 1894 ret = i40e_register_client(&i40iw_client);
1906 ret = iwpm_init(RDMA_NL_I40IW);
1907 if (ret)
1908 i40iw_pr_err("Port mapper initialization failed\n");
1909 ret = ibnl_add_client(RDMA_NL_I40IW, RDMA_NL_IWPM_NUM_OPS,
1910 i40iw_nl_cb_table);
1911 if (ret)
1912 i40iw_pr_err("Failed to add netlink callback\n");
1913 return ret; 1895 return ret;
1914} 1896}
1915 1897
@@ -1922,8 +1904,6 @@ static int __init i40iw_init_module(void)
1922static void __exit i40iw_exit_module(void) 1904static void __exit i40iw_exit_module(void)
1923{ 1905{
1924 i40e_unregister_client(&i40iw_client); 1906 i40e_unregister_client(&i40iw_client);
1925 ibnl_remove_client(RDMA_NL_I40IW);
1926 iwpm_exit(RDMA_NL_I40IW);
1927} 1907}
1928 1908
1929module_init(i40iw_init_module); 1909module_init(i40iw_init_module);
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
index c5c9805c9cb3..1fe3b84a06e4 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
@@ -2342,11 +2342,14 @@ static struct i40iw_ib_device *i40iw_init_rdma_device(struct i40iw_device *iwdev
2342 iwibdev->ibdev.iwcm->reject = i40iw_reject; 2342 iwibdev->ibdev.iwcm->reject = i40iw_reject;
2343 iwibdev->ibdev.iwcm->create_listen = i40iw_create_listen; 2343 iwibdev->ibdev.iwcm->create_listen = i40iw_create_listen;
2344 iwibdev->ibdev.iwcm->destroy_listen = i40iw_destroy_listen; 2344 iwibdev->ibdev.iwcm->destroy_listen = i40iw_destroy_listen;
2345 memcpy(iwibdev->ibdev.iwcm->ifname, netdev->name,
2346 sizeof(iwibdev->ibdev.iwcm->ifname));
2345 iwibdev->ibdev.get_port_immutable = i40iw_port_immutable; 2347 iwibdev->ibdev.get_port_immutable = i40iw_port_immutable;
2346 iwibdev->ibdev.poll_cq = i40iw_poll_cq; 2348 iwibdev->ibdev.poll_cq = i40iw_poll_cq;
2347 iwibdev->ibdev.req_notify_cq = i40iw_req_notify_cq; 2349 iwibdev->ibdev.req_notify_cq = i40iw_req_notify_cq;
2348 iwibdev->ibdev.post_send = i40iw_post_send; 2350 iwibdev->ibdev.post_send = i40iw_post_send;
2349 iwibdev->ibdev.post_recv = i40iw_post_recv; 2351 iwibdev->ibdev.post_recv = i40iw_post_recv;
2352
2350 return iwibdev; 2353 return iwibdev;
2351} 2354}
2352 2355