/* fragmentation defines */
 #define UNI_FRAG_HEAD 0x01
+#define UNI_FRAG_LARGETAIL 0x02
 
 struct batman_packet {
        uint8_t  packet_type;
 
                                     dstaddr);
 
        if (unicast_packet->packet_type == BAT_UNICAST_FRAG &&
-           2 * skb->len - hdr_size <= batman_if->net_dev->mtu) {
+           frag_can_reassemble(skb, batman_if->net_dev->mtu)) {
 
                ret = frag_reassemble_skb(skb, bat_priv, &new_skb);
 
 
        int uc_hdr_len = sizeof(struct unicast_packet);
        int ucf_hdr_len = sizeof(struct unicast_frag_packet);
        int data_len = skb->len - uc_hdr_len;
+       int large_tail = 0;
 
        if (!bat_priv->primary_if)
                goto dropped;
        memcpy(frag1->orig, bat_priv->primary_if->net_dev->dev_addr, ETH_ALEN);
        memcpy(frag2, frag1, sizeof(struct unicast_frag_packet));
 
-       frag1->flags |= UNI_FRAG_HEAD;
-       frag2->flags &= ~UNI_FRAG_HEAD;
+       if (data_len & 1)
+               large_tail = UNI_FRAG_LARGETAIL;
+
+       frag1->flags = UNI_FRAG_HEAD | large_tail;
+       frag2->flags = large_tail;
 
        frag1->seqno = htons((uint16_t)atomic_inc_return(
                             &batman_if->frag_seqno));
 
 #ifndef _NET_BATMAN_ADV_UNICAST_H_
 #define _NET_BATMAN_ADV_UNICAST_H_
 
+#include "packet.h"
+
 #define FRAG_TIMEOUT 10000     /* purge frag list entrys after time in ms */
 #define FRAG_BUFFER_SIZE 6     /* number of list elements in buffer */
 
 int frag_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv,
                  struct batman_if *batman_if, uint8_t dstaddr[]);
 
+static inline int frag_can_reassemble(struct sk_buff *skb, int mtu)
+{
+       struct unicast_frag_packet *unicast_packet;
+       int uneven_correction = 0;
+       unsigned int merged_size;
+
+       unicast_packet = (struct unicast_frag_packet *)skb->data;
+
+       if (unicast_packet->flags & UNI_FRAG_LARGETAIL) {
+               if (unicast_packet->flags & UNI_FRAG_HEAD)
+                       uneven_correction = 1;
+               else
+                       uneven_correction = -1;
+       }
+
+       merged_size = (skb->len - sizeof(struct unicast_frag_packet)) * 2;
+       merged_size += sizeof(struct unicast_packet) + uneven_correction;
+
+       return merged_size <= mtu;
+}
+
 #endif /* _NET_BATMAN_ADV_UNICAST_H_ */