Commit 5594923f authored by David S. Miller's avatar David S. Miller

Merge tag 'batadv-net-for-davem-20181114' of git://git.open-mesh.org/linux-merge

Simon Wunderlich says:

====================
Here are two batman-adv bugfixes:

 - Explicitly pad short ELP packets with zeros, by Sven Eckelmann

 - Fix packet size calculation when merging fragments,
   by Sven Eckelmann
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents dfa0d55f d7d8bbb4
...@@ -352,19 +352,21 @@ static void batadv_v_elp_periodic_work(struct work_struct *work) ...@@ -352,19 +352,21 @@ static void batadv_v_elp_periodic_work(struct work_struct *work)
*/ */
int batadv_v_elp_iface_enable(struct batadv_hard_iface *hard_iface) int batadv_v_elp_iface_enable(struct batadv_hard_iface *hard_iface)
{ {
static const size_t tvlv_padding = sizeof(__be32);
struct batadv_elp_packet *elp_packet; struct batadv_elp_packet *elp_packet;
unsigned char *elp_buff; unsigned char *elp_buff;
u32 random_seqno; u32 random_seqno;
size_t size; size_t size;
int res = -ENOMEM; int res = -ENOMEM;
size = ETH_HLEN + NET_IP_ALIGN + BATADV_ELP_HLEN; size = ETH_HLEN + NET_IP_ALIGN + BATADV_ELP_HLEN + tvlv_padding;
hard_iface->bat_v.elp_skb = dev_alloc_skb(size); hard_iface->bat_v.elp_skb = dev_alloc_skb(size);
if (!hard_iface->bat_v.elp_skb) if (!hard_iface->bat_v.elp_skb)
goto out; goto out;
skb_reserve(hard_iface->bat_v.elp_skb, ETH_HLEN + NET_IP_ALIGN); skb_reserve(hard_iface->bat_v.elp_skb, ETH_HLEN + NET_IP_ALIGN);
elp_buff = skb_put_zero(hard_iface->bat_v.elp_skb, BATADV_ELP_HLEN); elp_buff = skb_put_zero(hard_iface->bat_v.elp_skb,
BATADV_ELP_HLEN + tvlv_padding);
elp_packet = (struct batadv_elp_packet *)elp_buff; elp_packet = (struct batadv_elp_packet *)elp_buff;
elp_packet->packet_type = BATADV_ELP; elp_packet->packet_type = BATADV_ELP;
......
...@@ -275,7 +275,7 @@ batadv_frag_merge_packets(struct hlist_head *chain) ...@@ -275,7 +275,7 @@ batadv_frag_merge_packets(struct hlist_head *chain)
kfree(entry); kfree(entry);
packet = (struct batadv_frag_packet *)skb_out->data; packet = (struct batadv_frag_packet *)skb_out->data;
size = ntohs(packet->total_size); size = ntohs(packet->total_size) + hdr_size;
/* Make room for the rest of the fragments. */ /* Make room for the rest of the fragments. */
if (pskb_expand_head(skb_out, 0, size - skb_out->len, GFP_ATOMIC) < 0) { if (pskb_expand_head(skb_out, 0, size - skb_out->len, GFP_ATOMIC) < 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment