main.c 12.5 KB
Newer Older
1
/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 *
 * 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
 */

20 21
#include <linux/crc32c.h>
#include <linux/highmem.h>
22
#include "main.h"
23 24
#include "sysfs.h"
#include "debugfs.h"
25 26 27 28 29 30 31 32
#include "routing.h"
#include "send.h"
#include "originator.h"
#include "soft-interface.h"
#include "icmp_socket.h"
#include "translation-table.h"
#include "hard-interface.h"
#include "gateway_client.h"
33
#include "bridge_loop_avoidance.h"
34
#include "distributed-arp-table.h"
35 36
#include "vis.h"
#include "hash.h"
37
#include "bat_algo.h"
38
#include "network-coding.h"
39

40 41

/* List manipulations on hardif_list have to be rtnl_lock()'ed,
42 43
 * list traversals just rcu-locked
 */
44
struct list_head batadv_hardif_list;
45
static int (*batadv_rx_handler[256])(struct sk_buff *,
46
				     struct batadv_hard_iface *);
47
char batadv_routing_algo[20] = "BATMAN_IV";
48
static struct hlist_head batadv_algo_list;
49

50
unsigned char batadv_broadcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
51

52
struct workqueue_struct *batadv_event_workqueue;
53

54
static void batadv_recv_handler_init(void);
55

56
static int __init batadv_init(void)
57
{
58
	INIT_LIST_HEAD(&batadv_hardif_list);
59
	INIT_HLIST_HEAD(&batadv_algo_list);
60

61
	batadv_recv_handler_init();
62

63
	batadv_iv_init();
64

65
	batadv_event_workqueue = create_singlethread_workqueue("bat_events");
66

67
	if (!batadv_event_workqueue)
68 69
		return -ENOMEM;

70
	batadv_socket_init();
71
	batadv_debugfs_init();
72

73
	register_netdevice_notifier(&batadv_hard_if_notifier);
74

75
	pr_info("B.A.T.M.A.N. advanced %s (compatibility version %i) loaded\n",
76
		BATADV_SOURCE_VERSION, BATADV_COMPAT_VERSION);
77 78 79 80

	return 0;
}

81
static void __exit batadv_exit(void)
82
{
83
	batadv_debugfs_destroy();
84 85
	unregister_netdevice_notifier(&batadv_hard_if_notifier);
	batadv_hardif_remove_interfaces();
86

87 88 89
	flush_workqueue(batadv_event_workqueue);
	destroy_workqueue(batadv_event_workqueue);
	batadv_event_workqueue = NULL;
90 91 92 93

	rcu_barrier();
}

94
int batadv_mesh_init(struct net_device *soft_iface)
95
{
96
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
97
	int ret;
98 99 100

	spin_lock_init(&bat_priv->forw_bat_list_lock);
	spin_lock_init(&bat_priv->forw_bcast_list_lock);
101 102 103 104 105 106 107
	spin_lock_init(&bat_priv->tt.changes_list_lock);
	spin_lock_init(&bat_priv->tt.req_list_lock);
	spin_lock_init(&bat_priv->tt.roam_list_lock);
	spin_lock_init(&bat_priv->tt.last_changeset_lock);
	spin_lock_init(&bat_priv->gw.list_lock);
	spin_lock_init(&bat_priv->vis.hash_lock);
	spin_lock_init(&bat_priv->vis.list_lock);
108 109 110

	INIT_HLIST_HEAD(&bat_priv->forw_bat_list);
	INIT_HLIST_HEAD(&bat_priv->forw_bcast_list);
111 112 113 114
	INIT_HLIST_HEAD(&bat_priv->gw.list);
	INIT_LIST_HEAD(&bat_priv->tt.changes_list);
	INIT_LIST_HEAD(&bat_priv->tt.req_list);
	INIT_LIST_HEAD(&bat_priv->tt.roam_list);
115

116
	ret = batadv_originator_init(bat_priv);
117
	if (ret < 0)
118 119
		goto err;

120
	ret = batadv_tt_init(bat_priv);
121
	if (ret < 0)
122 123
		goto err;

124 125
	batadv_tt_local_add(soft_iface, soft_iface->dev_addr,
			    BATADV_NULL_IFINDEX);
126

127
	ret = batadv_vis_init(bat_priv);
128
	if (ret < 0)
129 130
		goto err;

131
	ret = batadv_bla_init(bat_priv);
132
	if (ret < 0)
133 134
		goto err;

135 136 137 138
	ret = batadv_dat_init(bat_priv);
	if (ret < 0)
		goto err;

139 140 141 142
	ret = batadv_nc_init(bat_priv);
	if (ret < 0)
		goto err;

143
	atomic_set(&bat_priv->gw.reselect, 0);
144
	atomic_set(&bat_priv->mesh_state, BATADV_MESH_ACTIVE);
145 146

	return 0;
147 148

err:
149
	batadv_mesh_free(soft_iface);
150
	return ret;
151 152
}

