> If I produce a real vnet frame out of a live kernel frame using > virtio_net_hdr_from_skb() and try to send it it fails on the check in > af_packet, while succeeding for tap. If I remove the af_packet check the > frame is accepted by the hardware too. > > If I produce it a synthetic frame + vnet header using the test program - it > works. Go figure.
Besides looking at the raw frame bytes, also compare the setup of virtio_net_header, as well as the tcp checksum field. The stack expects the pseudo header to have already been calculated. > I am going to continue digging into it. > > At the very least I now have a positive test case which uses the same > semantics as my code so I have something to compare to. Glad to hear that the test is helpful. I wrote it because I have run into these exact same issues in the past.