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 */ |
