diff options
-rw-r--r-- | drivers/infiniband/hw/cxgb4/cm.c | 54 | ||||
-rw-r--r-- | drivers/infiniband/hw/cxgb4/device.c | 1 |
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 | ||
586 | static 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 | |||
586 | static void best_mtu(const unsigned short *mtus, unsigned short mtu, | 602 | static 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 | }; |