hard_iface->packet_buff = kmalloc(hard_iface->packet_len, GFP_ATOMIC);
 
        batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff;
-       batman_ogm_packet->packet_type = BAT_OGM;
-       batman_ogm_packet->version = COMPAT_VERSION;
+       batman_ogm_packet->header.packet_type = BAT_OGM;
+       batman_ogm_packet->header.version = COMPAT_VERSION;
+       batman_ogm_packet->header.ttl = 2;
        batman_ogm_packet->flags = NO_FLAGS;
-       batman_ogm_packet->ttl = 2;
        batman_ogm_packet->tq = TQ_MAX_VALUE;
        batman_ogm_packet->tt_num_changes = 0;
        batman_ogm_packet->ttvn = 0;
 
        batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff;
        batman_ogm_packet->flags = PRIMARIES_FIRST_HOP;
-       batman_ogm_packet->ttl = TTL;
+       batman_ogm_packet->header.ttl = TTL;
 }
 
 void bat_ogm_update_mac(struct hard_iface *hard_iface)
                        fwd_str, (packet_num > 0 ? "aggregated " : ""),
                        batman_ogm_packet->orig,
                        ntohl(batman_ogm_packet->seqno),
-                       batman_ogm_packet->tq, batman_ogm_packet->ttl,
+                       batman_ogm_packet->tq, batman_ogm_packet->header.ttl,
                        (batman_ogm_packet->flags & DIRECTLINK ?
                         "on" : "off"),
                        batman_ogm_packet->ttvn, hard_iface->net_dev->name,
 
        /* multihomed peer assumed */
        /* non-primary OGMs are only broadcasted on their interface */
