diff options
-rw-r--r-- | drivers/infiniband/hw/nes/nes_cm.c | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index 4acf04a03e1c..39468c277036 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c | |||
@@ -1098,12 +1098,13 @@ static inline int mini_cm_accelerated(struct nes_cm_core *cm_core, | |||
1098 | /** | 1098 | /** |
1099 | * nes_addr_resolve_neigh | 1099 | * nes_addr_resolve_neigh |
1100 | */ | 1100 | */ |
1101 | static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip) | 1101 | static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpindex) |
1102 | { | 1102 | { |
1103 | struct rtable *rt; | 1103 | struct rtable *rt; |
1104 | struct flowi fl; | 1104 | struct flowi fl; |
1105 | struct neighbour *neigh; | 1105 | struct neighbour *neigh; |
1106 | int rc = -1; | 1106 | int rc = arpindex; |
1107 | struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter; | ||
1107 | 1108 | ||
1108 | memset(&fl, 0, sizeof fl); | 1109 | memset(&fl, 0, sizeof fl); |
1109 | fl.nl_u.ip4_u.daddr = htonl(dst_ip); | 1110 | fl.nl_u.ip4_u.daddr = htonl(dst_ip); |
@@ -1119,6 +1120,21 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip) | |||
1119 | nes_debug(NES_DBG_CM, "Neighbor MAC address for 0x%08X" | 1120 | nes_debug(NES_DBG_CM, "Neighbor MAC address for 0x%08X" |
1120 | " is %pM, Gateway is 0x%08X \n", dst_ip, | 1121 | " is %pM, Gateway is 0x%08X \n", dst_ip, |
1121 | neigh->ha, ntohl(rt->rt_gateway)); | 1122 | neigh->ha, ntohl(rt->rt_gateway)); |
1123 | |||
1124 | if (arpindex >= 0) { | ||
1125 | if (!memcmp(nesadapter->arp_table[arpindex].mac_addr, | ||
1126 | neigh->ha, ETH_ALEN)){ | ||
1127 | /* Mac address same as in nes_arp_table */ | ||
1128 | neigh_release(neigh); | ||
1129 | ip_rt_put(rt); | ||
1130 | return rc; | ||
1131 | } | ||
1132 | |||
1133 | nes_manage_arp_cache(nesvnic->netdev, | ||
1134 | nesadapter->arp_table[arpindex].mac_addr, | ||
1135 | dst_ip, NES_ARP_DELETE); | ||
1136 | } | ||
1137 | |||
1122 | nes_manage_arp_cache(nesvnic->netdev, neigh->ha, | 1138 | nes_manage_arp_cache(nesvnic->netdev, neigh->ha, |
1123 | dst_ip, NES_ARP_ADD); | 1139 | dst_ip, NES_ARP_ADD); |
1124 | rc = nes_arp_table(nesvnic->nesdev, dst_ip, NULL, | 1140 | rc = nes_arp_table(nesvnic->nesdev, dst_ip, NULL, |
@@ -1134,7 +1150,6 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip) | |||
1134 | return rc; | 1150 | return rc; |
1135 | } | 1151 | } |
1136 | 1152 | ||
1137 | |||
1138 | /** | 1153 | /** |
1139 | * make_cm_node - create a new instance of a cm node | 1154 | * make_cm_node - create a new instance of a cm node |
1140 | */ | 1155 | */ |
@@ -1144,6 +1159,7 @@ static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core, | |||
1144 | { | 1159 | { |
1145 | struct nes_cm_node *cm_node; | 1160 | struct nes_cm_node *cm_node; |
1146 | struct timespec ts; | 1161 | struct timespec ts; |
1162 | int oldarpindex = 0; | ||
1147 | int arpindex = 0; | 1163 | int arpindex = 0; |
1148 | struct nes_device *nesdev; | 1164 | struct nes_device *nesdev; |
1149 | struct nes_adapter *nesadapter; | 1165 | struct nes_adapter *nesadapter; |
@@ -1197,17 +1213,18 @@ static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core, | |||
1197 | nesadapter = nesdev->nesadapter; | 1213 | nesadapter = nesdev->nesadapter; |
1198 | 1214 | ||
1199 | cm_node->loopbackpartner = NULL; | 1215 | cm_node->loopbackpartner = NULL; |
1216 | |||
1200 | /* get the mac addr for the remote node */ | 1217 | /* get the mac addr for the remote node */ |
1201 | if (ipv4_is_loopback(htonl(cm_node->rem_addr))) | 1218 | if (ipv4_is_loopback(htonl(cm_node->rem_addr))) |
1202 | arpindex = nes_arp_table(nesdev, ntohl(nesvnic->local_ipaddr), NULL, NES_ARP_RESOLVE); | 1219 | arpindex = nes_arp_table(nesdev, ntohl(nesvnic->local_ipaddr), NULL, NES_ARP_RESOLVE); |
1203 | else | 1220 | else { |
1204 | arpindex = nes_arp_table(nesdev, cm_node->rem_addr, NULL, NES_ARP_RESOLVE); | 1221 | oldarpindex = nes_arp_table(nesdev, cm_node->rem_addr, NULL, NES_ARP_RESOLVE); |
1222 | arpindex = nes_addr_resolve_neigh(nesvnic, cm_info->rem_addr, oldarpindex); | ||
1223 | |||
1224 | } | ||
1205 | if (arpindex < 0) { | 1225 | if (arpindex < 0) { |
1206 | arpindex = nes_addr_resolve_neigh(nesvnic, cm_info->rem_addr); | 1226 | kfree(cm_node); |
1207 | if (arpindex < 0) { | 1227 | return NULL; |
1208 | kfree(cm_node); | ||
1209 | return NULL; | ||
1210 | } | ||
1211 | } | 1228 | } |
1212 | 1229 | ||
1213 | /* copy the mac addr to node context */ | 1230 | /* copy the mac addr to node context */ |