Skip to content

Commit

Permalink
batman-adv: Reserve extra bytes in skb for better alignment
Browse files Browse the repository at this point in the history
The ethernet header is 14 bytes long. Therefore, the data after it is not 4
byte aligned and may cause problems on systems without unaligned data access.
Reserving NET_IP_ALIGN more byes can fix the misalignment of the ethernet
header.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
Signed-off-by: Antonio Quartulli <ordex@autistici.org>
  • Loading branch information
Sven Eckelmann authored and Antonio Quartulli committed Nov 7, 2012
1 parent 6f0a098 commit 5b24657
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 19 deletions.
8 changes: 5 additions & 3 deletions net/batman-adv/bat_iv_ogm.c
Original file line number Diff line number Diff line change
Expand Up @@ -411,9 +411,11 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff,

if ((atomic_read(&bat_priv->aggregated_ogms)) &&
(packet_len < BATADV_MAX_AGGREGATION_BYTES))
skb_size = BATADV_MAX_AGGREGATION_BYTES + ETH_HLEN;
skb_size = BATADV_MAX_AGGREGATION_BYTES;
else
skb_size = packet_len + ETH_HLEN;
skb_size = packet_len;

skb_size += ETH_HLEN + NET_IP_ALIGN;

forw_packet_aggr->skb = dev_alloc_skb(skb_size);
if (!forw_packet_aggr->skb) {
Expand All @@ -422,7 +424,7 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff,
kfree(forw_packet_aggr);
goto out;
}
skb_reserve(forw_packet_aggr->skb, ETH_HLEN);
skb_reserve(forw_packet_aggr->skb, ETH_HLEN + NET_IP_ALIGN);

INIT_HLIST_NODE(&forw_packet_aggr->list);

Expand Down
4 changes: 2 additions & 2 deletions net/batman-adv/icmp_socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,13 +177,13 @@ static ssize_t batadv_socket_write(struct file *file, const char __user *buff,
if (len >= sizeof(struct batadv_icmp_packet_rr))
packet_len = sizeof(struct batadv_icmp_packet_rr);

skb = dev_alloc_skb(packet_len + ETH_HLEN);
skb = dev_alloc_skb(packet_len + ETH_HLEN + NET_IP_ALIGN);
if (!skb) {
len = -ENOMEM;
goto out;
}

skb_reserve(skb, ETH_HLEN);
skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN);
icmp_packet = (struct batadv_icmp_packet_rr *)skb_put(skb, packet_len);