-       if ((directlink && (batman_ogm_packet->ttl == 1)) ||
+       if ((directlink && (batman_ogm_packet->header.ttl == 1)) ||
            (forw_packet->own && (forw_packet->if_incoming != primary_if))) {
 
                /* FIXME: what about aggregated packets ? */
                        (forw_packet->own ? "Sending own" : "Forwarding"),
                        batman_ogm_packet->orig,
                        ntohl(batman_ogm_packet->seqno),
-                       batman_ogm_packet->ttl,
+                       batman_ogm_packet->header.ttl,
                        forw_packet->if_incoming->net_dev->name,
                        forw_packet->if_incoming->net_dev->dev_addr);
 
                 * are flooded through the net  */
                if ((!directlink) &&
                    (!(batman_ogm_packet->flags & DIRECTLINK)) &&
-                   (batman_ogm_packet->ttl != 1) &&
+                   (batman_ogm_packet->header.ttl != 1) &&
 
                    /* own packets originating non-primary
                     * interfaces leave only that interface */
                /* if the incoming packet is sent via this one
                 * interface only - we still can aggregate */
                if ((directlink) &&
-                   (new_batman_ogm_packet->ttl == 1) &&
+                   (new_batman_ogm_packet->header.ttl == 1) &&
                    (forw_packet->if_incoming == if_incoming) &&
 
                    /* packets from direct neighbors or
        uint8_t in_tq, in_ttl, tq_avg = 0;
        uint8_t tt_num_changes;
 
-       if (batman_ogm_packet->ttl <= 1) {
+       if (batman_ogm_packet->header.ttl <= 1) {
                bat_dbg(DBG_BATMAN, bat_priv, "ttl exceeded\n");
                return;
        }
        router = orig_node_get_router(orig_node);
 
        in_tq = batman_ogm_packet->tq;
-       in_ttl = batman_ogm_packet->ttl;
+       in_ttl = batman_ogm_packet->header.ttl;
        tt_num_changes = batman_ogm_packet->tt_num_changes;
 
-       batman_ogm_packet->ttl--;
+       batman_ogm_packet->header.ttl--;
        memcpy(batman_ogm_packet->prev_sender, ethhdr->h_source, ETH_ALEN);
 
        /* rebroadcast tq of our best ranking neighbor to ensure the rebroadcast
                        batman_ogm_packet->tq = router->tq_avg;
 
                        if (router->last_ttl)
-                               batman_ogm_packet->ttl = router->last_ttl - 1;
+                               batman_ogm_packet->header.ttl =
+                                       router->last_ttl - 1;
                }
 
                tq_avg = router->tq_avg;
                "Forwarding packet: tq_orig: %i, tq_avg: %i, "
                "tq_forw: %i, ttl_orig: %i, ttl_forw: %i\n",
                in_tq, tq_avg, batman_ogm_packet->tq, in_ttl - 1,
-               batman_ogm_packet->ttl);
+               batman_ogm_packet->header.ttl);
 
        batman_ogm_packet->seqno = htonl(batman_ogm_packet->seqno);
        batman_ogm_packet->tt_crc = htons(batman_ogm_packet->tt_crc);
        spin_unlock_bh(&neigh_node->tq_lock);
 
        if (!is_duplicate) {
-               orig_node->last_ttl = batman_ogm_packet->ttl;
-               neigh_node->last_ttl = batman_ogm_packet->ttl;
+               orig_node->last_ttl = batman_ogm_packet->header.ttl;
+               neigh_node->last_ttl = batman_ogm_packet->header.ttl;
        }
 
        bonding_candidate_add(orig_node, neigh_node);
        /* I have to check for transtable changes only if the OGM has been
         * sent through a primary interface */
        if (((batman_ogm_packet->orig != ethhdr->h_source) &&
-            (batman_ogm_packet->ttl > 2)) ||
+            (batman_ogm_packet->header.ttl > 2)) ||
            (batman_ogm_packet->flags & PRIMARIES_FIRST_HOP))
                tt_update_orig(bat_priv, orig_node, tt_buff,
                               batman_ogm_packet->tt_num_changes,
         * packet in an aggregation.  Here we expect that the padding
         * is always zero (or not 0x01)
         */
-       if (batman_ogm_packet->packet_type != BAT_OGM)
+       if (batman_ogm_packet->header.packet_type != BAT_OGM)
                return;
 
        /* could be changed by schedule_own_packet() */
                batman_ogm_packet->prev_sender, batman_ogm_packet->seqno,
                batman_ogm_packet->ttvn, batman_ogm_packet->tt_crc,
                batman_ogm_packet->tt_num_changes, batman_ogm_packet->tq,
-               batman_ogm_packet->ttl, batman_ogm_packet->version,
-               has_directlink_flag);
+               batman_ogm_packet->header.ttl,
+               batman_ogm_packet->header.version, has_directlink_flag);
 
        rcu_read_lock();
        list_for_each_entry_rcu(hard_iface, &hardif_list, list) {
        }
        rcu_read_unlock();
 
-       if (batman_ogm_packet->version != COMPAT_VERSION) {
+       if (batman_ogm_packet->header.version != COMPAT_VERSION) {
                bat_dbg(DBG_BATMAN, bat_priv,
                        "Drop packet: incompatible batman version (%i)\n",
-                       batman_ogm_packet->version);
+                       batman_ogm_packet->header.version);
                return;
        }
 
        if (is_bidirectional &&
            (!is_duplicate ||
             ((orig_node->last_real_seqno == batman_ogm_packet->seqno) &&
-             (orig_node->last_ttl - 3 <= batman_ogm_packet->ttl))))
+             (orig_node->last_ttl - 3 <= batman_ogm_packet->header.ttl))))
                bat_ogm_orig_update(bat_priv, orig_node, ethhdr,
                                    batman_ogm_packet, if_incoming,
                                    tt_buff, is_duplicate);
 
 
        batman_ogm_packet = (struct batman_ogm_packet *)skb->data;
 
