diff options
Diffstat (limited to 'drivers/infiniband/hw/nes/nes_cm.c')
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_cm.c | 65 | 
1 files changed, 48 insertions, 17 deletions
| diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index 6f09a72e78d7..72b43417cbe3 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c @@ -596,27 +596,52 @@ static void nes_form_reg_msg(struct nes_vnic *nesvnic,  	memcpy(pm_msg->if_name, nesvnic->netdev->name, IWPM_IFNAME_SIZE);  } +static void record_sockaddr_info(struct sockaddr_storage *addr_info, +					nes_addr_t *ip_addr, u16 *port_num) +{ +	struct sockaddr_in *in_addr = (struct sockaddr_in *)addr_info; + +	if (in_addr->sin_family == AF_INET) { +		*ip_addr = ntohl(in_addr->sin_addr.s_addr); +		*port_num = ntohs(in_addr->sin_port); +	} +} +  /*   * nes_record_pm_msg - Save the received mapping info   */  static void nes_record_pm_msg(struct nes_cm_info *cm_info,  			struct iwpm_sa_data *pm_msg)  { -	struct sockaddr_in *mapped_loc_addr = -			(struct sockaddr_in *)&pm_msg->mapped_loc_addr; -	struct sockaddr_in *mapped_rem_addr = -			(struct sockaddr_in *)&pm_msg->mapped_rem_addr; - -	if (mapped_loc_addr->sin_family == AF_INET) { -		cm_info->mapped_loc_addr = -			ntohl(mapped_loc_addr->sin_addr.s_addr); -		cm_info->mapped_loc_port = ntohs(mapped_loc_addr->sin_port); -	} -	if (mapped_rem_addr->sin_family == AF_INET) { -		cm_info->mapped_rem_addr = -			ntohl(mapped_rem_addr->sin_addr.s_addr); -		cm_info->mapped_rem_port = ntohs(mapped_rem_addr->sin_port); -	} +	record_sockaddr_info(&pm_msg->mapped_loc_addr, +		&cm_info->mapped_loc_addr, &cm_info->mapped_loc_port); + +	record_sockaddr_info(&pm_msg->mapped_rem_addr, +		&cm_info->mapped_rem_addr, &cm_info->mapped_rem_port); +} + +/* + * nes_get_reminfo - Get the address info of the remote connecting peer + */ +static int nes_get_remote_addr(struct nes_cm_node *cm_node) +{ +	struct sockaddr_storage mapped_loc_addr, mapped_rem_addr; +	struct sockaddr_storage remote_addr; +	int ret; + +	nes_create_sockaddr(htonl(cm_node->mapped_loc_addr), +			htons(cm_node->mapped_loc_port), &mapped_loc_addr); +	nes_create_sockaddr(htonl(cm_node->mapped_rem_addr), +			htons(cm_node->mapped_rem_port), &mapped_rem_addr); + +	ret = iwpm_get_remote_info(&mapped_loc_addr, &mapped_rem_addr, +				&remote_addr, RDMA_NL_NES); +	if (ret) +		nes_debug(NES_DBG_CM, "Unable to find remote peer address info\n"); +	else +		record_sockaddr_info(&remote_addr, &cm_node->rem_addr, +				&cm_node->rem_port); +	return ret;  }  /** @@ -1566,9 +1591,14 @@ static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core,  		return NULL;  	/* set our node specific transport info */ -	cm_node->loc_addr = cm_info->loc_addr; +	if (listener) { +		cm_node->loc_addr = listener->loc_addr; +		cm_node->loc_port = listener->loc_port; +	} else { +		cm_node->loc_addr = cm_info->loc_addr; +		cm_node->loc_port = cm_info->loc_port; +	}  	cm_node->rem_addr = cm_info->rem_addr; -	cm_node->loc_port = cm_info->loc_port;  	cm_node->rem_port = cm_info->rem_port;  	cm_node->mapped_loc_addr = cm_info->mapped_loc_addr; @@ -2151,6 +2181,7 @@ static int handle_ack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,  		cm_node->state = NES_CM_STATE_ESTABLISHED;  		if (datasize) {  			cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; +			nes_get_remote_addr(cm_node);  			handle_rcv_mpa(cm_node, skb);  		} else { /* rcvd ACK only */  			dev_kfree_skb_any(skb); |