I really appreciate this, thank you. I think I had confused myself by playing with ‘u16’ and ‘u8’ and somehow coming to the conclusion that they were matching the right side of a 32-bit string. (Which may still be true, but, I’m just masking u32s now).
This is what I ended up with, which is working the way I’d expect:
<span style="color:#323232;">tc filter add dev wlan0 protocol ip parent 1: prio 1 u32
</span><span style="color:#323232;"> match u32 0x30d6 0x0000ffff at -16
</span><span style="color:#323232;"> match u32 0xc92d1905 0xffffffff at -12 flowid 1:20
</span>
This sends Ethernet frames destined for 30:d6:c9:2d:19:05 to flow 1:20, and it doesn’t seem to match a second device I tested. So, all good! Thank you again.