abb490106f3bb0cd53dd3ff1ea245a4cd6246701
[linux-block.git] / net / batman-adv / hard-interface.c
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(const 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(const 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(const 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 = rcu_dereference_protected(bat_priv->primary_if, 1);
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(const 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(const struct net_device *net_dev)
180 {
181         const 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         const struct bat_priv *bat_priv = netdev_priv(soft_iface);
208         const 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,
289                             const char *iface_name)
290 {
291         struct bat_priv *bat_priv;
292         struct batman_packet *batman_packet;
293         struct net_device *soft_iface;
294         int ret;
295
296         if (hard_iface->if_status != IF_NOT_IN_USE)
297                 goto out;
298
299         if (!atomic_inc_not_zero(&hard_iface->refcount))
300                 goto out;
301
302         soft_iface = dev_get_by_name(&init_net, iface_name);
303
304         if (!soft_iface) {
305                 soft_iface = softif_create(iface_name);
306
307                 if (!soft_iface) {
308                         ret = -ENOMEM;
309                         goto err;
310                 }
311
312                 /* dev_get_by_name() increases the reference counter for us */
313                 dev_hold(soft_iface);
314         }
315
316         if (!softif_is_valid(soft_iface)) {
317                 pr_err("Can't create batman mesh interface %s: "
318                        "already exists as regular interface\n",
319                        soft_iface->name);
320                 dev_put(soft_iface);
321                 ret = -EINVAL;
322                 goto err;
323         }
324
325         hard_iface->soft_iface = soft_iface;
326         bat_priv = netdev_priv(hard_iface->soft_iface);
327         hard_iface->packet_len = BAT_PACKET_LEN;
328         hard_iface->packet_buff = kmalloc(hard_iface->packet_len, GFP_ATOMIC);
329
330         if (!hard_iface->packet_buff) {
331                 bat_err(hard_iface->soft_iface, "Can't add interface packet "
332                         "(%s): out of memory\n", hard_iface->net_dev->name);
333                 ret = -ENOMEM;
334                 goto err;
335         }
336
337         batman_packet = (struct batman_packet *)(hard_iface->packet_buff);
338         batman_packet->packet_type = BAT_PACKET;
339         batman_packet->version = COMPAT_VERSION;
340         batman_packet->flags = NO_FLAGS;
341         batman_packet->ttl = 2;
342         batman_packet->tq = TQ_MAX_VALUE;
343         batman_packet->num_tt = 0;
344
345         hard_iface->if_num = bat_priv->num_ifaces;
346         bat_priv->num_ifaces++;
347         hard_iface->if_status = IF_INACTIVE;
348         orig_hash_add_if(hard_iface, bat_priv->num_ifaces);
349
350         hard_iface->batman_adv_ptype.type = __constant_htons(ETH_P_BATMAN);
351         hard_iface->batman_adv_ptype.func = batman_skb_recv;
352         hard_iface->batman_adv_ptype.dev = hard_iface->net_dev;
353         dev_add_pack(&hard_iface->batman_adv_ptype);
354
355         atomic_set(&hard_iface->seqno, 1);
356         atomic_set(&hard_iface->frag_seqno, 1);
357         bat_info(hard_iface->soft_iface, "Adding interface: %s\n",
358                  hard_iface->net_dev->name);
359
360         if (atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu <
361                 ETH_DATA_LEN + BAT_HEADER_LEN)
362                 bat_info(hard_iface->soft_iface,
363                         "The MTU of interface %s is too small (%i) to handle "
364                         "the transport of batman-adv packets. Packets going "
365                         "over this interface will be fragmented on layer2 "
366                         "which could impact the performance. Setting the MTU "
367                         "to %zi would solve the problem.\n",
368                         hard_iface->net_dev->name, hard_iface->net_dev->mtu,
369                         ETH_DATA_LEN + BAT_HEADER_LEN);
370
371         if (!atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu <
372                 ETH_DATA_LEN + BAT_HEADER_LEN)
373                 bat_info(hard_iface->soft_iface,
374                         "The MTU of interface %s is too small (%i) to handle "
375                         "the transport of batman-adv packets. If you experience"
376                         " problems getting traffic through try increasing the "
377                         "MTU to %zi.\n",
378                         hard_iface->net_dev->name, hard_iface->net_dev->mtu,
379                         ETH_DATA_LEN + BAT_HEADER_LEN);
380
381         if (hardif_is_iface_up(hard_iface))
382                 hardif_activate_interface(hard_iface);
383         else
384                 bat_err(hard_iface->soft_iface, "Not using interface %s "
385                         "(retrying later): interface not active\n",
386                         hard_iface->net_dev->name);
387
388         /* begin scheduling originator messages on that interface */
389         schedule_own_packet(hard_iface);
390
391 out:
392         return 0;
393
394 err:
395         hardif_free_ref(hard_iface);
396         return ret;
397 }
398
399 void hardif_disable_interface(struct hard_iface *hard_iface)
400 {
401         struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
402         struct hard_iface *primary_if = NULL;
403
404         if (hard_iface->if_status == IF_ACTIVE)
405                 hardif_deactivate_interface(hard_iface);
406
407         if (hard_iface->if_status != IF_INACTIVE)
408                 goto out;
409
410         bat_info(hard_iface->soft_iface, "Removing interface: %s\n",
411                  hard_iface->net_dev->name);
412         dev_remove_pack(&hard_iface->batman_adv_ptype);
413
414         bat_priv->num_ifaces--;
415         orig_hash_del_if(hard_iface, bat_priv->num_ifaces);
416
417         primary_if = primary_if_get_selected(bat_priv);
418         if (hard_iface == primary_if) {
419                 struct hard_iface *new_if;
420
421                 new_if = hardif_get_active(hard_iface->soft_iface);
422                 primary_if_select(bat_priv, new_if);
423
424                 if (new_if)
425                         hardif_free_ref(new_if);
426         }
427
428         kfree(hard_iface->packet_buff);
429         hard_iface->packet_buff = NULL;
430         hard_iface->if_status = IF_NOT_IN_USE;
431
432         /* delete all references to this hard_iface */
433         purge_orig_ref(bat_priv);
434         purge_outstanding_packets(bat_priv, hard_iface);
435         dev_put(hard_iface->soft_iface);
436
437         /* nobody uses this interface anymore */
438         if (!bat_priv->num_ifaces)
439                 softif_destroy(hard_iface->soft_iface);
440
441         hard_iface->soft_iface = NULL;
442         hardif_free_ref(hard_iface);
443
444 out:
445         if (primary_if)
446                 hardif_free_ref(primary_if);
447 }
448
449 static struct hard_iface *hardif_add_interface(struct net_device *net_dev)
450 {
451         struct hard_iface *hard_iface;
452         int ret;
453
454         ASSERT_RTNL();
455
456         ret = is_valid_iface(net_dev);
457         if (ret != 1)
458                 goto out;
459
460         dev_hold(net_dev);
461
462         hard_iface = kmalloc(sizeof(*hard_iface), GFP_ATOMIC);
463         if (!hard_iface) {
464                 pr_err("Can't add interface (%s): out of memory\n",
465                        net_dev->name);
466                 goto release_dev;
467         }
468
469         ret = sysfs_add_hardif(&hard_iface->hardif_obj, net_dev);
470         if (ret)
471                 goto free_if;
472
473         hard_iface->if_num = -1;
474         hard_iface->net_dev = net_dev;
475         hard_iface->soft_iface = NULL;
476         hard_iface->if_status = IF_NOT_IN_USE;
477         INIT_LIST_HEAD(&hard_iface->list);
478         /* extra reference for return */
479         atomic_set(&hard_iface->refcount, 2);
480
481         check_known_mac_addr(hard_iface->net_dev);
482         list_add_tail_rcu(&hard_iface->list, &hardif_list);
483
484         return hard_iface;
485
486 free_if:
487         kfree(hard_iface);
488 release_dev:
489         dev_put(net_dev);
490 out:
491         return NULL;
492 }
493
494 static void hardif_remove_interface(struct hard_iface *hard_iface)
495 {
496         ASSERT_RTNL();
497
498         /* first deactivate interface */
499         if (hard_iface->if_status != IF_NOT_IN_USE)
500                 hardif_disable_interface(hard_iface);
501
502         if (hard_iface->if_status != IF_NOT_IN_USE)
503                 return;
504
505         hard_iface->if_status = IF_TO_BE_REMOVED;
506         sysfs_del_hardif(&hard_iface->hardif_obj);
507         hardif_free_ref(hard_iface);
508 }
509
510 void hardif_remove_interfaces(void)
511 {
512         struct hard_iface *hard_iface, *hard_iface_tmp;
513
514         rtnl_lock();
515         list_for_each_entry_safe(hard_iface, hard_iface_tmp,
516                                  &hardif_list, list) {
517                 list_del_rcu(&hard_iface->list);
518                 hardif_remove_interface(hard_iface);
519         }
520         rtnl_unlock();
521 }
522
523 static int hard_if_event(struct notifier_block *this,
524                          unsigned long event, void *ptr)
525 {
526         struct net_device *net_dev = ptr;
527         struct hard_iface *hard_iface = hardif_get_by_netdev(net_dev);
528         struct hard_iface *primary_if = NULL;
529         struct bat_priv *bat_priv;
530
531         if (!hard_iface && event == NETDEV_REGISTER)
532                 hard_iface = hardif_add_interface(net_dev);
533
534         if (!hard_iface)
535                 goto out;
536
537         switch (event) {
538         case NETDEV_UP:
539                 hardif_activate_interface(hard_iface);
540                 break;
541         case NETDEV_GOING_DOWN:
542         case NETDEV_DOWN:
543                 hardif_deactivate_interface(hard_iface);
544                 break;
545         case NETDEV_UNREGISTER:
546                 list_del_rcu(&hard_iface->list);
547
548                 hardif_remove_interface(hard_iface);
549                 break;
550         case NETDEV_CHANGEMTU:
551                 if (hard_iface->soft_iface)
552                         update_min_mtu(hard_iface->soft_iface);
553                 break;
554         case NETDEV_CHANGEADDR:
555                 if (hard_iface->if_status == IF_NOT_IN_USE)
556                         goto hardif_put;
557
558                 check_known_mac_addr(hard_iface->net_dev);
559                 update_mac_addresses(hard_iface);
560
561                 bat_priv = netdev_priv(hard_iface->soft_iface);
562                 primary_if = primary_if_get_selected(bat_priv);
563                 if (!primary_if)
564                         goto hardif_put;
565
566                 if (hard_iface == primary_if)
567                         primary_if_update_addr(bat_priv);
568                 break;
569         default:
570                 break;
571         }
572
573 hardif_put:
574         hardif_free_ref(hard_iface);
575 out:
576         if (primary_if)
577                 hardif_free_ref(primary_if);
578         return NOTIFY_DONE;
579 }
580
581 /* receive a packet with the batman ethertype coming on a hard
582  * interface */
583 static int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
584                            struct packet_type *ptype,
585                            struct net_device *orig_dev)
586 {
587         struct bat_priv *bat_priv;
588         struct batman_packet *batman_packet;
589         struct hard_iface *hard_iface;
590         int ret;
591
592         hard_iface = container_of(ptype, struct hard_iface, batman_adv_ptype);
593         skb = skb_share_check(skb, GFP_ATOMIC);
594
595         /* skb was released by skb_share_check() */
596         if (!skb)
597                 goto err_out;
598
599         /* packet should hold at least type and version */
600         if (unlikely(!pskb_may_pull(skb, 2)))
601                 goto err_free;
602
603         /* expect a valid ethernet header here. */
604         if (unlikely(skb->mac_len != sizeof(struct ethhdr)
605                                 || !skb_mac_header(skb)))
606                 goto err_free;
607
608         if (!hard_iface->soft_iface)
609                 goto err_free;
610
611         bat_priv = netdev_priv(hard_iface->soft_iface);
612
613         if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE)
614                 goto err_free;
615
616         /* discard frames on not active interfaces */
617         if (hard_iface->if_status != IF_ACTIVE)
618                 goto err_free;
619
620         batman_packet = (struct batman_packet *)skb->data;
621
622         if (batman_packet->version != COMPAT_VERSION) {
623                 bat_dbg(DBG_BATMAN, bat_priv,
624                         "Drop packet: incompatible batman version (%i)\n",
625                         batman_packet->version);
626                 goto err_free;
627         }
628
629         /* all receive handlers return whether they received or reused
630          * the supplied skb. if not, we have to free the skb. */
631
632         switch (batman_packet->packet_type) {
633                 /* batman originator packet */
634         case BAT_PACKET:
635                 ret = recv_bat_packet(skb, hard_iface);
636                 break;
637
638                 /* batman icmp packet */
639         case BAT_ICMP:
640                 ret = recv_icmp_packet(skb, hard_iface);
641                 break;
642
643                 /* unicast packet */
644         case BAT_UNICAST:
645                 ret = recv_unicast_packet(skb, hard_iface);
646                 break;
647
648                 /* fragmented unicast packet */
649         case BAT_UNICAST_FRAG:
650                 ret = recv_ucast_frag_packet(skb, hard_iface);
651                 break;
652
653                 /* broadcast packet */
654         case BAT_BCAST:
655                 ret = recv_bcast_packet(skb, hard_iface);
656                 break;
657
658                 /* vis packet */
659         case BAT_VIS:
660                 ret = recv_vis_packet(skb, hard_iface);
661                 break;
662         default:
663                 ret = NET_RX_DROP;
664         }
665
666         if (ret == NET_RX_DROP)
667                 kfree_skb(skb);
668
669         /* return NET_RX_SUCCESS in any case as we
670          * most probably dropped the packet for
671          * routing-logical reasons. */
672
673         return NET_RX_SUCCESS;
674
675 err_free:
676         kfree_skb(skb);
677 err_out:
678         return NET_RX_DROP;
679 }
680
681 struct notifier_block hard_if_notifier = {
682         .notifier_call = hard_if_event,
683 };