if (copy_from_user(icmp_packet, buff, packet_len)) {
Expand Down
20 changes: 10 additions & 10 deletions net/batman-adv/translation-table.c
Original file line number Diff line number Diff line change
Expand Up @@ -1472,11 +1472,11 @@ batadv_tt_response_fill_table(uint16_t tt_len, uint8_t ttvn,
tt_tot = tt_len / sizeof(struct batadv_tt_change);

len = tt_query_size + tt_len;
skb = dev_alloc_skb(len + ETH_HLEN);
skb = dev_alloc_skb(len + ETH_HLEN + NET_IP_ALIGN);
if (!skb)
goto out;

skb_reserve(skb, ETH_HLEN);
skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN);
tt_response = (struct batadv_tt_query_packet *)skb_put(skb, len);
tt_response->ttvn = ttvn;

Expand Down Expand Up @@ -1538,11 +1538,11 @@ static int batadv_send_tt_request(struct batadv_priv *bat_priv,
if (!tt_req_node)
goto out;

skb = dev_alloc_skb(sizeof(*tt_request) + ETH_HLEN);
skb = dev_alloc_skb(sizeof(*tt_request) + ETH_HLEN + NET_IP_ALIGN);
if (!skb)
goto out;

skb_reserve(skb, ETH_HLEN);
skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN);

tt_req_len = sizeof(*tt_request);
tt_request = (struct batadv_tt_query_packet *)skb_put(skb, tt_req_len);
Expand Down Expand Up @@ -1653,11 +1653,11 @@ batadv_send_other_tt_response(struct batadv_priv *bat_priv,
tt_tot = tt_len / sizeof(struct batadv_tt_change);

len = sizeof(*tt_response) + tt_len;
skb = dev_alloc_skb(len + ETH_HLEN);
skb = dev_alloc_skb(len + ETH_HLEN + NET_IP_ALIGN);
if (!skb)
goto unlock;

skb_reserve(skb, ETH_HLEN);
skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN);
packet_pos = skb_put(skb, len);
tt_response = (struct batadv_tt_query_packet *)packet_pos;
tt_response->ttvn = req_ttvn;
Expand Down Expand Up @@ -1780,11 +1780,11 @@ batadv_send_my_tt_response(struct batadv_priv *bat_priv,
tt_tot = tt_len / sizeof(struct batadv_tt_change);

len = sizeof(*tt_response) + tt_len;
skb = dev_alloc_skb(len + ETH_HLEN);
skb = dev_alloc_skb(len + ETH_HLEN + NET_IP_ALIGN);
if (!skb)
goto unlock;

skb_reserve(skb, ETH_HLEN);
skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN);
packet_pos = skb_put(skb, len);
tt_response = (struct batadv_tt_query_packet *)packet_pos;
tt_response->ttvn = req_ttvn;
Expand Down Expand Up @@ -2118,11 +2118,11 @@ static void batadv_send_roam_adv(struct batadv_priv *bat_priv, uint8_t *client,
if (!batadv_tt_check_roam_count(bat_priv, client))
goto out;

skb = dev_alloc_skb(sizeof(*roam_adv_packet) + ETH_HLEN);
skb = dev_alloc_skb(sizeof(*roam_adv_packet) + ETH_HLEN + NET_IP_ALIGN);
if (!skb)
goto out;

skb_reserve(skb, ETH_HLEN);
skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN);

roam_adv_packet = (struct batadv_roam_adv_packet *)skb_put(skb, len);

Expand Down
9 changes: 5 additions & 4 deletions net/batman-adv/vis.c
Original file line number Diff line number Diff line change
Expand Up @@ -396,12 +396,12 @@ batadv_add_packet(struct batadv_priv *bat_priv,
return NULL;

len = sizeof(*packet) + vis_info_len;
info->skb_packet = dev_alloc_skb(len + ETH_HLEN);
info->skb_packet = dev_alloc_skb(len + ETH_HLEN + NET_IP_ALIGN);
if (!info->skb_packet) {
kfree(info);
return NULL;
}
skb_reserve(info->skb_packet, ETH_HLEN);
skb_reserve(info->skb_packet, ETH_HLEN + NET_IP_ALIGN);
packet = (struct batadv_vis_packet *)skb_put(info->skb_packet, len);

kref_init(&info->refcount);
Expand Down Expand Up @@ -873,12 +873,13 @@ int batadv_vis_init(struct batadv_priv *bat_priv)
if (!bat_priv->vis.my_info)
goto err;

len = sizeof(*packet) + BATADV_MAX_VIS_PACKET_SIZE + ETH_HLEN;
len = sizeof(*packet) + BATADV_MAX_VIS_PACKET_SIZE;
len += ETH_HLEN + NET_IP_ALIGN;
bat_priv->vis.my_info->skb_packet = dev_alloc_skb(len);
if (!bat_priv->vis.my_info->skb_packet)
goto free_info;

skb_reserve(bat_priv->vis.my_info->skb_packet, ETH_HLEN);
skb_reserve(bat_priv->vis.my_info->skb_packet, ETH_HLEN + NET_IP_ALIGN);
tmp_skb = bat_priv->vis.my_info->skb_packet;
packet = (struct batadv_vis_packet *)skb_put(tmp_skb, sizeof(*packet));

Expand Down

0 comments on commit 5b24657

Please sign in to comment.