batman-adv: Fix broadcast packet CRC calculation
So far the crc16 checksum for a batman-adv broadcast data packet, received on a batman-adv hard interface, was calculated over zero bytes of its content leading to many incoming broadcast data packets wrongly being dropped (60-80% packet loss). This patch fixes this issue by calculating the crc16 over the actual, complete broadcast payload. The issue is a regression introduced by ("batman-adv: add broadcast duplicate check"). Signed-off-by: Linus Lüssing <linus.luessing@web.de> Acked-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
This commit is contained in:
parent
43c422eda9
commit
7f112af40f
2 changed files with 11 additions and 5 deletions
|
@ -1210,8 +1210,8 @@ int batadv_bla_init(struct batadv_priv *bat_priv)
|
|||
/**
|
||||
* batadv_bla_check_bcast_duplist
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @bcast_packet: originator mac address
|
||||
* @hdr_size: maximum length of the frame
|
||||
* @bcast_packet: encapsulated broadcast frame plus batman header
|
||||
* @bcast_packet_len: length of encapsulated broadcast frame plus batman header
|
||||
*
|
||||
* check if it is on our broadcast list. Another gateway might
|
||||
* have sent the same packet because it is connected to the same backbone,
|
||||
|
@ -1224,14 +1224,14 @@ int batadv_bla_init(struct batadv_priv *bat_priv)
|
|||
*/
|
||||
int batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv,
|
||||
struct batadv_bcast_packet *bcast_packet,
|
||||
int hdr_size)
|
||||
int bcast_packet_len)
|
||||
{
|
||||
int i, length, curr;
|
||||
uint8_t *content;
|
||||
uint16_t crc;
|
||||
struct batadv_bcast_duplist_entry *entry;
|
||||
|
||||
length = hdr_size - sizeof(*bcast_packet);
|
||||
length = bcast_packet_len - sizeof(*bcast_packet);
|
||||
content = (uint8_t *)bcast_packet;
|
||||
content += sizeof(*bcast_packet);
|
||||
|
||||
|
|
|
@ -1124,8 +1124,14 @@ int batadv_recv_bcast_packet(struct sk_buff *skb,
|
|||
|
||||
spin_unlock_bh(&orig_node->bcast_seqno_lock);
|
||||
|
||||
/* keep skb linear for crc calculation */
|
||||
if (skb_linearize(skb) < 0)
|
||||
goto out;
|
||||
|
||||
bcast_packet = (struct batadv_bcast_packet *)skb->data;
|
||||
|
||||
/* check whether this has been sent by another originator before */
|
||||
if (batadv_bla_check_bcast_duplist(bat_priv, bcast_packet, hdr_size))
|
||||
if (batadv_bla_check_bcast_duplist(bat_priv, bcast_packet, skb->len))
|
||||
goto out;
|
||||
|
||||
/* rebroadcast packet */
|
||||
|
|
Loading…
Reference in a new issue