]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - net/batman-adv/packet.h
batman-adv: use ETH_P_BATMAN
[mirror_ubuntu-artful-kernel.git] / net / batman-adv / packet.h
index 2d23a14c220eb281a839c58650fb9a70802bb415..cb6405bf755cdbdf24b005b38416999e9ec38e19 100644 (file)
 #ifndef _NET_BATMAN_ADV_PACKET_H_
 #define _NET_BATMAN_ADV_PACKET_H_
 
-#define BATADV_ETH_P_BATMAN  0x4305 /* unofficial/not registered Ethertype */
-
 enum batadv_packettype {
-       BATADV_IV_OGM       = 0x01,
-       BATADV_ICMP         = 0x02,
-       BATADV_UNICAST      = 0x03,
-       BATADV_BCAST        = 0x04,
-       BATADV_VIS          = 0x05,
-       BATADV_UNICAST_FRAG = 0x06,
-       BATADV_TT_QUERY     = 0x07,
-       BATADV_ROAM_ADV     = 0x08,
+       BATADV_IV_OGM           = 0x01,
+       BATADV_ICMP             = 0x02,
+       BATADV_UNICAST          = 0x03,
+       BATADV_BCAST            = 0x04,
+       BATADV_VIS              = 0x05,
+       BATADV_UNICAST_FRAG     = 0x06,
+       BATADV_TT_QUERY         = 0x07,
+       BATADV_ROAM_ADV         = 0x08,
+       BATADV_UNICAST_4ADDR    = 0x09,
+};
+
+/**
+ * enum batadv_subtype - packet subtype for unicast4addr
+ * @BATADV_P_DATA: user payload
+ * @BATADV_P_DAT_DHT_GET: DHT request message
+ * @BATADV_P_DAT_DHT_PUT: DHT store message
+ * @BATADV_P_DAT_CACHE_REPLY: ARP reply generated by DAT
+ */
+enum batadv_subtype {
+       BATADV_P_DATA                   = 0x01,
+       BATADV_P_DAT_DHT_GET            = 0x02,
+       BATADV_P_DAT_DHT_PUT            = 0x03,
+       BATADV_P_DAT_CACHE_REPLY        = 0x04,
 };
 
 /* this file is included by batctl which needs these defines */
@@ -106,13 +119,16 @@ struct batadv_bla_claim_dst {
        uint8_t magic[3];       /* FF:43:05 */
        uint8_t type;           /* bla_claimframe */
        __be16 group;           /* group id */
-} __packed;
+};
 
 struct batadv_header {
        uint8_t  packet_type;
        uint8_t  version;  /* batman version field */
        uint8_t  ttl;
-} __packed;
+       /* the parent struct has to add a byte after the header to make
+        * everything 4 bytes aligned again
+        */
+};
 
 struct batadv_ogm_packet {
        struct batadv_header header;
@@ -137,7 +153,7 @@ struct batadv_icmp_packet {
        __be16   seqno;
        uint8_t  uid;
        uint8_t  reserved;
-} __packed;
+};
 
 #define BATADV_RR_LEN 16
 
@@ -153,13 +169,44 @@ struct batadv_icmp_packet_rr {
        uint8_t  uid;
        uint8_t  rr_cur;
        uint8_t  rr[BATADV_RR_LEN][ETH_ALEN];
-} __packed;
+};
+
+/* All packet headers in front of an ethernet header have to be completely
+ * divisible by 2 but not by 4 to make the payload after the ethernet
+ * header again 4 bytes boundary aligned.
+ *
+ * A packing of 2 is necessary to avoid extra padding at the end of the struct
+ * caused by a structure member which is larger than two bytes. Otherwise
+ * the structure would not fulfill the previously mentioned rule to avoid the
+ * misalignment of the payload after the ethernet header. It may also lead to
+ * leakage of information when the padding it not initialized before sending.
+ */
+#pragma pack(2)
 
 struct batadv_unicast_packet {
        struct batadv_header header;
        uint8_t  ttvn; /* destination translation table version number */
        uint8_t  dest[ETH_ALEN];
-} __packed;
+       /* "4 bytes boundary + 2 bytes" long to make the payload after the
+        * following ethernet header again 4 bytes boundary aligned
+        */
+};
+
+/**
+ * struct batadv_unicast_4addr_packet - extended unicast packet
+ * @u: common unicast packet header
+ * @src: address of the source
+ * @subtype: packet subtype
+ */
+struct batadv_unicast_4addr_packet {
+       struct batadv_unicast_packet u;
+       uint8_t src[ETH_ALEN];
+       uint8_t subtype;
+       uint8_t reserved;
+       /* "4 bytes boundary + 2 bytes" long to make the payload after the
+        * following ethernet header again 4 bytes boundary aligned
+        */
+};
 
 struct batadv_unicast_frag_packet {
        struct batadv_header header;
@@ -176,7 +223,12 @@ struct batadv_bcast_packet {
        uint8_t  reserved;
        __be32   seqno;
        uint8_t  orig[ETH_ALEN];
-} __packed;
+       /* "4 bytes boundary + 2 bytes" long to make the payload after the
+        * following ethernet header again 4 bytes boundary aligned
+        */
+};
+
+#pragma pack()
 
 struct batadv_vis_packet {
        struct batadv_header header;
@@ -187,7 +239,7 @@ struct batadv_vis_packet {
        uint8_t  vis_orig[ETH_ALEN];    /* originator reporting its neighbors */
        uint8_t  target_orig[ETH_ALEN]; /* who should receive this packet */
        uint8_t  sender_orig[ETH_ALEN]; /* who sent or forwarded this packet */
-} __packed;
+};
 
 struct batadv_tt_query_packet {
        struct batadv_header header;