main.c 11.5 KB
Newer Older
1
/* Copyright (C) 2007-2012 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 20
 *
 * 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
 */

#include "main.h"
21 22
#include "sysfs.h"
#include "debugfs.h"
23 24 25 26 27 28 29 30
#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"
31
#include "bridge_loop_avoidance.h"
32 33
#include "vis.h"
#include "hash.h"
34
#include "bat_algo.h"
35

36 37

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

46
unsigned char batadv_broadcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
47

48
struct workqueue_struct *batadv_event_workqueue;
49

50
static void batadv_recv_handler_init(void);
51

52
static int __init batadv_init(void)
53
{
54
	INIT_LIST_HEAD(&batadv_hardif_list);
55
	INIT_HLIST_HEAD(&batadv_algo_list);
56

57
	batadv_recv_handler_init();
58

59
	batadv_iv_init();
60

61
	batadv_event_workqueue = create_singlethread_workqueue("bat_events");
62

63
	if (!batadv_event_workqueue)
64 65
		return -ENOMEM;

66
	batadv_socket_init();
67
	batadv_debugfs_init();
68

69
	register_netdevice_notifier(&batadv_hard_if_notifier);
70

71
	pr_info("B.A.T.M.A.N. advanced %s (compatibility version %i) loaded\n",
72
		BATADV_SOURCE_VERSION, BATADV_COMPAT_VERSION);
73 74 75 76

	return 0;
}

77
static void __exit batadv_exit(void)
78
{
79
	batadv_debugfs_destroy();
80 81
	unregister_netdevice_notifier(&batadv_hard_if_notifier);
	batadv_hardif_remove_interfaces();
82

83 84 85
	flush_workqueue(batadv_event_workqueue);
	destroy_workqueue(batadv_event_workqueue);
	batadv_event_workqueue = NULL;
86 87 88 89

	rcu_barrier();
}

90
int batadv_mesh_init(struct net_device *soft_iface)
91
{
92
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
93
	int ret;
94 95 96

	spin_lock_init(&bat_priv->forw_bat_list_lock);
	spin_lock_init(&bat_priv->forw_bcast_list_lock);
97 98 99 100 101 102 103
	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);
104 105 106

	INIT_HLIST_HEAD(&bat_priv->forw_bat_list);
	INIT_HLIST_HEAD(&bat_priv->forw_bcast_list);
107 108 109 110
	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);
111

112
	ret = batadv_originator_init(bat_priv);
113
	if (ret < 0)
114 115
		goto err;

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

120 121
	batadv_tt_local_add(soft_iface, soft_iface->dev_addr,
			    BATADV_NULL_IFINDEX);
122

123
	ret = batadv_vis_init(bat_priv);
124
	if (ret < 0)
125 126
		goto err;

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

131
	atomic_set(&bat_priv->gw.reselect, 0);
132
	atomic_set(&bat_priv->mesh_state, BATADV_MESH_ACTIVE);
133 134

	return 0;
135 136

err:
137
	batadv_mesh_free(soft_iface);
138
	return ret;
139 140
}

141
void batadv_mesh_free(struct net_device *soft_iface)
142
{
143
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
144

145
	atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
146

147
	batadv_purge_outstanding_packets(bat_priv, NULL);
148

149
	batadv_vis_quit(bat_priv);
150

151
	batadv_gw_node_purge(bat_priv);
152
	batadv_originator_free(bat_priv);
153

154
	batadv_tt_free(bat_priv);
155

156
	batadv_bla_free(bat_priv);
157

158 159
	free_percpu(bat_priv->bat_counters);

160
	atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
161 162
}

163
int batadv_is_my_mac(const uint8_t *addr)
164
{
165
	const struct batadv_hard_iface *hard_iface;
166 167

	rcu_read_lock();
168
	list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
169
		if (hard_iface->if_status != BATADV_IF_ACTIVE)
170 171
			continue;

172
		if (batadv_compare_eth(hard_iface->net_dev->dev_addr, addr)) {
173 174 175 176 177 178 179 180
			rcu_read_unlock();
			return 1;
		}
	}
	rcu_read_unlock();
	return 0;
}

