On Tue, Jan 29, 2019 at 12:08:50PM +0200, Kamal Heib wrote: > Currently a packet is marked for loopback only if the source and > destination addresses equals. This is not enough when multiple gids are > present in rxe device's gid table and the traffic is from one gid to > another. Fix it by marking the packet for loopback if the destination > MAC address is equal to the source MAC address. > > Signed-off-by: Kamal Heib <kamalheib1@xxxxxxxxx> > --- > drivers/infiniband/sw/rxe/rxe_av.c | 1 + > drivers/infiniband/sw/rxe/rxe_net.c | 9 +++------ > include/uapi/rdma/rdma_user_rxe.h | 3 +-- > 3 files changed, 5 insertions(+), 8 deletions(-) > > diff --git a/drivers/infiniband/sw/rxe/rxe_av.c b/drivers/infiniband/sw/rxe/rxe_av.c > index 27a7dec18874..81ee756c19b8 100644 > --- a/drivers/infiniband/sw/rxe/rxe_av.c > +++ b/drivers/infiniband/sw/rxe/rxe_av.c > @@ -38,6 +38,7 @@ void rxe_init_av(struct rdma_ah_attr *attr, struct rxe_av *av) > { > rxe_av_from_attr(rdma_ah_get_port_num(attr), av, attr); > rxe_av_fill_ip_info(av, attr); > + memcpy(av->dmac, attr->roce.dmac, ETH_ALEN); This is the missing part that i was worried about, i was not sure that dmac is set at the time that prepare? was issued. > } > > int rxe_av_chk_attr(struct rxe_dev *rxe, struct rdma_ah_attr *attr) > diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c > index 8fd03ae20efc..87dfb16744cc 100644 > --- a/drivers/infiniband/sw/rxe/rxe_net.c > +++ b/drivers/infiniband/sw/rxe/rxe_net.c > @@ -384,9 +384,6 @@ static int prepare4(struct rxe_pkt_info *pkt, struct sk_buff *skb, > return -EHOSTUNREACH; > } > > - if (!memcmp(saddr, daddr, sizeof(*daddr))) > - pkt->mask |= RXE_LOOPBACK_MASK; > - > prepare_udp_hdr(skb, cpu_to_be16(qp->src_port), > cpu_to_be16(ROCE_V2_UDP_DPORT)); > > @@ -411,9 +408,6 @@ static int prepare6(struct rxe_pkt_info *pkt, struct sk_buff *skb, > return -EHOSTUNREACH; > } > > - if (!memcmp(saddr, daddr, sizeof(*daddr))) > - pkt->mask |= RXE_LOOPBACK_MASK; > - > prepare_udp_hdr(skb, cpu_to_be16(qp->src_port), > cpu_to_be16(ROCE_V2_UDP_DPORT)); > > @@ -437,6 +431,9 @@ int rxe_prepare(struct rxe_pkt_info *pkt, struct sk_buff *skb, u32 *crc) > > *crc = rxe_icrc_hdr(pkt, skb); > > + if (ether_addr_equal(skb->dev->dev_addr, av->dmac)) > + pkt->mask |= RXE_LOOPBACK_MASK; > + > return err; > } > > diff --git a/include/uapi/rdma/rdma_user_rxe.h b/include/uapi/rdma/rdma_user_rxe.h > index 44ef6a3b7afc..aae2e696bb38 100644 > --- a/include/uapi/rdma/rdma_user_rxe.h > +++ b/include/uapi/rdma/rdma_user_rxe.h > @@ -58,8 +58,7 @@ struct rxe_global_route { > struct rxe_av { > __u8 port_num; > __u8 network_type; > - __u16 reserved1; > - __u32 reserved2; > + __u8 dmac[6]; We are so lucky!! > struct rxe_global_route grh; > union { > struct sockaddr_in _sockaddr_in; Reviewed-by: Yuval Shaia <yuval.shaia@xxxxxxxxxx> and also: Tested-by: Yuval Shaia <yuval.shaia@xxxxxxxxxx> > -- > 2.20.1 >