153
void batadv_mesh_free(struct net_device *soft_iface)
154
{
155
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
156

157
	atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
158

159
	batadv_purge_outstanding_packets(bat_priv, NULL);
160

161
	batadv_vis_quit(bat_priv);
162

163
	batadv_gw_node_purge(bat_priv);
164
	batadv_originator_free(bat_priv);
165
	batadv_nc_free(bat_priv);
166

167
	batadv_tt_free(bat_priv);
168

169
	batadv_bla_free(bat_priv);
170

171 172
	batadv_dat_free(bat_priv);

173 174
	free_percpu(bat_priv->bat_counters);

175
	atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
176 177
}

178
int batadv_is_my_mac(const uint8_t *addr)
179
{
180
	const struct batadv_hard_iface *hard_iface;
181 182

	rcu_read_lock();
183
	list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
184
		if (hard_iface->if_status != BATADV_IF_ACTIVE)
185 186
			continue;

187
		if (batadv_compare_eth(hard_iface->net_dev->dev_addr, addr)) {
188 189 190 191 192 193 194 195
			rcu_read_unlock();
			return 1;
		}
	}
	rcu_read_unlock();
	return 0;
}

196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
/**
 * batadv_seq_print_text_primary_if_get - called from debugfs table printing
 *  function that requires the primary interface
 * @seq: debugfs table seq_file struct
 *
 * Returns primary interface if found or NULL otherwise.
 */
struct batadv_hard_iface *
batadv_seq_print_text_primary_if_get(struct seq_file *seq)
{
	struct net_device *net_dev = (struct net_device *)seq->private;
	struct batadv_priv *bat_priv = netdev_priv(net_dev);
	struct batadv_hard_iface *primary_if;

	primary_if = batadv_primary_if_get_selected(bat_priv);

	if (!primary_if) {
		seq_printf(seq,
			   "BATMAN mesh %s disabled - please specify interfaces to enable it\n",
			   net_dev->name);
		goto out;
	}

	if (primary_if->if_status == BATADV_IF_ACTIVE)
		goto out;

	seq_printf(seq,
		   "BATMAN mesh %s disabled - primary interface not active\n",
		   net_dev->name);
	batadv_hardif_free_ref(primary_if);
	primary_if = NULL;

out:
	return primary_if;
}

232
static int batadv_recv_unhandled_packet(struct sk_buff *skb,
233
					struct batadv_hard_iface *recv_if)
234 235 236 237 238 239 240
{
	return NET_RX_DROP;
}

/* incoming packets with the batman ethertype received on any active hard
 * interface
 */
241 242 243
int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
			   struct packet_type *ptype,
			   struct net_device *orig_dev)
244
{
245
	struct batadv_priv *bat_priv;
246
	struct batadv_ogm_packet *batadv_ogm_packet;
247
	struct batadv_hard_iface *hard_iface;
248 249 250
	uint8_t idx;
	int ret;

251 252
	hard_iface = container_of(ptype, struct batadv_hard_iface,
				  batman_adv_ptype);
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
	skb = skb_share_check(skb, GFP_ATOMIC);

	/* skb was released by skb_share_check() */
	if (!skb)
		goto err_out;

	/* packet should hold at least type and version */
	if (unlikely(!pskb_may_pull(skb, 2)))
		goto err_free;

	/* expect a valid ethernet header here. */
	if (unlikely(skb->mac_len != ETH_HLEN || !skb_mac_header(skb)))
		goto err_free;

	if (!hard_iface->soft_iface)
		goto err_free;

	bat_priv = netdev_priv(hard_iface->soft_iface);

272
	if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
273 274 275
		goto err_free;

	/* discard frames on not active interfaces */
276
	if (hard_iface->if_status != BATADV_IF_ACTIVE)
277 278
		goto err_free;

279
	batadv_ogm_packet = (struct batadv_ogm_packet *)skb->data;
280

281
	if (batadv_ogm_packet->header.version != BATADV_COMPAT_VERSION) {
282
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
283
			   "Drop packet: incompatible batman version (%i)\n",
284
			   batadv_ogm_packet->header.version);
285 286 287 288 289 290
		goto err_free;
	}

	/* all receive handlers return whether they received or reused
	 * the supplied skb. if not, we have to free the skb.
	 */
