diff options
author | Faisal Latif <faisal.latif@intel.com> | 2016-02-26 10:18:01 -0500 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2016-03-16 13:50:52 -0400 |
commit | 8d8cd0bf67982a2b400ca3fd5d6807b834f6a38e (patch) | |
tree | 828efe85ad1f3d52301ad813b29775bf80608cb1 | |
parent | d37498417947cb2299fc749ae4af1d204c768cba (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.c | 427 | ||||
-rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_hw.c | 20 | ||||
-rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_main.c | 20 | ||||
-rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_verbs.c | 3 |
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 | */ | ||
216 | static 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 | */ | ||
243 | static 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 | */ | ||
263 | static 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 | */ | ||
280 | static 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 | */ | ||
301 | static 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 | */ | ||
320 | static 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 | */ | ||
331 | static 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 | */ | ||
345 | static 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 | */ | ||
368 | static 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 | */ | ||
401 | static 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 | ||
103 | static int i40iw_notifiers_registered; | 103 | static int i40iw_notifiers_registered; |
104 | 104 | ||
105 | /* registered port mapper netlink callbacks */ | ||
106 | static 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) | |||
1922 | static void __exit i40iw_exit_module(void) | 1904 | static 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 | ||
1929 | module_init(i40iw_init_module); | 1909 | module_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 | ||