packet.h 4.9 KB
Newer Older
1
/*
2
 * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * 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 */

27 28 29 30 31 32
enum bat_packettype {
	BAT_PACKET       = 0x01,
	BAT_ICMP         = 0x02,
	BAT_UNICAST      = 0x03,
	BAT_BCAST        = 0x04,
	BAT_VIS          = 0x05,
33 34
	BAT_UNICAST_FRAG = 0x06,
	BAT_TT_QUERY     = 0x07
35
};
36 37

/* this file is included by batctl which needs these defines */
38
#define COMPAT_VERSION 14
39 40 41 42 43 44

enum batman_flags {
	PRIMARIES_FIRST_HOP = 1 << 4,
	VIS_SERVER	    = 1 << 5,
	DIRECTLINK	    = 1 << 6
};
45 46

/* ICMP message types */
47 48 49 50 51 52 53
enum icmp_packettype {
	ECHO_REPLY		= 0,
	DESTINATION_UNREACHABLE = 3,
	ECHO_REQUEST		= 8,
	TTL_EXCEEDED		= 11,
	PARAMETER_PROBLEM	= 12
};
54 55

/* vis defines */
56 57 58 59
enum vis_packettype {
	VIS_TYPE_SERVER_SYNC   = 0,
	VIS_TYPE_CLIENT_UPDATE = 1
};
60 61

/* fragmentation defines */
62 63 64 65
enum unicast_frag_flags {
	UNI_FRAG_HEAD	   = 1 << 0,
	UNI_FRAG_LARGETAIL = 1 << 1
};
66

67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
/* 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
};

/* TT_CHANGE flags */
enum tt_change_flags {
	TT_CHANGE_DEL  = 0x01,
	TT_CLIENT_ROAM = 0x02
};

86 87 88
struct batman_packet {
	uint8_t  packet_type;
	uint8_t  version;  /* batman version field */
89
	uint8_t  ttl;
90 91 92 93 94
	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 */
95
	uint8_t  tq;
96 97 98
	uint8_t  tt_num_changes;
	uint8_t  ttvn; /* translation table version number */
	uint16_t tt_crc;
99
} __packed;
100 101 102 103 104 105 106

#define BAT_PACKET_LEN sizeof(struct batman_packet)

struct icmp_packet {
	uint8_t  packet_type;
	uint8_t  version;  /* batman version field */
	uint8_t  ttl;
107
	uint8_t  msg_type; /* see ICMP message types above */
108 109 110 111
	uint8_t  dst[6];
	uint8_t  orig[6];
	uint16_t seqno;
	uint8_t  uid;
112
	uint8_t  reserved;
113
} __packed;
114 115 116 117 118 119 120 121 122

#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 {
	uint8_t  packet_type;
	uint8_t  version;  /* batman version field */
	uint8_t  ttl;
123
	uint8_t  msg_type; /* see ICMP message types above */
124 125 126 127 128 129
	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];
130
} __packed;
131 132 133 134 135

struct unicast_packet {
	uint8_t  packet_type;
	uint8_t  version;  /* batman version field */
	uint8_t  ttl;
136
	uint8_t  ttvn; /* destination translation table version number */
137
	uint8_t  dest[6];
138
} __packed;
139 140 141 142 143

struct unicast_frag_packet {
	uint8_t  packet_type;
	uint8_t  version;  /* batman version field */
	uint8_t  ttl;
144
	uint8_t  ttvn; /* destination translation table version number */
145
	uint8_t  dest[6];
146
	uint8_t  flags;
147
	uint8_t  align;
148 149
	uint8_t  orig[6];
	uint16_t seqno;
150
} __packed;
151 152 153 154 155

struct bcast_packet {
	uint8_t  packet_type;
	uint8_t  version;  /* batman version field */
	uint8_t  ttl;
156
	uint8_t  reserved;
157
	uint32_t seqno;
158
	uint8_t  orig[6];
159
} __packed;
160 161 162 163

struct vis_packet {
	uint8_t  packet_type;
	uint8_t  version;        /* batman version field */
164
	uint8_t  ttl;		 /* TTL */
165 166
	uint8_t  vis_type;	 /* which type of vis-participant sent this? */
	uint32_t seqno;		 /* sequence number */
167 168
	uint8_t  entries;	 /* number of entries behind this struct */
	uint8_t  reserved;
169
	uint8_t  vis_orig[6];	 /* originator that announces its neighbors */
170 171
	uint8_t  target_orig[6]; /* who should receive this packet */
	uint8_t  sender_orig[6]; /* who sent or rebroadcasted this packet */
172
} __packed;
173

174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
struct tt_query_packet {
	uint8_t  packet_type;
	uint8_t  version;  /* batman version field */
	uint8_t  ttl;
	/* 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;

struct tt_change {
	uint8_t flags;
	uint8_t addr[ETH_ALEN];
} __packed;

202
#endif /* _NET_BATMAN_ADV_PACKET_H_ */