-       if (batman_ogm_packet->version != COMPAT_VERSION) {
+       if (batman_ogm_packet->header.version != COMPAT_VERSION) {
                bat_dbg(DBG_BATMAN, bat_priv,
                        "Drop packet: incompatible batman version (%i)\n",
-                       batman_ogm_packet->version);
+                       batman_ogm_packet->header.version);
                goto err_free;
        }
 
        /* all receive handlers return whether they received or reused
         * the supplied skb. if not, we have to free the skb. */
 
-       switch (batman_ogm_packet->packet_type) {
+       switch (batman_ogm_packet->header.packet_type) {
                /* batman originator packet */
        case BAT_OGM:
                ret = recv_bat_ogm_packet(skb, hard_iface);
 
                goto free_skb;
        }
 
-       if (icmp_packet->packet_type != BAT_ICMP) {
+       if (icmp_packet->header.packet_type != BAT_ICMP) {
                bat_dbg(DBG_BATMAN, bat_priv,
                        "Error - can't send packet from char device: "
                        "got bogus packet type (expected: BAT_ICMP)\n");
 
        icmp_packet->uid = socket_client->index;
 
-       if (icmp_packet->version != COMPAT_VERSION) {
+       if (icmp_packet->header.version != COMPAT_VERSION) {
                icmp_packet->msg_type = PARAMETER_PROBLEM;
-               icmp_packet->version = COMPAT_VERSION;
+               icmp_packet->header.version = COMPAT_VERSION;
                bat_socket_add_packet(socket_client, icmp_packet, packet_len);
                goto free_skb;
        }
 
        TT_CLIENT_PENDING = 1 << 10
 };
 
-struct batman_ogm_packet {
+struct batman_header {
        uint8_t  packet_type;
        uint8_t  version;  /* batman version field */
        uint8_t  ttl;
+} __packed;
+
+struct batman_ogm_packet {
+       struct batman_header header;
        uint8_t  flags;    /* 0x40: DIRECTLINK flag, 0x20 VIS_SERVER flag... */
        uint32_t seqno;
        uint8_t  orig[6];
 #define BATMAN_OGM_LEN sizeof(struct batman_ogm_packet)
 
 struct icmp_packet {
-       uint8_t  packet_type;
-       uint8_t  version;  /* batman version field */
-       uint8_t  ttl;
+       struct batman_header header;
        uint8_t  msg_type; /* see ICMP message types above */
        uint8_t  dst[6];
        uint8_t  orig[6];
 /* icmp_packet_rr must start with all fields from imcp_packet
  * as this is assumed by code that handles ICMP packets */
 struct icmp_packet_rr {
-       uint8_t  packet_type;
-       uint8_t  version;  /* batman version field */
-       uint8_t  ttl;
+       struct batman_header header;
        uint8_t  msg_type; /* see ICMP message types above */
        uint8_t  dst[6];
        uint8_t  orig[6];
 } __packed;
 
 struct unicast_packet {
-       uint8_t  packet_type;
-       uint8_t  version;  /* batman version field */
-       uint8_t  ttl;
+       struct batman_header header;
        uint8_t  ttvn; /* destination translation table version number */
        uint8_t  dest[6];
 } __packed;
 
 struct unicast_frag_packet {
-       uint8_t  packet_type;
-       uint8_t  version;  /* batman version field */
-       uint8_t  ttl;
+       struct batman_header header;
        uint8_t  ttvn; /* destination translation table version number */
        uint8_t  dest[6];
        uint8_t  flags;
 } __packed;
 
 struct bcast_packet {
-       uint8_t  packet_type;
-       uint8_t  version;  /* batman version field */
-       uint8_t  ttl;
+       struct batman_header header;
        uint8_t  reserved;
        uint32_t seqno;
        uint8_t  orig[6];
 } __packed;
 
 struct vis_packet {
-       uint8_t  packet_type;
-       uint8_t  version;        /* batman version field */
-       uint8_t  ttl;            /* TTL */
+       struct batman_header header;
        uint8_t  vis_type;       /* which type of vis-participant sent this? */
        uint32_t seqno;          /* sequence number */
        uint8_t  entries;        /* number of entries behind this struct */
 } __packed;
 
 struct tt_query_packet {
-       uint8_t  packet_type;
-       uint8_t  version;  /* batman version field */
-       uint8_t  ttl;
+       struct batman_header header;
        /* the flag field is a combination of:
         * - TT_REQUEST or TT_RESPONSE
         * - TT_FULL_TABLE */
 } __packed;
 
 struct roam_adv_packet {
-       uint8_t  packet_type;
-       uint8_t  version;
-       uint8_t  ttl;
+       struct batman_header header;
        uint8_t  reserved;
        uint8_t  dst[ETH_ALEN];
        uint8_t  src[ETH_ALEN];
 
        memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
        memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
        icmp_packet->msg_type = ECHO_REPLY;
-       icmp_packet->ttl = TTL;
+       icmp_packet->header.ttl = TTL;
 
        send_skb_packet(skb, router->if_incoming, router->addr);
        ret = NET_RX_SUCCESS;
        memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
        memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
        icmp_packet->msg_type = TTL_EXCEEDED;
-       icmp_packet->ttl = TTL;
+       icmp_packet->header.ttl = TTL;
 
        send_skb_packet(skb, router->if_incoming, router->addr);
        ret = NET_RX_SUCCESS;
                return recv_my_icmp_packet(bat_priv, skb, hdr_size);
 
        /* TTL exceeded */
-       if (icmp_packet->ttl < 2)
+       if (icmp_packet->header.ttl < 2)
                return recv_icmp_ttl_exceeded(bat_priv, skb);
 
        /* get routing information */
        icmp_packet = (struct icmp_packet_rr *)skb->data;
 
        /* decrement ttl */
-       icmp_packet->ttl--;
+       icmp_packet->header.ttl--;
 
        /* route it */
        send_skb_packet(skb, router->if_incoming, router->addr);
        unicast_packet = (struct unicast_packet *)skb->data;
 
        /* TTL exceeded */
-       if (unicast_packet->ttl < 2) {
+       if (unicast_packet->header.ttl < 2) {
                pr_debug("Warning - can't forward unicast packet from %pM to "
                         "%pM: ttl exceeded\n", ethhdr->h_source,
                         unicast_packet->dest);
 
        unicast_packet = (struct unicast_packet *)skb->data;
 
-       if (unicast_packet->packet_type == BAT_UNICAST &&
+       if (unicast_packet->header.packet_type == BAT_UNICAST &&
            atomic_read(&bat_priv->fragmentation) &&
            skb->len > neigh_node->if_incoming->net_dev->mtu) {
                ret = frag_send_skb(skb, bat_priv,
                goto out;
        }
 
-       if (unicast_packet->packet_type == BAT_UNICAST_FRAG &&
+       if (unicast_packet->header.packet_type == BAT_UNICAST_FRAG &&
            frag_can_reassemble(skb, neigh_node->if_incoming->net_dev->mtu)) {
 
                ret = frag_reassemble_skb(skb, bat_priv, &new_skb);
        }
 
        /* decrement ttl */
-       unicast_packet->ttl--;
+       unicast_packet->header.ttl--;
 
        /* route it */
        send_skb_packet(skb, neigh_node->if_incoming, neigh_node->addr);
        if (is_my_mac(bcast_packet->orig))
                goto out;
 
-       if (bcast_packet->ttl < 2)
+       if (bcast_packet->header.ttl < 2)
                goto out;
 
        orig_node = orig_hash_find(bat_priv, bcast_packet->orig);
 
 
        /* as we have a copy now, it is safe to decrease the TTL */
        bcast_packet = (struct bcast_packet *)newskb->data;
-       bcast_packet->ttl--;
+       bcast_packet->header.ttl--;
 
        skb_reset_mac_header(newskb);
 
 
                batman_ogm_packet = (struct batman_ogm_packet *)
                                                        (skb->data + ETH_HLEN);
 
-       if (batman_ogm_packet->version != COMPAT_VERSION)
+       if (batman_ogm_packet->header.version != COMPAT_VERSION)
                goto out;
 
-       if (batman_ogm_packet->packet_type != BAT_OGM)
+       if (batman_ogm_packet->header.packet_type != BAT_OGM)
                goto out;
 
        if (!(batman_ogm_packet->flags & PRIMARIES_FIRST_HOP))
                        goto dropped;
 
                bcast_packet = (struct bcast_packet *)skb->data;
-               bcast_packet->version = COMPAT_VERSION;
-               bcast_packet->ttl = TTL;
+               bcast_packet->header.version = COMPAT_VERSION;
+               bcast_packet->header.ttl = TTL;
 
                /* batman packet type: broadcast */
-               bcast_packet->packet_type = BAT_BCAST;
+               bcast_packet->header.packet_type = BAT_BCAST;
 
                /* hw address of first interface is the orig mac because only
                 * this mac is known throughout the mesh */
                skb_push(skb, hdr_size);
                unicast_packet = (struct unicast_packet *)skb->data;
 
-               if ((unicast_packet->packet_type != BAT_UNICAST) &&
-                   (unicast_packet->packet_type != BAT_UNICAST_FRAG))
+               if ((unicast_packet->header.packet_type != BAT_UNICAST) &&
+                   (unicast_packet->header.packet_type != BAT_UNICAST_FRAG))
                        goto dropped;
 
                skb_reset_mac_header(skb);
 
        tt_request = (struct tt_query_packet *)skb_put(skb,
                                sizeof(struct tt_query_packet));
 
-       tt_request->packet_type = BAT_TT_QUERY;
-       tt_request->version = COMPAT_VERSION;
+       tt_request->header.packet_type = BAT_TT_QUERY;
+       tt_request->header.version = COMPAT_VERSION;
        memcpy(tt_request->src, primary_if->net_dev->dev_addr, ETH_ALEN);
        memcpy(tt_request->dst, dst_orig_node->orig, ETH_ALEN);
-       tt_request->ttl = TTL;
+       tt_request->header.ttl = TTL;
        tt_request->ttvn = ttvn;
        tt_request->tt_data = tt_crc;
        tt_request->flags = TT_REQUEST;
                tt_response = (struct tt_query_packet *)skb->data;
        }
 
-       tt_response->packet_type = BAT_TT_QUERY;
-       tt_response->version = COMPAT_VERSION;
-       tt_response->ttl = TTL;
+       tt_response->header.packet_type = BAT_TT_QUERY;
+       tt_response->header.version = COMPAT_VERSION;
+       tt_response->header.ttl = TTL;
        memcpy(tt_response->src, req_dst_orig_node->orig, ETH_ALEN);
        memcpy(tt_response->dst, tt_request->src, ETH_ALEN);
        tt_response->flags = TT_RESPONSE;
                tt_response = (struct tt_query_packet *)skb->data;
        }
 
-       tt_response->packet_type = BAT_TT_QUERY;
-       tt_response->version = COMPAT_VERSION;
-       tt_response->ttl = TTL;
+       tt_response->header.packet_type = BAT_TT_QUERY;
+       tt_response->header.version = COMPAT_VERSION;
+       tt_response->header.ttl = TTL;
        memcpy(tt_response->src, primary_if->net_dev->dev_addr, ETH_ALEN);
        memcpy(tt_response->dst, tt_request->src, ETH_ALEN);
        tt_response->flags = TT_RESPONSE;
        roam_adv_packet = (struct roam_adv_packet *)skb_put(skb,
                                        sizeof(struct roam_adv_packet));
 
-       roam_adv_packet->packet_type = BAT_ROAM_ADV;
-       roam_adv_packet->version = COMPAT_VERSION;
-       roam_adv_packet->ttl = TTL;
+       roam_adv_packet->header.packet_type = BAT_ROAM_ADV;
+       roam_adv_packet->header.version = COMPAT_VERSION;
+       roam_adv_packet->header.ttl = TTL;
        primary_if = primary_if_get_selected(bat_priv);
        if (!primary_if)
                goto out;
 
 
        memmove(skb->data + uni_diff, skb->data, hdr_len);
        unicast_packet = (struct unicast_packet *) skb_pull(skb, uni_diff);
-       unicast_packet->packet_type = BAT_UNICAST;
+       unicast_packet->header.packet_type = BAT_UNICAST;
 
        return skb;
 
 
        memcpy(frag1, &tmp_uc, sizeof(tmp_uc));
 
-       frag1->ttl--;
-       frag1->version = COMPAT_VERSION;
-       frag1->packet_type = BAT_UNICAST_FRAG;
+       frag1->header.ttl--;
+       frag1->header.version = COMPAT_VERSION;
+       frag1->header.packet_type = BAT_UNICAST_FRAG;
 
        memcpy(frag1->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
        memcpy(frag2, frag1, sizeof(*frag2));
 
        unicast_packet = (struct unicast_packet *)skb->data;
 
-       unicast_packet->version = COMPAT_VERSION;
+       unicast_packet->header.version = COMPAT_VERSION;
        /* batman packet type: unicast */
-       unicast_packet->packet_type = BAT_UNICAST;
+       unicast_packet->header.packet_type = BAT_UNICAST;
        /* set unicast ttl */
-       unicast_packet->ttl = TTL;
+       unicast_packet->header.ttl = TTL;
        /* copy the destination for faster routing */
        memcpy(unicast_packet->dest, orig_node->orig, ETH_ALEN);
        /* set the destination tt version number */
            data_len + sizeof(*unicast_packet) >
                                neigh_node->if_incoming->net_dev->mtu) {
                /* send frag skb decreases ttl */
-               unicast_packet->ttl++;
+               unicast_packet->header.ttl++;
                ret = frag_send_skb(skb, bat_priv,
                                    neigh_node->if_incoming, neigh_node->addr);
                goto out;
 
        packet->vis_type = atomic_read(&bat_priv->vis_mode);
 
        memcpy(packet->target_orig, broadcast_addr, ETH_ALEN);
-       packet->ttl = TTL;
+       packet->header.ttl = TTL;
        packet->seqno = htonl(ntohl(packet->seqno) + 1);
        packet->entries = 0;
        skb_trim(info->skb_packet, sizeof(*packet));
                goto out;
 
        packet = (struct vis_packet *)info->skb_packet->data;
-       if (packet->ttl < 2) {
+       if (packet->header.ttl < 2) {
                pr_debug("Error - can't send vis packet: ttl exceeded\n");
                goto out;
        }
 
        memcpy(packet->sender_orig, primary_if->net_dev->dev_addr, ETH_ALEN);
-       packet->ttl--;
+       packet->header.ttl--;
 
        if (is_broadcast_ether_addr(packet->target_orig))
                broadcast_vis_packet(bat_priv, info);
        else
                unicast_vis_packet(bat_priv, info);
-       packet->ttl++; /* restore TTL */
+       packet->header.ttl++; /* restore TTL */
 
 out:
        if (primary_if)
        INIT_LIST_HEAD(&bat_priv->my_vis_info->send_list);
        kref_init(&bat_priv->my_vis_info->refcount);
        bat_priv->my_vis_info->bat_priv = bat_priv;
-       packet->version = COMPAT_VERSION;
-       packet->packet_type = BAT_VIS;
-       packet->ttl = TTL;
+       packet->header.version = COMPAT_VERSION;
+       packet->header.packet_type = BAT_VIS;
+       packet->header.ttl = TTL;
        packet->seqno = 0;
        packet->entries = 0;