main.c 11.3 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
	/* unicast packet */
304
	batadv_rx_handler[BATADV_UNICAST] = batadv_recv_unicast_packet;
305
	/* fragmented unicast packet */
306
	batadv_rx_handler[BATADV_UNICAST_FRAG] = batadv_recv_ucast_frag_packet;
307
	/* broadcast packet */
308
	batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet;
309
	/* vis packet */
310
	batadv_rx_handler[BATADV_VIS] = batadv_recv_vis_packet;
311
	/* Translation table query (request or response) */
312
	batadv_rx_handler[BATADV_TT_QUERY] = batadv_recv_tt_query;
313
	/* Roaming advertisement */
314
	batadv_rx_handler[BATADV_ROAM_ADV] = batadv_recv_roam_adv;
315 316
}

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

325
	batadv_rx_handler[packet_type] = recv_handler;
326 327 328
	return 0;
}

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

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

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

		bat_algo_ops = bat_algo_ops_tmp;
		break;
	}

	return bat_algo_ops;
}

350
int batadv_algo_register(struct batadv_algo_ops *bat_algo_ops)
351
{
352
	struct batadv_algo_ops *bat_algo_ops_tmp;
353
	int ret;
354

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

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

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

out:
	return ret;
}

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

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

	bat_priv->bat_algo_ops = bat_algo_ops;
	ret = 0;

out:
	return ret;
}

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

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

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

	return 0;
}

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

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

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

429
	return param_set_copystring(algo_name, kp);
430 431
}

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

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

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

MODULE_LICENSE("GPL");

449 450 451 452
MODULE_AUTHOR(BATADV_DRIVER_AUTHOR);
MODULE_DESCRIPTION(BATADV_DRIVER_DESC);
MODULE_SUPPORTED_DEVICE(BATADV_DRIVER_DEVICE);
MODULE_VERSION(BATADV_SOURCE_VERSION);