2012-05-12 02:09:43 +02:00
/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
2010-12-13 11:19:28 +00:00
*
* Marek Lindner , Simon Wunderlich
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA
* 02110 - 1301 , USA
*/
# ifndef _NET_BATMAN_ADV_PACKET_H_
# define _NET_BATMAN_ADV_PACKET_H_
2012-06-03 22:19:13 +02:00
# define BATADV_ETH_P_BATMAN 0x4305 /* unofficial/not registered Ethertype */
2010-12-13 11:19:28 +00:00
2012-06-03 22:19:21 +02:00
enum batadv_packettype {
2012-10-01 09:57:35 +02:00
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
*/
enum batadv_subtype {
BATADV_P_DATA = 0x01 ,
2011-06-04 11:26:00 +02:00
} ;
2010-12-13 11:19:28 +00:00
/* this file is included by batctl which needs these defines */
2012-06-03 22:19:13 +02:00
# define BATADV_COMPAT_VERSION 14
2011-06-04 11:26:00 +02:00
2012-06-03 22:19:21 +02:00
enum batadv_iv_flags {
2012-07-08 16:32:09 +02:00
BATADV_NOT_BEST_NEXT_HOP = BIT ( 3 ) ,
BATADV_PRIMARIES_FIRST_HOP = BIT ( 4 ) ,
BATADV_VIS_SERVER = BIT ( 5 ) ,
BATADV_DIRECTLINK = BIT ( 6 ) ,
2011-06-04 11:26:00 +02:00
} ;
2010-12-13 11:19:28 +00:00
/* ICMP message types */
2012-06-03 22:19:21 +02:00
enum batadv_icmp_packettype {
BATADV_ECHO_REPLY = 0 ,
BATADV_DESTINATION_UNREACHABLE = 3 ,
BATADV_ECHO_REQUEST = 8 ,
BATADV_TTL_EXCEEDED = 11 ,
BATADV_PARAMETER_PROBLEM = 12 ,
2011-06-04 11:26:00 +02:00
} ;
2010-12-13 11:19:28 +00:00
/* vis defines */
2012-06-03 22:19:21 +02:00
enum batadv_vis_packettype {
BATADV_VIS_TYPE_SERVER_SYNC = 0 ,
BATADV_VIS_TYPE_CLIENT_UPDATE = 1 ,
2011-06-04 11:26:00 +02:00
} ;
2010-12-13 11:19:28 +00:00
/* fragmentation defines */
2012-06-03 22:19:21 +02:00
enum batadv_unicast_frag_flags {
2012-07-08 16:32:09 +02:00
BATADV_UNI_FRAG_HEAD = BIT ( 0 ) ,
BATADV_UNI_FRAG_LARGETAIL = BIT ( 1 ) ,
2011-06-04 11:26:00 +02:00
} ;
2010-12-13 11:19:28 +00:00
2011-04-27 14:27:44 +02:00
/* TT_QUERY subtypes */
2012-06-03 22:19:13 +02:00
# define BATADV_TT_QUERY_TYPE_MASK 0x3
2011-04-27 14:27:44 +02:00
2012-06-03 22:19:21 +02:00
enum batadv_tt_query_packettype {
BATADV_TT_REQUEST = 0 ,
BATADV_TT_RESPONSE = 1 ,
2011-04-27 14:27:44 +02:00
} ;
/* TT_QUERY flags */
2012-06-03 22:19:21 +02:00
enum batadv_tt_query_flags {
2012-07-08 16:32:09 +02:00
BATADV_TT_FULL_TABLE = BIT ( 2 ) ,
2011-04-27 14:27:44 +02:00
} ;
2012-06-03 22:19:21 +02:00
/* BATADV_TT_CLIENT flags.
2012-07-08 16:32:09 +02:00
* Flags from BIT ( 0 ) to BIT ( 7 ) are sent on the wire , while flags from BIT ( 8 ) to
* BIT ( 15 ) are used for local computation only
2012-05-12 02:09:43 +02:00
*/
2012-06-03 22:19:21 +02:00
enum batadv_tt_client_flags {
2012-07-08 16:32:09 +02:00
BATADV_TT_CLIENT_DEL = BIT ( 0 ) ,
BATADV_TT_CLIENT_ROAM = BIT ( 1 ) ,
BATADV_TT_CLIENT_WIFI = BIT ( 2 ) ,
2012-07-05 23:38:29 +02:00
BATADV_TT_CLIENT_TEMP = BIT ( 3 ) ,
2012-07-08 16:32:09 +02:00
BATADV_TT_CLIENT_NOPURGE = BIT ( 8 ) ,
BATADV_TT_CLIENT_NEW = BIT ( 9 ) ,
BATADV_TT_CLIENT_PENDING = BIT ( 10 ) ,
2011-04-27 14:27:44 +02:00
} ;
2012-01-22 20:00:19 +01:00
/* claim frame types for the bridge loop avoidance */
2012-06-03 22:19:21 +02:00
enum batadv_bla_claimframe {
2012-06-23 12:34:18 +02:00
BATADV_CLAIM_TYPE_CLAIM = 0x00 ,
BATADV_CLAIM_TYPE_UNCLAIM = 0x01 ,
2012-06-03 22:19:21 +02:00
BATADV_CLAIM_TYPE_ANNOUNCE = 0x02 ,
BATADV_CLAIM_TYPE_REQUEST = 0x03 ,
2012-01-22 20:00:19 +01:00
} ;
/* the destination hardware field in the ARP frame is used to
* transport the claim type and the group id
*/
2012-06-05 22:31:30 +02:00
struct batadv_bla_claim_dst {
2012-01-22 20:00:19 +01:00
uint8_t magic [ 3 ] ; /* FF:43:05 */
uint8_t type ; /* bla_claimframe */
2012-04-22 07:47:50 +01:00
__be16 group ; /* group id */
2012-11-05 21:25:26 +01:00
} ;
2012-01-22 20:00:19 +01:00
2012-06-05 22:31:30 +02:00
struct batadv_header {
2010-12-13 11:19:28 +00:00
uint8_t packet_type ;
uint8_t version ; /* batman version field */
2011-05-28 14:51:06 +02:00
uint8_t ttl ;
2012-11-05 21:25:26 +01:00
/* the parent struct has to add a byte after the header to make
* everything 4 bytes aligned again
*/
} ;
2011-11-20 15:47:38 +01:00
2012-06-05 22:31:30 +02:00
struct batadv_ogm_packet {
struct batadv_header header ;
2010-12-13 11:19:28 +00:00
uint8_t flags ; /* 0x40: DIRECTLINK flag, 0x20 VIS_SERVER flag... */
2012-04-22 07:46:29 +01:00
__be32 seqno ;
2012-01-30 20:59:17 +01:00
uint8_t orig [ ETH_ALEN ] ;
uint8_t prev_sender [ ETH_ALEN ] ;
2010-12-13 11:19:28 +00:00
uint8_t gw_flags ; /* flags related to gateway class */
2011-05-28 14:51:06 +02:00
uint8_t tq ;
2011-04-27 14:27:44 +02:00
uint8_t tt_num_changes ;
uint8_t ttvn ; /* translation table version number */
2012-04-22 07:45:29 +01:00
__be16 tt_crc ;
2011-01-15 14:39:43 +00:00
} __packed ;
2010-12-13 11:19:28 +00:00
2012-06-05 22:31:30 +02:00
# define BATADV_OGM_HLEN sizeof(struct batadv_ogm_packet)
2010-12-13 11:19:28 +00:00
2012-06-05 22:31:30 +02:00
struct batadv_icmp_packet {
struct batadv_header header ;
2011-05-28 14:51:06 +02:00
uint8_t msg_type ; /* see ICMP message types above */
2012-01-30 20:59:17 +01:00
uint8_t dst [ ETH_ALEN ] ;
uint8_t orig [ ETH_ALEN ] ;
2012-04-22 07:47:50 +01:00
__be16 seqno ;
2010-12-13 11:19:28 +00:00
uint8_t uid ;
2011-05-28 14:51:06 +02:00
uint8_t reserved ;
2012-11-05 21:25:26 +01:00
} ;
2010-12-13 11:19:28 +00:00
2012-06-03 22:19:13 +02:00
# define BATADV_RR_LEN 16
2010-12-13 11:19:28 +00:00
/* icmp_packet_rr must start with all fields from imcp_packet
2012-05-12 02:09:43 +02:00
* as this is assumed by code that handles ICMP packets
*/
2012-06-05 22:31:30 +02:00
struct batadv_icmp_packet_rr {
struct batadv_header header ;
2011-05-28 14:51:06 +02:00
uint8_t msg_type ; /* see ICMP message types above */
2012-01-30 20:59:17 +01:00
uint8_t dst [ ETH_ALEN ] ;
uint8_t orig [ ETH_ALEN ] ;
2012-04-22 07:47:50 +01:00
__be16 seqno ;
2010-12-13 11:19:28 +00:00
uint8_t uid ;
uint8_t rr_cur ;
2012-06-03 22:19:13 +02:00
uint8_t rr [ BATADV_RR_LEN ] [ ETH_ALEN ] ;
2012-11-05 21:25:26 +01:00
} ;
2010-12-13 11:19:28 +00:00
2012-06-05 22:31:30 +02:00
struct batadv_unicast_packet {
struct batadv_header header ;
2011-04-27 14:27:44 +02:00
uint8_t ttvn ; /* destination translation table version number */
2012-01-30 20:59:17 +01:00
uint8_t dest [ ETH_ALEN ] ;
2012-11-05 21:25:26 +01:00
/* "4 bytes boundary + 2 bytes" long to make the payload after the
* following ethernet header again 4 bytes boundary aligned
*/
} ;
2010-12-13 11:19:28 +00:00
2012-10-01 09:57:35 +02:00
/**
* 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
*/
} ;
2012-06-05 22:31:30 +02:00
struct batadv_unicast_frag_packet {
struct batadv_header header ;
2011-04-27 14:27:44 +02:00
uint8_t ttvn ; /* destination translation table version number */
2012-01-30 20:59:17 +01:00
uint8_t dest [ ETH_ALEN ] ;
2010-12-13 11:19:28 +00:00
uint8_t flags ;
2011-05-28 14:51:06 +02:00
uint8_t align ;
2012-01-30 20:59:17 +01:00
uint8_t orig [ ETH_ALEN ] ;
2012-04-22 07:47:50 +01:00
__be16 seqno ;
2011-01-15 14:39:43 +00:00
} __packed ;
2010-12-13 11:19:28 +00:00
2012-06-05 22:31:30 +02:00
struct batadv_bcast_packet {
struct batadv_header header ;
2011-05-28 14:51:06 +02:00
uint8_t reserved ;
2012-04-22 07:47:50 +01:00
__be32 seqno ;
2012-01-30 20:59:17 +01:00
uint8_t orig [ ETH_ALEN ] ;
2012-11-05 21:25:26 +01:00
/* "4 bytes boundary + 2 bytes" long to make the payload after the
* following ethernet header again 4 bytes boundary aligned
*/
2011-01-15 14:39:43 +00:00
} __packed ;
2010-12-13 11:19:28 +00:00
2012-06-05 22:31:30 +02:00
struct batadv_vis_packet {
struct batadv_header header ;
2010-12-13 11:19:28 +00:00
uint8_t vis_type ; /* which type of vis-participant sent this? */
2012-04-22 07:47:50 +01:00
__be32 seqno ; /* sequence number */
2011-05-28 14:51:06 +02:00
uint8_t entries ; /* number of entries behind this struct */
uint8_t reserved ;
2012-01-30 20:59:17 +01:00
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 */
2012-11-05 21:25:26 +01:00
} ;
2010-12-13 11:19:28 +00:00
2012-06-05 22:31:30 +02:00
struct batadv_tt_query_packet {
struct batadv_header header ;
2011-04-27 14:27:44 +02:00
/* the flag field is a combination of:
* - TT_REQUEST or TT_RESPONSE
2012-05-12 02:09:43 +02:00
* - TT_FULL_TABLE
*/
2011-04-27 14:27:44 +02:00
uint8_t flags ;
uint8_t dst [ ETH_ALEN ] ;
uint8_t src [ ETH_ALEN ] ;
/* the ttvn field is:
* if TT_REQUEST : ttvn that triggered the
* request
* if TT_RESPONSE : new ttvn for the src
2012-05-12 02:09:43 +02:00
* orig_node
*/
2011-04-27 14:27:44 +02:00
uint8_t ttvn ;
/* tt_data field is:
* if TT_REQUEST : crc associated with the
* ttvn
2012-05-12 02:09:43 +02:00
* if TT_RESPONSE : table_size
*/
__be16 tt_data ;
2011-04-27 14:27:44 +02:00
} __packed ;
2012-06-05 22:31:30 +02:00
struct batadv_roam_adv_packet {
struct batadv_header header ;
2011-04-27 14:27:57 +02:00
uint8_t reserved ;
uint8_t dst [ ETH_ALEN ] ;
uint8_t src [ ETH_ALEN ] ;
uint8_t client [ ETH_ALEN ] ;
} __packed ;
2012-06-05 22:31:30 +02:00
struct batadv_tt_change {
2011-04-27 14:27:44 +02:00
uint8_t flags ;
uint8_t addr [ ETH_ALEN ] ;
} __packed ;
2010-12-13 11:19:28 +00:00
# endif /* _NET_BATMAN_ADV_PACKET_H_ */