181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
/**
 * 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;
}

217
static int batadv_recv_unhandled_packet(struct sk_buff *skb,
218
					struct batadv_hard_iface *recv_if)
219 220 221 222 223 224 225
{
	return NET_RX_DROP;
}

/* incoming packets with the batman ethertype received on any active hard
 * interface
 */
226 227 228
int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
			   struct packet_type *ptype,
			   struct net_device *orig_dev)
229
{
230
	struct batadv_priv *bat_priv;
231
	struct batadv_ogm_packet *batadv_ogm_packet;
232
	struct batadv_hard_iface *hard_iface;
233 234 235
	uint8_t idx;
	int ret;

236 237
	hard_iface = container_of(ptype, struct batadv_hard_iface,
				  batman_adv_ptype);
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
	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);

257
	if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
258 259 260
		goto err_free;

	/* discard frames on not active interfaces */
261
	if (hard_iface->if_status != BATADV_IF_ACTIVE)
262 263
		goto err_free;

264
	batadv_ogm_packet = (struct batadv_ogm_packet *)skb->data;
265

266
	if (batadv_ogm_packet->header.version != BATADV_COMPAT_VERSION) {
267
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
268
			   "Drop packet: incompatible batman version (%i)\n",
269
			   batadv_ogm_packet->header.version);
270 271 272 273 274 275
		goto err_free;
	}

	/* all receive handlers return whether they received or reused
	 * the supplied skb. if not, we have to free the skb.
	 */
276
	idx = batadv_ogm_packet->header.packet_type;
277
	ret = (*batadv_rx_handler[idx])(skb, hard_iface);
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293

	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;
}

294
static void batadv_recv_handler_init(void)
295 296 297
{
	int i;

298 299
	for (i = 0; i < ARRAY_SIZE(batadv_rx_handler); i++)
		batadv_rx_handler[i] = batadv_recv_unhandled_packet;
300 301

	/* batman icmp packet */
302
	batadv_rx_handler[BATADV_ICMP] = batadv_recv_icmp_packet;
303 304
	/* unicast with 4 addresses packet */
	batadv_rx_handler[BATADV_UNICAST_4ADDR] = batadv_recv_unicast_packet;
305
	/* unicast packet */
306
	batadv_rx_handler[BATADV_UNICAST] = batadv_recv_unicast_packet;
307
	/* fragmented unicast packet */
308
	batadv_rx_handler[BATADV_UNICAST_FRAG] = batadv_recv_ucast_frag_packet;
309
	/* broadcast packet */
310
	batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet;
311
	/* vis packet */
312
	batadv_rx_handler[BATADV_VIS] = batadv_recv_vis_packet;
313
	/* Translation table query (request or response) */
314
	batadv_rx_handler[BATADV_TT_QUERY] = batadv_recv_tt_query;
315
	/* Roaming advertisement */
316
	batadv_rx_handler[BATADV_ROAM_ADV] = batadv_recv_roam_adv;
317 318
}

319 320 321 322
int
batadv_recv_handler_register(uint8_t packet_type,
			     int (*recv_handler)(struct sk_buff *,
						 struct batadv_hard_iface *))
323
{
324
	if (batadv_rx_handler[packet_type] != &batadv_recv_unhandled_packet)
325 326
		return -EBUSY;

327
	batadv_rx_handler[packet_type] = recv_handler;
328 329 330
	return 0;
}

331
void batadv_recv_handler_unregister(uint8_t packet_type)
332
{
333
	batadv_rx_handler[packet_type] = batadv_recv_unhandled_packet;
334 335
}

336
static struct batadv_algo_ops *batadv_algo_get(char *name)
337
{
338
	struct batadv_algo_ops *bat_algo_ops = NULL, *bat_algo_ops_tmp;
339 340
	struct hlist_node *node;

341
	hlist_for_each_entry(bat_algo_ops_tmp, node, &batadv_algo_list, list) {
342 343 344 345 346 347 348 349 350 351
		if (strcmp(bat_algo_ops_tmp->name, name) != 0)
			continue;

		bat_algo_ops = bat_algo_ops_tmp;
		break;
	}

	return bat_algo_ops;
}

