aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/cxgb4/cm.c54
-rw-r--r--drivers/infiniband/hw/cxgb4/device.c1
2 files changed, 51 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
index 6fb31bacd5b4..3c3b00e4e7af 100644
--- a/drivers/infiniband/hw/cxgb4/cm.c
+++ b/drivers/infiniband/hw/cxgb4/cm.c
@@ -583,6 +583,22 @@ static void c4iw_record_pm_msg(struct c4iw_ep *ep,
583 sizeof(ep->com.mapped_remote_addr)); 583 sizeof(ep->com.mapped_remote_addr));
584} 584}
585 585
586static int get_remote_addr(struct c4iw_ep *ep)
587{
588 int ret;
589
590 print_addr(&ep->com, __func__, "get_remote_addr");
591
592 ret = iwpm_get_remote_info(&ep->com.mapped_local_addr,
593 &ep->com.mapped_remote_addr,
594 &ep->com.remote_addr, RDMA_NL_C4IW);
595 if (ret)
596 pr_info(MOD "Unable to find remote peer addr info - err %d\n",
597 ret);
598
599 return ret;
600}
601
586static void best_mtu(const unsigned short *mtus, unsigned short mtu, 602static void best_mtu(const unsigned short *mtus, unsigned short mtu,
587 unsigned int *idx, int use_ts, int ipv6) 603 unsigned int *idx, int use_ts, int ipv6)
588{ 604{
@@ -2352,27 +2368,57 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
2352 state_set(&child_ep->com, CONNECTING); 2368 state_set(&child_ep->com, CONNECTING);
2353 child_ep->com.dev = dev; 2369 child_ep->com.dev = dev;
2354 child_ep->com.cm_id = NULL; 2370 child_ep->com.cm_id = NULL;
2371
2372 /*
2373 * The mapped_local and mapped_remote addresses get setup with
2374 * the actual 4-tuple. The local address will be based on the
2375 * actual local address of the connection, but on the port number
2376 * of the parent listening endpoint. The remote address is
2377 * setup based on a query to the IWPM since we don't know what it
2378 * originally was before mapping. If no mapping was done, then
2379 * mapped_remote == remote, and mapped_local == local.
2380 */
2355 if (iptype == 4) { 2381 if (iptype == 4) {
2356 struct sockaddr_in *sin = (struct sockaddr_in *) 2382 struct sockaddr_in *sin = (struct sockaddr_in *)
2357 &child_ep->com.local_addr; 2383 &child_ep->com.mapped_local_addr;
2384
2358 sin->sin_family = PF_INET; 2385 sin->sin_family = PF_INET;
2359 sin->sin_port = local_port; 2386 sin->sin_port = local_port;
2360 sin->sin_addr.s_addr = *(__be32 *)local_ip; 2387 sin->sin_addr.s_addr = *(__be32 *)local_ip;
2361 sin = (struct sockaddr_in *)&child_ep->com.remote_addr; 2388
2389 sin = (struct sockaddr_in *)&child_ep->com.local_addr;
2390 sin->sin_family = PF_INET;
2391 sin->sin_port = ((struct sockaddr_in *)
2392 &parent_ep->com.local_addr)->sin_port;
2393 sin->sin_addr.s_addr = *(__be32 *)local_ip;
2394
2395 sin = (struct sockaddr_in *)&child_ep->com.mapped_remote_addr;
2362 sin->sin_family = PF_INET; 2396 sin->sin_family = PF_INET;
2363 sin->sin_port = peer_port; 2397 sin->sin_port = peer_port;
2364 sin->sin_addr.s_addr = *(__be32 *)peer_ip; 2398 sin->sin_addr.s_addr = *(__be32 *)peer_ip;
2365 } else { 2399 } else {
2366 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) 2400 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)
2367 &child_ep->com.local_addr; 2401 &child_ep->com.mapped_local_addr;
2402
2368 sin6->sin6_family = PF_INET6; 2403 sin6->sin6_family = PF_INET6;
2369 sin6->sin6_port = local_port; 2404 sin6->sin6_port = local_port;
2370 memcpy(sin6->sin6_addr.s6_addr, local_ip, 16); 2405 memcpy(sin6->sin6_addr.s6_addr, local_ip, 16);
2371 sin6 = (struct sockaddr_in6 *)&child_ep->com.remote_addr; 2406
2407 sin6 = (struct sockaddr_in6 *)&child_ep->com.local_addr;
2408 sin6->sin6_family = PF_INET6;
2409 sin6->sin6_port = ((struct sockaddr_in6 *)
2410 &parent_ep->com.local_addr)->sin6_port;
2411 memcpy(sin6->sin6_addr.s6_addr, local_ip, 16);
2412
2413 sin6 = (struct sockaddr_in6 *)&child_ep->com.mapped_remote_addr;
2372 sin6->sin6_family = PF_INET6; 2414 sin6->sin6_family = PF_INET6;
2373 sin6->sin6_port = peer_port; 2415 sin6->sin6_port = peer_port;
2374 memcpy(sin6->sin6_addr.s6_addr, peer_ip, 16); 2416 memcpy(sin6->sin6_addr.s6_addr, peer_ip, 16);
2375 } 2417 }
2418 memcpy(&child_ep->com.remote_addr, &child_ep->com.mapped_remote_addr,
2419 sizeof(child_ep->com.remote_addr));
2420 get_remote_addr(child_ep);
2421
2376 c4iw_get_ep(&parent_ep->com); 2422 c4iw_get_ep(&parent_ep->com);
2377 child_ep->parent_ep = parent_ep; 2423 child_ep->parent_ep = parent_ep;
2378 child_ep->tos = PASS_OPEN_TOS_G(ntohl(req->tos_stid)); 2424 child_ep->tos = PASS_OPEN_TOS_G(ntohl(req->tos_stid));
diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c
index 83209bb38285..1ffbd038c0ae 100644
--- a/drivers/infiniband/hw/cxgb4/device.c
+++ b/drivers/infiniband/hw/cxgb4/device.c
@@ -93,6 +93,7 @@ static struct ibnl_client_cbs c4iw_nl_cb_table[] = {
93 [RDMA_NL_IWPM_ADD_MAPPING] = {.dump = iwpm_add_mapping_cb}, 93 [RDMA_NL_IWPM_ADD_MAPPING] = {.dump = iwpm_add_mapping_cb},
94 [RDMA_NL_IWPM_QUERY_MAPPING] = {.dump = iwpm_add_and_query_mapping_cb}, 94 [RDMA_NL_IWPM_QUERY_MAPPING] = {.dump = iwpm_add_and_query_mapping_cb},
95 [RDMA_NL_IWPM_HANDLE_ERR] = {.dump = iwpm_mapping_error_cb}, 95 [RDMA_NL_IWPM_HANDLE_ERR] = {.dump = iwpm_mapping_error_cb},
96 [RDMA_NL_IWPM_REMOTE_INFO] = {.dump = iwpm_remote_info_cb},
96 [RDMA_NL_IWPM_MAPINFO] = {.dump = iwpm_mapping_info_cb}, 97 [RDMA_NL_IWPM_MAPINFO] = {.dump = iwpm_mapping_info_cb},
97 [RDMA_NL_IWPM_MAPINFO_NUM] = {.dump = iwpm_ack_mapping_info_cb} 98 [RDMA_NL_IWPM_MAPINFO_NUM] = {.dump = iwpm_ack_mapping_info_cb}
98}; 99};