291
	idx = batadv_ogm_packet->header.packet_type;
292
	ret = (*batadv_rx_handler[idx])(skb, hard_iface);
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308

	if (ret == NET_RX_DROP)
		kfree_skb(skb);

	/* return NET_RX_SUCCESS in any case as we
	 * most probably dropped the packet for
	 * routing-logical reasons.
	 */
	return NET_RX_SUCCESS;

err_free:
	kfree_skb(skb);
err_out:
	return NET_RX_DROP;
}

309
static void batadv_recv_handler_init(void)
310 311 312
{
	int i;

313 314
	for (i = 0; i < ARRAY_SIZE(batadv_rx_handler); i++)
		batadv_rx_handler[i] = batadv_recv_unhandled_packet;
315 316

	/* batman icmp packet */
317
	batadv_rx_handler[BATADV_ICMP] = batadv_recv_icmp_packet;
318 319
	/* unicast with 4 addresses packet */
	batadv_rx_handler[BATADV_UNICAST_4ADDR] = batadv_recv_unicast_packet;
320
	/* unicast packet */
321
	batadv_rx_handler[BATADV_UNICAST] = batadv_recv_unicast_packet;
322
	/* fragmented unicast packet */
323
	batadv_rx_handler[BATADV_UNICAST_FRAG] = batadv_recv_ucast_frag_packet;
324
	/* broadcast packet */
325
	batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet;
326
	/* vis packet */
327
	batadv_rx_handler[BATADV_VIS] = batadv_recv_vis_packet;
328
	/* Translation table query (request or response) */
329
	batadv_rx_handler[BATADV_TT_QUERY] = batadv_recv_tt_query;
330
	/* Roaming advertisement */
331
	batadv_rx_handler[BATADV_ROAM_ADV] = batadv_recv_roam_adv;
332 333
}

334 335 336 337
int
batadv_recv_handler_register(uint8_t packet_type,
			     int (*recv_handler)(struct sk_buff *,
						 struct batadv_hard_iface *))
338
{
339
	if (batadv_rx_handler[packet_type] != &batadv_recv_unhandled_packet)
340 341
		return -EBUSY;

342
	batadv_rx_handler[packet_type] = recv_handler;
343 344 345
	return 0;
}

346
void batadv_recv_handler_unregister(uint8_t packet_type)
347
{
348
	batadv_rx_handler[packet_type] = batadv_recv_unhandled_packet;
349 350
}

351
static struct batadv_algo_ops *batadv_algo_get(char *name)
352
{
353
	struct batadv_algo_ops *bat_algo_ops = NULL, *bat_algo_ops_tmp;
354

355
	hlist_for_each_entry(bat_algo_ops_tmp, &batadv_algo_list, list) {
356 357 358 359 360 361 362 363 364 365
		if (strcmp(bat_algo_ops_tmp->name, name) != 0)
			continue;

		bat_algo_ops = bat_algo_ops_tmp;
		break;
	}

	return bat_algo_ops;
}

