After noticing for some time now, an excessive no. of errors in my
alc(4) card's stats, this weekend, I decided to find out what
ailed it. But after poking around adding printf()s all over the
shop and comparing against 9.2_STABLE, FreeBSD-13.0 and Linux 5.0.0,
I figured out that there was nothing wrong with my card or with my
cables.

---
alc0 at pci2 dev 0 function 0: Atheros AR8162 PCIe Fast Ethernet
alc0: interrupting at ioapic0 pin 19
alc0: Ethernet address 50:46:5d:32:67:54
atphy0 at alc0 phy 0: Atheros AR8035 10/100/1000 PHY, rev. 9
---

Turns out, in 9.99.X, if_ethersubr.c is classifying all dropped/
unprocessed packets as "errors". Most of these error packets
were etype 0x88CA (TIPC (Transparent Inter Process Communication,)
or 0x893A (IEEE 1905) generated by other devices on the home LAN.

So, I hacked up a small patch to put most of these into the
"if_iqdrops" bucket. The rest (following FreeBSD) remain as errors.

As far as I'm concerned, you can silently chuck most of these errors
away--like FreeBSD does, or classify them as "dropped" like Linux does.
Either way is fine with me--just not "if_ierrors": that's too confusing.

Now, I see:

$ ifconfig -v alc0
alc0: flags=0x8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        ec_capabilities=0x3<VLAN_MTU,VLAN_HWTAGGING>
        ec_enabled=0x2<VLAN_HWTAGGING>
        address: 50:46:5d:32:67:54
        media: Ethernet autoselect (100baseTX 
full-duplex,flowcontrol,rxpause,txpause)
        status: active
        input: 46480 packets, 60797107 bytes, 2159 multicasts, 192 queue drops
        output: 25821 packets, 5636368 bytes, 37 multicasts
        inet6 fe80::5246:5dff:fe32:6754%alc0/64 flags 0 scopeid 0x1
        inet 192.168.68.121/24 broadcast 192.168.68.255 flags 0
$

whereas, before, all those would've been errors instead.

Thanks,
-RVP

---PATCH START---
--- sys/net/if_ethersubr.c.orig 2021-10-26 03:32:02.634325919 +0000
+++ sys/net/if_ethersubr.c      2021-11-07 23:30:56.213254316 +0000
@@ -668,8 +668,10 @@
 #endif

        if (__predict_false(m->m_len < sizeof(*eh))) {
-               if ((m = m_pullup(m, sizeof(*eh))) == NULL)
-                       goto dropped;
+               if ((m = m_pullup(m, sizeof(*eh))) == NULL) {
+                       if_statinc(ifp, if_ierrors);
+                       return;
+               }
        }

        eh = mtod(m, struct ether_header *);
@@ -870,7 +872,7 @@
                default:
                        if (subtype == 0 || subtype > 10) {
                                /* illegal value */
-                               goto drop;
+                               goto error;
                        }
                        /* unknown subtype */
                        break;
@@ -895,7 +897,7 @@
                ether_input_llc(ifp, m, eh);
                return;
 #else
-               goto drop;
+               goto error;
 #endif
        }

@@ -966,7 +968,7 @@

        if (__predict_false(!inq)) {
                /* Should not happen. */
-               goto drop;
+               goto error;
        }

        IFQ_ENQUEUE_ISR(inq, m, isr);
@@ -974,8 +976,12 @@

 drop:
        m_freem(m);
-dropped:
+       if_statinc(ifp, if_iqdrops); /* XXX should have a dedicated counter? */
+       return;
+error:
+       m_freem(m);
        if_statinc(ifp, if_ierrors); /* XXX should have a dedicated counter? */
+       return;
 }

 /*
---PATCH END---

Reply via email to