RDMA/nes: Fix incorrect resolving of the loopback MAC address
authorTatyana Nikolova <Tatyana.E.Nikolova@intel.com>
Thu, 20 Sep 2012 19:23:14 +0000 (19:23 +0000)
committerRoland Dreier <roland@purestorage.com>
Mon, 1 Oct 2012 03:34:52 +0000 (20:34 -0700)
Signed-off-by: Tatyana Nikolova <Tatyana.E.Nikolova@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/nes/nes_cm.c

index 020e95c4c4b9b08da6119b13bbe6b8b6a2710b88..49a9383137db9ad3abf83ca34c4fa0339b46d2b9 100644 (file)
@@ -1356,7 +1356,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
        else
                netdev = nesvnic->netdev;
 
-       neigh = dst_neigh_lookup(&rt->dst, &dst_ip);
+       neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, netdev);
 
        rcu_read_lock();
        if (neigh) {
@@ -1465,12 +1465,8 @@ static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core,
        cm_node->loopbackpartner = NULL;
 
        /* get the mac addr for the remote node */
-       if (ipv4_is_loopback(htonl(cm_node->rem_addr))) {
-               arpindex = nes_arp_table(nesdev, ntohl(nesvnic->local_ipaddr), NULL, NES_ARP_RESOLVE);
-       } else {
-               oldarpindex = nes_arp_table(nesdev, cm_node->rem_addr, NULL, NES_ARP_RESOLVE);
-               arpindex = nes_addr_resolve_neigh(nesvnic, cm_info->rem_addr, oldarpindex);
-       }
+       oldarpindex = nes_arp_table(nesdev, cm_node->rem_addr, NULL, NES_ARP_RESOLVE);
+       arpindex = nes_addr_resolve_neigh(nesvnic, cm_info->rem_addr, oldarpindex);
        if (arpindex < 0) {
                kfree(cm_node);
                return NULL;
@@ -3153,11 +3149,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
        nesqp->nesqp_context->tcpPorts[1] =
                cpu_to_le16(ntohs(cm_id->remote_addr.sin_port));
 
-       if (ipv4_is_loopback(cm_id->remote_addr.sin_addr.s_addr))
-               nesqp->nesqp_context->ip0 =
-                       cpu_to_le32(ntohl(nesvnic->local_ipaddr));
-       else
-               nesqp->nesqp_context->ip0 =
+       nesqp->nesqp_context->ip0 =
                        cpu_to_le32(ntohl(cm_id->remote_addr.sin_addr.s_addr));
 
        nesqp->nesqp_context->misc2 |= cpu_to_le32(
@@ -3182,10 +3174,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
        memset(&nes_quad, 0, sizeof(nes_quad));
        nes_quad.DstIpAdrIndex =
                cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24);
-       if (ipv4_is_loopback(cm_id->remote_addr.sin_addr.s_addr))
-               nes_quad.SrcIpadr = nesvnic->local_ipaddr;
-       else
-               nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr;
+       nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr;
        nes_quad.TcpPorts[0] = cm_id->remote_addr.sin_port;
        nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port;
 
@@ -3538,11 +3527,7 @@ static void cm_event_connected(struct nes_cm_event *event)
                cpu_to_le16(ntohs(cm_id->local_addr.sin_port));
        nesqp->nesqp_context->tcpPorts[1] =
                cpu_to_le16(ntohs(cm_id->remote_addr.sin_port));
-       if (ipv4_is_loopback(cm_id->remote_addr.sin_addr.s_addr))
-               nesqp->nesqp_context->ip0 =
-                       cpu_to_le32(ntohl(nesvnic->local_ipaddr));
-       else
-               nesqp->nesqp_context->ip0 =
+       nesqp->nesqp_context->ip0 =
                        cpu_to_le32(ntohl(cm_id->remote_addr.sin_addr.s_addr));
 
        nesqp->nesqp_context->misc2 |= cpu_to_le32(
@@ -3571,10 +3556,7 @@ static void cm_event_connected(struct nes_cm_event *event)
 
        nes_quad.DstIpAdrIndex =
                cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24);
-       if (ipv4_is_loopback(cm_id->remote_addr.sin_addr.s_addr))
-               nes_quad.SrcIpadr = nesvnic->local_ipaddr;
-       else
-               nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr;
+       nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr;
        nes_quad.TcpPorts[0] = cm_id->remote_addr.sin_port;
        nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port;