366
int batadv_algo_register(struct batadv_algo_ops *bat_algo_ops)
367
{
368
	struct batadv_algo_ops *bat_algo_ops_tmp;
369
	int ret;
370

371
	bat_algo_ops_tmp = batadv_algo_get(bat_algo_ops->name);
372
	if (bat_algo_ops_tmp) {
373 374
		pr_info("Trying to register already registered routing algorithm: %s\n",
			bat_algo_ops->name);
375
		ret = -EEXIST;
376 377 378
		goto out;
	}

379
	/* all algorithms must implement all ops (for now) */
380
	if (!bat_algo_ops->bat_iface_enable ||
381
	    !bat_algo_ops->bat_iface_disable ||
382
	    !bat_algo_ops->bat_iface_update_mac ||
383
	    !bat_algo_ops->bat_primary_iface_set ||
384
	    !bat_algo_ops->bat_ogm_schedule ||
385
	    !bat_algo_ops->bat_ogm_emit) {
386 387
		pr_info("Routing algo '%s' does not implement required ops\n",
			bat_algo_ops->name);
388
		ret = -EINVAL;
389 390 391
		goto out;
	}

392
	INIT_HLIST_NODE(&bat_algo_ops->list);
393
	hlist_add_head(&bat_algo_ops->list, &batadv_algo_list);
394 395 396 397 398 399
	ret = 0;

out:
	return ret;
}

400
int batadv_algo_select(struct batadv_priv *bat_priv, char *name)
401
{
402
	struct batadv_algo_ops *bat_algo_ops;
403
	int ret = -EINVAL;
404

405
	bat_algo_ops = batadv_algo_get(name);
406 407 408 409 410 411 412 413 414 415
	if (!bat_algo_ops)
		goto out;

	bat_priv->bat_algo_ops = bat_algo_ops;
	ret = 0;

out:
	return ret;
}

416
int batadv_algo_seq_print_text(struct seq_file *seq, void *offset)
417
{
418
	struct batadv_algo_ops *bat_algo_ops;
419 420 421

	seq_printf(seq, "Available routing algorithms:\n");

422
	hlist_for_each_entry(bat_algo_ops, &batadv_algo_list, list) {
423 424 425 426 427 428
		seq_printf(seq, "%s\n", bat_algo_ops->name);
	}

	return 0;
}

429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
/**
 * batadv_skb_crc32 - calculate CRC32 of the whole packet and skip bytes in
 *  the header
 * @skb: skb pointing to fragmented socket buffers
 * @payload_ptr: Pointer to position inside the head buffer of the skb
 *  marking the start of the data to be CRC'ed
 *
 * payload_ptr must always point to an address in the skb head buffer and not to
 * a fragment.
 */
__be32 batadv_skb_crc32(struct sk_buff *skb, u8 *payload_ptr)
{
	u32 crc = 0;
	unsigned int from;
	unsigned int to = skb->len;
	struct skb_seq_state st;
	const u8 *data;
	unsigned int len;
	unsigned int consumed = 0;

	from = (unsigned int)(payload_ptr - skb->data);

	skb_prepare_seq_read(skb, from, to, &st);
	while ((len = skb_seq_read(consumed, &data, &st)) != 0) {
		crc = crc32c(crc, data, len);
		consumed += len;
	}
	skb_abort_seq_read(&st);

	return htonl(crc);
}

461
static int batadv_param_set_ra(const char *val, const struct kernel_param *kp)
462
{
463
	struct batadv_algo_ops *bat_algo_ops;
464 465
	char *algo_name = (char *)val;
	size_t name_len = strlen(algo_name);
466

467 468 469
	if (algo_name[name_len - 1] == '\n')
		algo_name[name_len - 1] = '\0';

470
	bat_algo_ops = batadv_algo_get(algo_name);
471
	if (!bat_algo_ops) {
472
		pr_err("Routing algorithm '%s' is not supported\n", algo_name);
473 474 475
		return -EINVAL;
	}

476
	return param_set_copystring(algo_name, kp);
477 478
}

479 480
static const struct kernel_param_ops batadv_param_ops_ra = {
	.set = batadv_param_set_ra,
481 482 483
	.get = param_get_string,
};

484
static struct kparam_string batadv_param_string_ra = {
485 486
	.maxlen = sizeof(batadv_routing_algo),
	.string = batadv_routing_algo,
487 488
};

489 490 491 492
module_param_cb(routing_algo, &batadv_param_ops_ra, &batadv_param_string_ra,
		0644);
module_init(batadv_init);
module_exit(batadv_exit);
493 494 495

MODULE_LICENSE("GPL");

496 497 498 499
MODULE_AUTHOR(BATADV_DRIVER_AUTHOR);
MODULE_DESCRIPTION(BATADV_DRIVER_DESC);
MODULE_SUPPORTED_DEVICE(BATADV_DRIVER_DEVICE);
MODULE_VERSION(BATADV_SOURCE_VERSION);