I'm encountering exactly the same problem in a very similar setup.
A point to point ethernet cable from the laptop to the embedded platform (Zynq 7030).
Python is being use to send/receive message on the PC, wireshark on the PC shows all messages from PC --> Embedded platform are duplicated (identical payload, between 2us and 15us difference in time stamps).
As the packet rate and size goes in, this is going to be a problem for given the data rates, so I'd rather not just 'discard' the unwanted duplicates.

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.bind(('', 5704))
while(more_to_send == TRUE)
<code to populate bytes_to_send>
s.sendto(bytes_to_send, (HOST, UDP_PORT))
data = s.recv(1024)

43204 80.146000 192.168.1.20 192.168.1.10 UDP 566 5704 → 5604 Len=524 (payload)
43205 80.146003 192.168.1.20 192.168.1.10 UDP 566 5704 → 5604 Len=524 (duplicate at payload time + 3us)
43206 80.149112 192.168.1.10 192.168.1.20 UDP 48 5604 → 5704 Len=6 (ack)
43207 80.149306 192.168.1.20 192.168.1.10 UDP 566 5704 → 5604 Len=524 (payload)
43208 80.149311 192.168.1.20 192.168.1.10 UDP 566 5704 → 5604 Len=524 (duplicate at payload time +5us)

Was there an conclusion from Peter Robertson?

Andy