On Monday, May 7, 2018 3:55:59 AM HKT Leonardo Mörlein wrote:
if (!vlan)
return false;
if (!vlan) {
/* Due to a bug, some originators send TT
* announcements for empty vlans. As the receiving
* nodes will ignore those empty vlans (they do not
* add a batadv_orig_node_vlan into the transglobal
* for the originating node), crc check will fail
* here. To circumvent this issue, we skip the
* verification for the vlan if the crc is
* equal to 0x00000000.
*/
if (tt_vlan_tmp->crc == 0x00000000)
continue;
else
return false;
}
There are some issues with this approach:
* As you might be aware, a CRC of 0x00000000 is not an invalid or uninitialized CRC. That means it is conceivable the CRC over the translation table entries and flags results in a CRC of 0x00000000 without any bugs being present. Applying this patch would lead to introducing a bug in these conditions.
* The second concern is about how to deal with 'the bug' (referring to your patch comment above). In your case 'the bug' results in missing TT entries for a given VLAN plus a CRC of 0x00000000. What if the CRC was 0x00000001 due to some other bug ? Then you're check would totally miss the mark and we're back at the beginning. If we wish to deal with such misbehavior on a scale where we assume the code should be able to deal with garbage values in some or all fields a different approach is needed. Relying on a magic number (CRC 0x00000000) is as bad as the current behavior (assuming each VLAN has an entry).
Shortly, I will send a patch to prevent sending an empty VLAN around. Please note that this patch still is more of a band-aid. We still don't know how the empty VLAN came into being in the first place. Plus, that patch won't protect against garbage packets which certainly requires more effort.
Cheers, Marek