[Bug 263820] dwc: dwc driver is not able to receive packets after adding new MAC address
Date: Fri, 06 May 2022 15:47:13 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=263820 Bug ID: 263820 Summary: dwc: dwc driver is not able to receive packets after adding new MAC address Product: Base System Version: CURRENT Hardware: arm64 OS: Any Status: New Severity: Affects Some People Priority: --- Component: bin Assignee: bugs@FreeBSD.org Reporter: jiahali@blackberry.com Created attachment 233772 --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=233772&action=edit Preliminary fix patch Overview -------- After adding a new mac address to the dwc0 interface, the dwc0 interface is not able to receive packets. However, "ifconfig dwc0" shows that the interface is UP. Actual Results -------------- 1. Set up In dwc driver's Freebsd terminal root@generic:~ # uname -a FreeBSD generic 14.0-CURRENT FreeBSD 14.0-CURRENT #0 main-n254961-b91a48693a5: Thu Apr 21 09:35:51 UTC 2022 root@releng1.nyi.freebsd.org:/usr/obj/usr/src/arm64.aarch64/sys/GENERIC arm64 root@generic:~ # ifconfig dwc0 dwc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8000b<RXCSUM,TXCSUM,VLAN_MTU,LINKSTATE> ether fa:97:92:f6:f1:09 inet 0.0.0.0 netmask 0xff000000 broadcast 255.255.255.255 media: Ethernet autoselect (1000baseT <full-duplex>) status: active nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> root@generic:~ # ping -c 1 192.168.3.2 PING 192.168.3.2 (192.168.3.2): 56 data bytes 64 bytes from 192.168.3.2: icmp_seq=0 ttl=64 time=0.509 ms --- 192.168.3.2 ping statistics --- 1 packets transmitted, 1 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.509/0.509/0.509/0.000 ms Host Terminal 1 Check interface config $ ifconfig enp0s31f6 enp0s31f6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.2 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::f897:92ff:fef6:f102 prefixlen 64 scopeid 0x20<link> ether 8c:8c:aa:c1:2b:c3 txqueuelen 1000 (Ethernet) RX packets 1662 bytes 516194 (516.1 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 10885 bytes 1346113 (1.3 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 16 memory 0xae380000-ae3a0000 Run the tcpdump on interface 'enp0s31f6" sudo tcpdump -U -pi enp0s31f6 -en 2. Test Results In dwc driver's Freebsd terminal root@generic:~ # ifconfig dwc0 ether 22:33:44:55:66:77 root@generic:~ # ifconfig dwc0 dwc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8000b<RXCSUM,TXCSUM,VLAN_MTU,LINKSTATE> ether 22:33:44:55:66:77 hwaddr fa:97:92:f6:f1:09 inet 192.168.3.129 netmask 0xffffff00 broadcast 192.168.3.255 media: Ethernet autoselect (1000baseT <full-duplex>) status: active nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> root@generic:~ # netstat -n -I dwc0 Name Mtu Network Address Ipkts Ierrs Idrop Opkts Oerrs Coll dwc0 1500 <Link#1> 22:33:44:55:66:77 52 0 0 196 0 0 dwc0 - 192.168.3.0/2 192.168.3.129 16 - - 10 - - root@generic:~ # ping -c 1 192.168.3.2 PING 192.168.3.2 (192.168.3.2): 56 data bytes --- 192.168.3.2 ping statistics --- 1 packets transmitted, 0 packets received, 100.0% packet loss root@generic:~ # netstat -n -I dwc0 Name Mtu Network Address Ipkts Ierrs Idrop Opkts Oerrs Coll dwc0 1500 <Link#1> 22:33:44:55:66:77 52 0 0 198 0 0 dwc0 - 192.168.3.0/2 192.168.3.129 16 - - 11 - - Packets captured by the tcpdump at Host Terminal 1 $ sudo tcpdump -U -pi enp0s31f6 -en tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on enp0s31f6, link-type EN10MB (Ethernet), capture size 262144 bytes 11:13:17.395542 22:33:44:55:66:77 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 192.168.3.2 tell 192.168.3.129, length 46 11:13:17.395584 8c:8c:aa:c1:2b:c3 > 22:33:44:55:66:77, ethertype ARP (0x0806), length 42: Reply 192.168.3.2 is-at 8c:8c:aa:c1:2b:c3, length 28 ^C 2 packets captured 2 packets received by filter 0 packets dropped by kernel Analysis -------------- According to the changes in the Ipkts section from the netstat results, the ARP response packet is not received. the "ifconfig dwc0" shows that the dwc0 interface is UP. For the Opkts section, the ARP request packet is counted twice, which I have reported in Bug 263817. However, if I use the "ifconfig dwc0 192.168.3.129/24" command to configure the interface after setting the new mac address. The interface can work properly. root@generic:~ # ifconfig dwc0 192.168.3.129/24 root@generic:~ # ifconfig dwc0 dwc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8000b<RXCSUM,TXCSUM,VLAN_MTU,LINKSTATE> ether 22:33:44:55:66:77 hwaddr fa:97:92:f6:f1:09 inet 192.168.3.129 netmask 0xffffff00 broadcast 192.168.3.255 media: Ethernet autoselect (1000baseT <full-duplex>) status: active nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> root@generic:~ # ping -c 1 192.168.3.2 PING 192.168.3.2 (192.168.3.2): 56 data bytes 64 bytes from 192.168.3.2: icmp_seq=0 ttl=64 time=0.565 ms --- 192.168.3.2 ping statistics --- 1 packets transmitted, 1 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.565/0.565/0.565/0.000 ms I also tried to fix this bug in my development environment. I found that the interface can tx/rx packets after adding new mac address if I add the "dwc_setup_rxfilter()" function at the end of the "dwc_init_locked()". I decomposed the "dwc_setup_rxfilter()" function continuously and found that it is the setting of the mac address making the interface work again. My patch is attached. Could you help to analyze why we should add the mac address to the driver twice to make the driver run when setting a new MAC address? Because the mac address is configured into the driver once at the "dwc_setup_rxfilter()" at the beginning of the "dwc_init_locked()". -- You are receiving this mail because: You are the assignee for the bug.