2010-12-13 14:19:28 +03:00
/*
2012-01-01 03:41:38 +04:00
* Copyright ( C ) 2007 - 2012 B . A . T . M . A . N . contributors :
2010-12-13 14:19:28 +03: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_
# define ETH_P_BATMAN 0x4305 /* unofficial/not registered Ethertype */
2011-06-04 13:26:00 +04:00
enum bat_packettype {
2011-07-29 19:31:50 +04:00
BAT_OGM = 0x01 ,
BAT_ICMP = 0x02 ,
BAT_UNICAST = 0x03 ,
BAT_BCAST = 0x04 ,
BAT_VIS = 0x05 ,
2011-04-27 16:27:44 +04:00
BAT_UNICAST_FRAG = 0x06 ,
2011-07-29 19:31:50 +04:00
BAT_TT_QUERY = 0x07 ,
BAT_ROAM_ADV = 0x08
2011-06-04 13:26:00 +04:00
} ;
2010-12-13 14:19:28 +03:00
/* this file is included by batctl which needs these defines */
2011-05-28 16:51:06 +04:00
# define COMPAT_VERSION 14
2011-06-04 13:26:00 +04:00
enum batman_flags {
PRIMARIES_FIRST_HOP = 1 < < 4 ,
VIS_SERVER = 1 < < 5 ,
DIRECTLINK = 1 < < 6
} ;
2010-12-13 14:19:28 +03:00
/* ICMP message types */
2011-06-04 13:26:00 +04:00
enum icmp_packettype {
ECHO_REPLY = 0 ,
DESTINATION_UNREACHABLE = 3 ,
ECHO_REQUEST = 8 ,
TTL_EXCEEDED = 11 ,
PARAMETER_PROBLEM = 12
} ;
2010-12-13 14:19:28 +03:00
/* vis defines */
2011-06-04 13:26:00 +04:00
enum vis_packettype {
VIS_TYPE_SERVER_SYNC = 0 ,
VIS_TYPE_CLIENT_UPDATE = 1
} ;
2010-12-13 14:19:28 +03:00
/* fragmentation defines */
2011-06-04 13:26:00 +04:00
enum unicast_frag_flags {
UNI_FRAG_HEAD = 1 < < 0 ,
UNI_FRAG_LARGETAIL = 1 < < 1
} ;
2010-12-13 14:19:28 +03:00
2011-04-27 16:27:44 +04:00
/* TT_QUERY subtypes */
# define TT_QUERY_TYPE_MASK 0x3
enum tt_query_packettype {
TT_REQUEST = 0 ,
TT_RESPONSE = 1
} ;
/* TT_QUERY flags */
enum tt_query_flags {
TT_FULL_TABLE = 1 < < 2
} ;
2011-06-17 18:11:27 +04:00
/* TT_CLIENT flags.
* Flags from 1 to 1 < < 7 are sent on the wire , while flags from 1 < < 8 to
* 1 < < 15 are used for local computation only */
enum tt_client_flags {
TT_CLIENT_DEL = 1 < < 0 ,
TT_CLIENT_ROAM = 1 < < 1 ,
2011-07-07 17:35:35 +04:00
TT_CLIENT_WIFI = 1 < < 2 ,
2011-07-07 03:40:58 +04:00
TT_CLIENT_NOPURGE = 1 < < 8 ,
TT_CLIENT_NEW = 1 < < 9 ,
TT_CLIENT_PENDING = 1 < < 10
2011-04-27 16:27:44 +04:00
} ;
2011-11-20 18:47:38 +04:00
struct batman_header {
2010-12-13 14:19:28 +03:00
uint8_t packet_type ;
uint8_t version ; /* batman version field */
2011-05-28 16:51:06 +04:00
uint8_t ttl ;
2011-11-20 18:47:38 +04:00
} __packed ;
struct batman_ogm_packet {
struct batman_header header ;
2010-12-13 14:19:28 +03:00
uint8_t flags ; /* 0x40: DIRECTLINK flag, 0x20 VIS_SERVER flag... */
uint32_t seqno ;
uint8_t orig [ 6 ] ;
uint8_t prev_sender [ 6 ] ;
uint8_t gw_flags ; /* flags related to gateway class */
2011-05-28 16:51:06 +04:00
uint8_t tq ;
2011-04-27 16:27:44 +04:00
uint8_t tt_num_changes ;
uint8_t ttvn ; /* translation table version number */
uint16_t tt_crc ;
2011-01-15 17:39:43 +03:00
} __packed ;
2010-12-13 14:19:28 +03:00
2011-07-29 19:31:50 +04:00
# define BATMAN_OGM_LEN sizeof(struct batman_ogm_packet)
2010-12-13 14:19:28 +03:00
struct icmp_packet {
2011-11-20 18:47:38 +04:00
struct batman_header header ;
2011-05-28 16:51:06 +04:00
uint8_t msg_type ; /* see ICMP message types above */
2010-12-13 14:19:28 +03:00
uint8_t dst [ 6 ] ;
uint8_t orig [ 6 ] ;
uint16_t seqno ;
uint8_t uid ;
2011-05-28 16:51:06 +04:00
uint8_t reserved ;
2011-01-15 17:39:43 +03:00
} __packed ;
2010-12-13 14:19:28 +03:00
# define BAT_RR_LEN 16
/* 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 {
2011-11-20 18:47:38 +04:00
struct batman_header header ;
2011-05-28 16:51:06 +04:00
uint8_t msg_type ; /* see ICMP message types above */
2010-12-13 14:19:28 +03:00
uint8_t dst [ 6 ] ;
uint8_t orig [ 6 ] ;
uint16_t seqno ;
uint8_t uid ;
uint8_t rr_cur ;
uint8_t rr [ BAT_RR_LEN ] [ ETH_ALEN ] ;
2011-01-15 17:39:43 +03:00
} __packed ;
2010-12-13 14:19:28 +03:00
struct unicast_packet {
2011-11-20 18:47:38 +04:00
struct batman_header header ;
2011-04-27 16:27:44 +04:00
uint8_t ttvn ; /* destination translation table version number */
2011-05-28 16:51:06 +04:00
uint8_t dest [ 6 ] ;
2011-01-15 17:39:43 +03:00
} __packed ;
2010-12-13 14:19:28 +03:00
struct unicast_frag_packet {
2011-11-20 18:47:38 +04:00
struct batman_header header ;
2011-04-27 16:27:44 +04:00
uint8_t ttvn ; /* destination translation table version number */
2011-05-28 16:51:06 +04:00
uint8_t dest [ 6 ] ;
2010-12-13 14:19:28 +03:00
uint8_t flags ;
2011-05-28 16:51:06 +04:00
uint8_t align ;
2010-12-13 14:19:28 +03:00
uint8_t orig [ 6 ] ;
uint16_t seqno ;
2011-01-15 17:39:43 +03:00
} __packed ;
2010-12-13 14:19:28 +03:00
struct bcast_packet {
2011-11-20 18:47:38 +04:00
struct batman_header header ;
2011-05-28 16:51:06 +04:00
uint8_t reserved ;
2010-12-13 14:19:28 +03:00
uint32_t seqno ;
2011-05-28 16:51:06 +04:00
uint8_t orig [ 6 ] ;
2011-01-15 17:39:43 +03:00
} __packed ;
2010-12-13 14:19:28 +03:00
struct vis_packet {
2011-11-20 18:47:38 +04:00
struct batman_header header ;
2010-12-13 14:19:28 +03:00
uint8_t vis_type ; /* which type of vis-participant sent this? */
uint32_t seqno ; /* sequence number */
2011-05-28 16:51:06 +04:00
uint8_t entries ; /* number of entries behind this struct */
uint8_t reserved ;
2011-05-08 14:45:45 +04:00
uint8_t vis_orig [ 6 ] ; /* originator that announces its neighbors */
2010-12-13 14:19:28 +03:00
uint8_t target_orig [ 6 ] ; /* who should receive this packet */
uint8_t sender_orig [ 6 ] ; /* who sent or rebroadcasted this packet */
2011-01-15 17:39:43 +03:00
} __packed ;
2010-12-13 14:19:28 +03:00
2011-04-27 16:27:44 +04:00
struct tt_query_packet {
2011-11-20 18:47:38 +04:00
struct batman_header header ;
2011-04-27 16:27:44 +04:00
/* the flag field is a combination of:
* - TT_REQUEST or TT_RESPONSE
* - TT_FULL_TABLE */
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
* orig_node */
uint8_t ttvn ;
/* tt_data field is:
* if TT_REQUEST : crc associated with the
* ttvn
* if TT_RESPONSE : table_size */
uint16_t tt_data ;
} __packed ;
2011-04-27 16:27:57 +04:00
struct roam_adv_packet {
2011-11-20 18:47:38 +04:00
struct batman_header header ;
2011-04-27 16:27:57 +04:00
uint8_t reserved ;
uint8_t dst [ ETH_ALEN ] ;
uint8_t src [ ETH_ALEN ] ;
uint8_t client [ ETH_ALEN ] ;
} __packed ;
2011-04-27 16:27:44 +04:00
struct tt_change {
uint8_t flags ;
uint8_t addr [ ETH_ALEN ] ;
} __packed ;
2010-12-13 14:19:28 +03:00
# endif /* _NET_BATMAN_ADV_PACKET_H_ */