1 /*
2  * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
3  *
4  * Marek Lindner, Simon Wunderlich
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of version 2 of the GNU General Public
8  * License as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  * 02110-1301, USA
19  *
20  */
21 
22 #include "main.h"
23 #include "hard-interface.h"
24 #include "soft-interface.h"
25 #include "send.h"
26 #include "translation-table.h"
27 #include "routing.h"
28 #include "bat_sysfs.h"
29 #include "originator.h"
30 #include "hash.h"
31 
32 #include <linux/if_arp.h>
33 
34 
35 static int batman_skb_recv(struct sk_buff *skb,
36 			   struct net_device *dev,
37 			   struct packet_type *ptype,
38 			   struct net_device *orig_dev);
39 
40 void hardif_free_rcu(struct rcu_head *rcu)
41 {
42 	struct hard_iface *hard_iface;
43 
44 	hard_iface = container_of(rcu, struct hard_iface, rcu);
45 	dev_put(hard_iface->net_dev);
46 	kfree(hard_iface);
47 }
48 
49 struct hard_iface *hardif_get_by_netdev(struct net_device *net_dev)
50 {
51 	struct hard_iface *hard_iface;
52 
53 	rcu_read_lock();
54 	list_for_each_entry_rcu(hard_iface, &hardif_list, list) {
55 		if (hard_iface->net_dev == net_dev &&
56 		    atomic_inc_not_zero(&hard_iface->refcount))
57 			goto out;
58 	}
59 
60 	hard_iface = NULL;
61 
62 out:
63 	rcu_read_unlock();
64 	return hard_iface;
65 }
66 
67 static int is_valid_iface(struct net_device *net_dev)
68 {
69 	if (net_dev->flags & IFF_LOOPBACK)
70 		return 0;
71 
72 	if (net_dev->type != ARPHRD_ETHER)
73 		return 0;
74 
75 	if (net_dev->addr_len != ETH_ALEN)
76 		return 0;
77 
78 	/* no batman over batman */
79 	if (softif_is_valid(net_dev))
80 		return 0;
81 
82 	/* Device is being bridged */
83 	/* if (net_dev->priv_flags & IFF_BRIDGE_PORT)
84 		return 0; */
85 
86 	return 1;
87 }
88 
89 static struct hard_iface *hardif_get_active(struct net_device *soft_iface)
90 {
91 	struct hard_iface *hard_iface;
92 
93 	rcu_read_lock();
94 	list_for_each_entry_rcu(hard_iface, &hardif_list, list) {
95 		if (hard_iface->soft_iface != soft_iface)
96 			continue;
97 
98 		if (hard_iface->if_status == IF_ACTIVE &&
99 		    atomic_inc_not_zero(&hard_iface->refcount))
100 			goto out;
101 	}
102 
103 	hard_iface = NULL;
104 
105 out:
106 	rcu_read_unlock();
107 	return hard_iface;
108 }
109 
110 static void primary_if_update_addr(struct bat_priv *bat_priv)
111 {
112 	struct vis_packet *vis_packet;
113 	struct hard_iface *primary_if;
114 
115 	primary_if = primary_if_get_selected(bat_priv);
116 	if (!primary_if)
117 		goto out;
118 
119 	vis_packet = (struct vis_packet *)
120 				bat_priv->my_vis_info->skb_packet->data;
121 	memcpy(vis_packet->vis_orig, primary_if->net_dev->dev_addr, ETH_ALEN);
122 	memcpy(vis_packet->sender_orig,
123 	       primary_if->net_dev->dev_addr, ETH_ALEN);
124 
125 out:
126 	if (primary_if)
127 		hardif_free_ref(primary_if);
128 }
129 
130 static void primary_if_select(struct bat_priv *bat_priv,
131 			      struct hard_iface *new_hard_iface)
132 {
133 	struct hard_iface *curr_hard_iface;
134 	struct batman_packet *batman_packet;
135 
136 	ASSERT_RTNL();
137 
138 	if (new_hard_iface && !atomic_inc_not_zero(&new_hard_iface->refcount))
139 		new_hard_iface = NULL;
140 
141 	curr_hard_iface = bat_priv->primary_if;
142 	rcu_assign_pointer(bat_priv->primary_if, new_hard_iface);
143 
144 	if (curr_hard_iface)
145 		hardif_free_ref(curr_hard_iface);
146 
147 	if (!new_hard_iface)
148 		return;
149 
150 	batman_packet = (struct batman_packet *)(new_hard_iface->packet_buff);
151 	batman_packet->flags = PRIMARIES_FIRST_HOP;
152 	batman_packet->ttl = TTL;
153 
154 	primary_if_update_addr(bat_priv);
155 
156 	/***
157 	 * hacky trick to make sure that we send the TT information via
158 	 * our new primary interface
159 	 */
160 	atomic_set(&bat_priv->tt_local_changed, 1);
161 }
162 
163 static bool hardif_is_iface_up(struct hard_iface *hard_iface)
164 {
165 	if (hard_iface->net_dev->flags & IFF_UP)
166 		return true;
167 
168 	return false;
169 }
170 
171 static void update_mac_addresses(struct hard_iface *hard_iface)
172 {
173 	memcpy(((struct batman_packet *)(hard_iface->packet_buff))->orig,
174 	       hard_iface->net_dev->dev_addr, ETH_ALEN);
175 	memcpy(((struct batman_packet *)(hard_iface->packet_buff))->prev_sender,
176 	       hard_iface->net_dev->dev_addr, ETH_ALEN);
177 }
178 
179 static void check_known_mac_addr(struct net_device *net_dev)
180 {
181 	struct hard_iface *hard_iface;
182 
183 	rcu_read_lock();
184 	list_for_each_entry_rcu(hard_iface, &hardif_list, list) {
185 		if ((hard_iface->if_status != IF_ACTIVE) &&
186 		    (hard_iface->if_status != IF_TO_BE_ACTIVATED))
187 			continue;
188 
189 		if (hard_iface->net_dev == net_dev)
190 			continue;
191 
192 		if (!compare_eth(hard_iface->net_dev->dev_addr,
193 				 net_dev->dev_addr))
194 			continue;
195 
196 		pr_warning("The newly added mac address (%pM) already exists "
197 			   "on: %s\n", net_dev->dev_addr,
198 			   hard_iface->net_dev->name);
199 		pr_warning("It is strongly recommended to keep mac addresses "
200 			   "unique to avoid problems!\n");
201 	}
202 	rcu_read_unlock();
203 }
204 
205 int hardif_min_mtu(struct net_device *soft_iface)
206 {
207 	struct bat_priv *bat_priv = netdev_priv(soft_iface);
208 	struct hard_iface *hard_iface;
209 	/* allow big frames if all devices are capable to do so
210 	 * (have MTU > 1500 + BAT_HEADER_LEN) */
211 	int min_mtu = ETH_DATA_LEN;
212 
213 	if (atomic_read(&bat_priv->fragmentation))
214 		goto out;
215 
216 	rcu_read_lock();
217 	list_for_each_entry_rcu(hard_iface, &hardif_list, list) {
218 		if ((hard_iface->if_status != IF_ACTIVE) &&
219 		    (hard_iface->if_status != IF_TO_BE_ACTIVATED))
220 			continue;
221 
222 		if (hard_iface->soft_iface != soft_iface)
223 			continue;
224 
225 		min_mtu = min_t(int, hard_iface->net_dev->mtu - BAT_HEADER_LEN,
226 				min_mtu);
227 	}
228 	rcu_read_unlock();
229 out:
230 	return min_mtu;
231 }
232 
233 /* adjusts the MTU if a new interface with a smaller MTU appeared. */
234 void update_min_mtu(struct net_device *soft_iface)
235 {
236 	int min_mtu;
237 
238 	min_mtu = hardif_min_mtu(soft_iface);
239 	if (soft_iface->mtu != min_mtu)
240 		soft_iface->mtu = min_mtu;
241 }
242 
243 static void hardif_activate_interface(struct hard_iface *hard_iface)
244 {
245 	struct bat_priv *bat_priv;
246 	struct hard_iface *primary_if = NULL;
247 
248 	if (hard_iface->if_status != IF_INACTIVE)
249 		goto out;
250 
251 	bat_priv = netdev_priv(hard_iface->soft_iface);
252 
253 	update_mac_addresses(hard_iface);
254 	hard_iface->if_status = IF_TO_BE_ACTIVATED;
255 
256 	/**
257 	 * the first active interface becomes our primary interface or
258 	 * the next active interface after the old primay interface was removed
259 	 */
260 	primary_if = primary_if_get_selected(bat_priv);
261 	if (!primary_if)
262 		primary_if_select(bat_priv, hard_iface);
263 
264 	bat_info(hard_iface->soft_iface, "Interface activated: %s\n",
265 		 hard_iface->net_dev->name);
266 
267 	update_min_mtu(hard_iface->soft_iface);
268 
269 out:
270 	if (primary_if)
271 		hardif_free_ref(primary_if);
272 }
273 
274 static void hardif_deactivate_interface(struct hard_iface *hard_iface)
275 {
276 	if ((hard_iface->if_status != IF_ACTIVE) &&
277 	    (hard_iface->if_status != IF_TO_BE_ACTIVATED))
278 		return;
279 
280 	hard_iface->if_status = IF_INACTIVE;
281 
282 	bat_info(hard_iface->soft_iface, "Interface deactivated: %s\n",
283 		 hard_iface->net_dev->name);
284 
285 	update_min_mtu(hard_iface->soft_iface);
286 }
287 
288 int hardif_enable_interface(struct hard_iface *hard_iface, char *iface_name)
289 {
290 	struct bat_priv *bat_priv;
291 	struct batman_packet *batman_packet;
292 	struct net_device *soft_iface;
293 	int ret;
294 
295 	if (hard_iface->if_status != IF_NOT_IN_USE)
296 		goto out;
297 
298 	if (!atomic_inc_not_zero(&hard_iface->refcount))
299 		goto out;
300 
301 	soft_iface = dev_get_by_name(&init_net, iface_name);
302 
303 	if (!soft_iface) {
304 		soft_iface = softif_create(iface_name);
305 
306 		if (!soft_iface) {
307 			ret = -ENOMEM;
308 			goto err;
309 		}
310 
311 		/* dev_get_by_name() increases the reference counter for us */
312 		dev_hold(soft_iface);
313 	}
314 
315 	if (!softif_is_valid(soft_iface)) {
316 		pr_err("Can't create batman mesh interface %s: "
317 		       "already exists as regular interface\n",
318 		       soft_iface->name);
319 		dev_put(soft_iface);
320 		ret = -EINVAL;
321 		goto err;
322 	}
323 
324 	hard_iface->soft_iface = soft_iface;
325 	bat_priv = netdev_priv(hard_iface->soft_iface);
326 	hard_iface->packet_len = BAT_PACKET_LEN;
327 	hard_iface->packet_buff = kmalloc(hard_iface->packet_len, GFP_ATOMIC);
328 
329 	if (!hard_iface->packet_buff) {
330 		bat_err(hard_iface->soft_iface, "Can't add interface packet "
331 			"(%s): out of memory\n", hard_iface->net_dev->name);
332 		ret = -ENOMEM;
333 		goto err;
334 	}
335 
336 	batman_packet = (struct batman_packet *)(hard_iface->packet_buff);
337 	batman_packet->packet_type = BAT_PACKET;
338 	batman_packet->version = COMPAT_VERSION;
339 	batman_packet->flags = 0;
340 	batman_packet->ttl = 2;
341 	batman_packet->tq = TQ_MAX_VALUE;
342 	batman_packet->num_tt = 0;
343 
344 	hard_iface->if_num = bat_priv->num_ifaces;
345 	bat_priv->num_ifaces++;
346 	hard_iface->if_status = IF_INACTIVE;
347 	orig_hash_add_if(hard_iface, bat_priv->num_ifaces);
348 
349 	hard_iface->batman_adv_ptype.type = __constant_htons(ETH_P_BATMAN);
350 	hard_iface->batman_adv_ptype.func = batman_skb_recv;
351 	hard_iface->batman_adv_ptype.dev = hard_iface->net_dev;
352 	dev_add_pack(&hard_iface->batman_adv_ptype);
353 
354 	atomic_set(&hard_iface->seqno, 1);
355 	atomic_set(&hard_iface->frag_seqno, 1);
356 	bat_info(hard_iface->soft_iface, "Adding interface: %s\n",
357 		 hard_iface->net_dev->name);
358 
359 	if (atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu <
360 		ETH_DATA_LEN + BAT_HEADER_LEN)
361 		bat_info(hard_iface->soft_iface,
362 			"The MTU of interface %s is too small (%i) to handle "
363 			"the transport of batman-adv packets. Packets going "
364 			"over this interface will be fragmented on layer2 "
365 			"which could impact the performance. Setting the MTU "
366 			"to %zi would solve the problem.\n",
367 			hard_iface->net_dev->name, hard_iface->net_dev->mtu,
368 			ETH_DATA_LEN + BAT_HEADER_LEN);
369 
370 	if (!atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu <
371 		ETH_DATA_LEN + BAT_HEADER_LEN)
372 		bat_info(hard_iface->soft_iface,
373 			"The MTU of interface %s is too small (%i) to handle "
374 			"the transport of batman-adv packets. If you experience"
375 			" problems getting traffic through try increasing the "
376 			"MTU to %zi.\n",
377 			hard_iface->net_dev->name, hard_iface->net_dev->mtu,
378 			ETH_DATA_LEN + BAT_HEADER_LEN);
379 
380 	if (hardif_is_iface_up(hard_iface))
381 		hardif_activate_interface(hard_iface);
382 	else
383 		bat_err(hard_iface->soft_iface, "Not using interface %s "
384 			"(retrying later): interface not active\n",
385 			hard_iface->net_dev->name);
386 
387 	/* begin scheduling originator messages on that interface */
388 	schedule_own_packet(hard_iface);
389 
390 out:
391 	return 0;
392 
393 err:
394 	hardif_free_ref(hard_iface);
395 	return ret;
396 }
397 
398 void hardif_disable_interface(struct hard_iface *hard_iface)
399 {
400 	struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
401 	struct hard_iface *primary_if = NULL;
402 
403 	if (hard_iface->if_status == IF_ACTIVE)
404 		hardif_deactivate_interface(hard_iface);
405 
406 	if (hard_iface->if_status != IF_INACTIVE)
407 		goto out;
408 
409 	bat_info(hard_iface->soft_iface, "Removing interface: %s\n",
410 		 hard_iface->net_dev->name);
411 	dev_remove_pack(&hard_iface->batman_adv_ptype);
412 
413 	bat_priv->num_ifaces--;
414 	orig_hash_del_if(hard_iface, bat_priv->num_ifaces);
415 
416 	primary_if = primary_if_get_selected(bat_priv);
417 	if (hard_iface == primary_if) {
418 		struct hard_iface *new_if;
419 
420 		new_if = hardif_get_active(hard_iface->soft_iface);
421 		primary_if_select(bat_priv, new_if);
422 
423 		if (new_if)
424 			hardif_free_ref(new_if);
425 	}
426 
427 	kfree(hard_iface->packet_buff);
428 	hard_iface->packet_buff = NULL;
429 	hard_iface->if_status = IF_NOT_IN_USE;
430 
431 	/* delete all references to this hard_iface */
432 	purge_orig_ref(bat_priv);
433 	purge_outstanding_packets(bat_priv, hard_iface);
434 	dev_put(hard_iface->soft_iface);
435 
436 	/* nobody uses this interface anymore */
437 	if (!bat_priv->num_ifaces)
438 		softif_destroy(hard_iface->soft_iface);
439 
440 	hard_iface->soft_iface = NULL;
441 	hardif_free_ref(hard_iface);
442 
443 out:
444 	if (primary_if)
445 		hardif_free_ref(primary_if);
446 }
447 
448 static struct hard_iface *hardif_add_interface(struct net_device *net_dev)
449 {
450 	struct hard_iface *hard_iface;
451 	int ret;
452 
453 	ASSERT_RTNL();
454 
455 	ret = is_valid_iface(net_dev);
456 	if (ret != 1)
457 		goto out;
458 
459 	dev_hold(net_dev);
460 
461 	hard_iface = kmalloc(sizeof(struct hard_iface), GFP_ATOMIC);
462 	if (!hard_iface) {
463 		pr_err("Can't add interface (%s): out of memory\n",
464 		       net_dev->name);
465 		goto release_dev;
466 	}
467 
468 	ret = sysfs_add_hardif(&hard_iface->hardif_obj, net_dev);
469 	if (ret)
470 		goto free_if;
471 
472 	hard_iface->if_num = -1;
473 	hard_iface->net_dev = net_dev;
474 	hard_iface->soft_iface = NULL;
475 	hard_iface->if_status = IF_NOT_IN_USE;
476 	INIT_LIST_HEAD(&hard_iface->list);
477 	/* extra reference for return */
478 	atomic_set(&hard_iface->refcount, 2);
479 
480 	check_known_mac_addr(hard_iface->net_dev);
481 	list_add_tail_rcu(&hard_iface->list, &hardif_list);
482 
483 	return hard_iface;
484 
485 free_if:
486 	kfree(hard_iface);
487 release_dev:
488 	dev_put(net_dev);
489 out:
490 	return NULL;
491 }
492 
493 static void hardif_remove_interface(struct hard_iface *hard_iface)
494 {
495 	ASSERT_RTNL();
496 
497 	/* first deactivate interface */
498 	if (hard_iface->if_status != IF_NOT_IN_USE)
499 		hardif_disable_interface(hard_iface);
500 
501 	if (hard_iface->if_status != IF_NOT_IN_USE)
502 		return;
503 
504 	hard_iface->if_status = IF_TO_BE_REMOVED;
505 	sysfs_del_hardif(&hard_iface->hardif_obj);
506 	hardif_free_ref(hard_iface);
507 }
508 
509 void hardif_remove_interfaces(void)
510 {
511 	struct hard_iface *hard_iface, *hard_iface_tmp;
512 
513 	rtnl_lock();
514 	list_for_each_entry_safe(hard_iface, hard_iface_tmp,
515 				 &hardif_list, list) {
516 		list_del_rcu(&hard_iface->list);
517 		hardif_remove_interface(hard_iface);
518 	}
519 	rtnl_unlock();
520 }
521 
522 static int hard_if_event(struct notifier_block *this,
523 			 unsigned long event, void *ptr)
524 {
525 	struct net_device *net_dev = (struct net_device *)ptr;
526 	struct hard_iface *hard_iface = hardif_get_by_netdev(net_dev);
527 	struct hard_iface *primary_if = NULL;
528 	struct bat_priv *bat_priv;
529 
530 	if (!hard_iface && event == NETDEV_REGISTER)
531 		hard_iface = hardif_add_interface(net_dev);
532 
533 	if (!hard_iface)
534 		goto out;
535 
536 	switch (event) {
537 	case NETDEV_UP:
538 		hardif_activate_interface(hard_iface);
539 		break;
540 	case NETDEV_GOING_DOWN:
541 	case NETDEV_DOWN:
542 		hardif_deactivate_interface(hard_iface);
543 		break;
544 	case NETDEV_UNREGISTER:
545 		list_del_rcu(&hard_iface->list);
546 
547 		hardif_remove_interface(hard_iface);
548 		break;
549 	case NETDEV_CHANGEMTU:
550 		if (hard_iface->soft_iface)
551 			update_min_mtu(hard_iface->soft_iface);
552 		break;
553 	case NETDEV_CHANGEADDR:
554 		if (hard_iface->if_status == IF_NOT_IN_USE)
555 			goto hardif_put;
556 
557 		check_known_mac_addr(hard_iface->net_dev);
558 		update_mac_addresses(hard_iface);
559 
560 		bat_priv = netdev_priv(hard_iface->soft_iface);
561 		primary_if = primary_if_get_selected(bat_priv);
562 		if (!primary_if)
563 			goto hardif_put;
564 
565 		if (hard_iface == primary_if)
566 			primary_if_update_addr(bat_priv);
567 		break;
568 	default:
569 		break;
570 	};
571 
572 hardif_put:
573 	hardif_free_ref(hard_iface);
574 out:
575 	if (primary_if)
576 		hardif_free_ref(primary_if);
577 	return NOTIFY_DONE;
578 }
579 
580 /* receive a packet with the batman ethertype coming on a hard
581  * interface */
582 static int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
583 			   struct packet_type *ptype,
584 			   struct net_device *orig_dev)
585 {
586 	struct bat_priv *bat_priv;
587 	struct batman_packet *batman_packet;
588 	struct hard_iface *hard_iface;
589 	int ret;
590 
591 	hard_iface = container_of(ptype, struct hard_iface, batman_adv_ptype);
592 	skb = skb_share_check(skb, GFP_ATOMIC);
593 
594 	/* skb was released by skb_share_check() */
595 	if (!skb)
596 		goto err_out;
597 
598 	/* packet should hold at least type and version */
599 	if (unlikely(!pskb_may_pull(skb, 2)))
600 		goto err_free;
601 
602 	/* expect a valid ethernet header here. */
603 	if (unlikely(skb->mac_len != sizeof(struct ethhdr)
604 				|| !skb_mac_header(skb)))
605 		goto err_free;
606 
607 	if (!hard_iface->soft_iface)
608 		goto err_free;
609 
610 	bat_priv = netdev_priv(hard_iface->soft_iface);
611 
612 	if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE)
613 		goto err_free;
614 
615 	/* discard frames on not active interfaces */
616 	if (hard_iface->if_status != IF_ACTIVE)
617 		goto err_free;
618 
619 	batman_packet = (struct batman_packet *)skb->data;
620 
621 	if (batman_packet->version != COMPAT_VERSION) {
622 		bat_dbg(DBG_BATMAN, bat_priv,
623 			"Drop packet: incompatible batman version (%i)\n",
624 			batman_packet->version);
625 		goto err_free;
626 	}
627 
628 	/* all receive handlers return whether they received or reused
629 	 * the supplied skb. if not, we have to free the skb. */
630 
631 	switch (batman_packet->packet_type) {
632 		/* batman originator packet */
633 	case BAT_PACKET:
634 		ret = recv_bat_packet(skb, hard_iface);
635 		break;
636 
637 		/* batman icmp packet */
638 	case BAT_ICMP:
639 		ret = recv_icmp_packet(skb, hard_iface);
640 		break;
641 
642 		/* unicast packet */
643 	case BAT_UNICAST:
644 		ret = recv_unicast_packet(skb, hard_iface);
645 		break;
646 
647 		/* fragmented unicast packet */
648 	case BAT_UNICAST_FRAG:
649 		ret = recv_ucast_frag_packet(skb, hard_iface);
650 		break;
651 
652 		/* broadcast packet */
653 	case BAT_BCAST:
654 		ret = recv_bcast_packet(skb, hard_iface);
655 		break;
656 
657 		/* vis packet */
658 	case BAT_VIS:
659 		ret = recv_vis_packet(skb, hard_iface);
660 		break;
661 	default:
662 		ret = NET_RX_DROP;
663 	}
664 
665 	if (ret == NET_RX_DROP)
666 		kfree_skb(skb);
667 
668 	/* return NET_RX_SUCCESS in any case as we
669 	 * most probably dropped the packet for
670 	 * routing-logical reasons. */
671 
672 	return NET_RX_SUCCESS;
673 
674 err_free:
675 	kfree_skb(skb);
676 err_out:
677 	return NET_RX_DROP;
678 }
679 
680 struct notifier_block hard_if_notifier = {
681 	.notifier_call = hard_if_event,
682 };
683