@@ -368,8 +368,8 @@ static int fetch_ha(const struct dst_entry *dst, struct rdma_dev_addr *dev_addr,
368
368
(const void * )& dst_in6 -> sin6_addr ;
369
369
sa_family_t family = dst_in -> sa_family ;
370
370
371
- /* Gateway + ARPHRD_INFINIBAND -> IB router */
372
- if (has_gateway (dst , family ) && dst -> dev -> type == ARPHRD_INFINIBAND )
371
+ /* If we have a gateway in IB mode then it must be an IB network */
372
+ if (has_gateway (dst , family ) && dev_addr -> network == RDMA_NETWORK_IB )
373
373
return ib_nl_fetch_ha (dev_addr , daddr , seq , family );
374
374
else
375
375
return dst_fetch_ha (dst , dev_addr , daddr );
@@ -401,13 +401,6 @@ static int addr4_resolve(struct sockaddr *src_sock,
401
401
402
402
src_in -> sin_addr .s_addr = fl4 .saddr ;
403
403
404
- /* If there's a gateway and type of device not ARPHRD_INFINIBAND, we're
405
- * definitely in RoCE v2 (as RoCE v1 isn't routable) set the network
406
- * type accordingly.
407
- */
408
- if (rt -> rt_uses_gateway && rt -> dst .dev -> type != ARPHRD_INFINIBAND )
409
- addr -> network = RDMA_NETWORK_IPV4 ;
410
-
411
404
addr -> hoplimit = ip4_dst_hoplimit (& rt -> dst );
412
405
413
406
* prt = rt ;
@@ -425,7 +418,6 @@ static int addr6_resolve(struct sockaddr *src_sock,
425
418
(const struct sockaddr_in6 * )dst_sock ;
426
419
struct flowi6 fl6 ;
427
420
struct dst_entry * dst ;
428
- struct rt6_info * rt ;
429
421
int ret ;
430
422
431
423
memset (& fl6 , 0 , sizeof fl6 );
@@ -437,18 +429,9 @@ static int addr6_resolve(struct sockaddr *src_sock,
437
429
if (ret < 0 )
438
430
return ret ;
439
431
440
- rt = (struct rt6_info * )dst ;
441
432
if (ipv6_addr_any (& src_in -> sin6_addr ))
442
433
src_in -> sin6_addr = fl6 .saddr ;
443
434
444
- /* If there's a gateway and type of device not ARPHRD_INFINIBAND, we're
445
- * definitely in RoCE v2 (as RoCE v1 isn't routable) set the network
446
- * type accordingly.
447
- */
448
- if (rt -> rt6i_flags & RTF_GATEWAY &&
449
- ip6_dst_idev (dst )-> dev -> type != ARPHRD_INFINIBAND )
450
- addr -> network = RDMA_NETWORK_IPV6 ;
451
-
452
435
addr -> hoplimit = ip6_dst_hoplimit (dst );
453
436
454
437
* pdst = dst ;
@@ -491,6 +474,20 @@ static int rdma_set_src_addr(const struct dst_entry *dst,
491
474
ret = rdma_translate_ip (dst_in , dev_addr );
492
475
else
493
476
rdma_copy_src_l2_addr (dev_addr , dst -> dev );
477
+
478
+ /*
479
+ * If there's a gateway and type of device not ARPHRD_INFINIBAND,
480
+ * we're definitely in RoCE v2 (as RoCE v1 isn't routable) set the
481
+ * network type accordingly.
482
+ */
483
+ if (has_gateway (dst , dst_in -> sa_family ) &&
484
+ dst -> dev -> type != ARPHRD_INFINIBAND )
485
+ dev_addr -> network = dst_in -> sa_family == AF_INET ?
486
+ RDMA_NETWORK_IPV4 :
487
+ RDMA_NETWORK_IPV6 ;
488
+ else
489
+ dev_addr -> network = RDMA_NETWORK_IB ;
490
+
494
491
return ret ;
495
492
}
496
493
0 commit comments