352
int batadv_algo_register(struct batadv_algo_ops *bat_algo_ops)
353
{
354
	struct batadv_algo_ops *bat_algo_ops_tmp;
355
	int ret;
356

357
	bat_algo_ops_tmp = batadv_algo_get(bat_algo_ops->name);
358
	if (bat_algo_ops_tmp) {
359 360
		pr_info("Trying to register already registered routing algorithm: %s\n",
			bat_algo_ops->name);
361
		ret = -EEXIST;
362 363 364
		goto out;
	}

365
	/* all algorithms must implement all ops (for now) */
366
	if (!bat_algo_ops->bat_iface_enable ||
367
	    !bat_algo_ops->bat_iface_disable ||
368
	    !bat_algo_ops->bat_iface_update_mac ||
369
	    !bat_algo_ops->bat_primary_iface_set ||
370
	    !bat_algo_ops->bat_ogm_schedule ||
371
	    !bat_algo_ops->bat_ogm_emit) {
372 373
		pr_info("Routing algo '%s' does not implement required ops\n",
			bat_algo_ops->name);
374
		ret = -EINVAL;
375 376 377
		goto out;
	}

378
	INIT_HLIST_NODE(&bat_algo_ops->list);
379
	hlist_add_head(&bat_algo_ops->list, &batadv_algo_list);
380 381 382 383 384 385
	ret = 0;

out:
	return ret;
}

386
int batadv_algo_select(struct batadv_priv *bat_priv, char *name)
387
{
388
	struct batadv_algo_ops *bat_algo_ops;
389
	int ret = -EINVAL;
390

391
	bat_algo_ops = batadv_algo_get(name);
392 393 394 395 396 397 398 399 400 401
	if (!bat_algo_ops)
		goto out;

	bat_priv->bat_algo_ops = bat_algo_ops;
	ret = 0;

out:
	return ret;
}

402
int batadv_algo_seq_print_text(struct seq_file *seq, void *offset)
403
{
404
	struct batadv_algo_ops *bat_algo_ops;
405 406 407 408
	struct hlist_node *node;

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

409
	hlist_for_each_entry(bat_algo_ops, node, &batadv_algo_list, list) {
410 411 412 413 414 415
		seq_printf(seq, "%s\n", bat_algo_ops->name);
	}

	return 0;
}

416
static int batadv_param_set_ra(const char *val, const struct kernel_param *kp)
417
{
418
	struct batadv_algo_ops *bat_algo_ops;
419 420
	char *algo_name = (char *)val;
	size_t name_len = strlen(algo_name);
421

422 423 424
	if (algo_name[name_len - 1] == '\n')
		algo_name[name_len - 1] = '\0';

425
	bat_algo_ops = batadv_algo_get(algo_name);
426
	if (!bat_algo_ops) {
427
		pr_err("Routing algorithm '%s' is not supported\n", algo_name);
428 429 430
		return -EINVAL;
	}

431
	return param_set_copystring(algo_name, kp);
432 433
}

434 435
static const struct kernel_param_ops batadv_param_ops_ra = {
	.set = batadv_param_set_ra,
436 437 438
	.get = param_get_string,
};

439
static struct kparam_string batadv_param_string_ra = {
440 441
	.maxlen = sizeof(batadv_routing_algo),
	.string = batadv_routing_algo,
442 443
};

444 445 446 447
module_param_cb(routing_algo, &batadv_param_ops_ra, &batadv_param_string_ra,
		0644);
module_init(batadv_init);
module_exit(batadv_exit);
448 449 450

MODULE_LICENSE("GPL");

451 452 453 454
MODULE_AUTHOR(BATADV_DRIVER_AUTHOR);
MODULE_DESCRIPTION(BATADV_DRIVER_DESC);
MODULE_SUPPORTED_DEVICE(BATADV_DRIVER_DEVICE);
MODULE_VERSION(BATADV_SOURCE_VERSION);