Merge tag 'batadv-next-for-davem-20190201' of git://git.open-mesh.org/linux-merge
authorDavid S. Miller <davem@davemloft.net>
Fri, 1 Feb 2019 19:04:13 +0000 (11:04 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 1 Feb 2019 19:04:13 +0000 (11:04 -0800)
Simon Wunderlich says:

====================
This feature/cleanup patchset includes the following patches:

 - bump version strings, by Simon Wunderlich

 - Add DHCPACKs for DAT snooping, by Linus Luessing

 - Update copyright years for 2019, by Sven Eckelmann
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
63 files changed:
include/uapi/linux/batadv_packet.h
include/uapi/linux/batman_adv.h
net/batman-adv/Kconfig
net/batman-adv/Makefile
net/batman-adv/bat_algo.c
net/batman-adv/bat_algo.h
net/batman-adv/bat_iv_ogm.c
net/batman-adv/bat_iv_ogm.h
net/batman-adv/bat_v.c
net/batman-adv/bat_v.h
net/batman-adv/bat_v_elp.c
net/batman-adv/bat_v_elp.h
net/batman-adv/bat_v_ogm.c
net/batman-adv/bat_v_ogm.h
net/batman-adv/bitarray.c
net/batman-adv/bitarray.h
net/batman-adv/bridge_loop_avoidance.c
net/batman-adv/bridge_loop_avoidance.h
net/batman-adv/debugfs.c
net/batman-adv/debugfs.h
net/batman-adv/distributed-arp-table.c
net/batman-adv/distributed-arp-table.h
net/batman-adv/fragmentation.c
net/batman-adv/fragmentation.h
net/batman-adv/gateway_client.c
net/batman-adv/gateway_client.h
net/batman-adv/gateway_common.c
net/batman-adv/gateway_common.h
net/batman-adv/hard-interface.c
net/batman-adv/hard-interface.h
net/batman-adv/hash.c
net/batman-adv/hash.h
net/batman-adv/icmp_socket.c
net/batman-adv/icmp_socket.h
net/batman-adv/log.c
net/batman-adv/log.h
net/batman-adv/main.c
net/batman-adv/main.h
net/batman-adv/multicast.c
net/batman-adv/multicast.h
net/batman-adv/netlink.c
net/batman-adv/netlink.h
net/batman-adv/network-coding.c
net/batman-adv/network-coding.h
net/batman-adv/originator.c
net/batman-adv/originator.h
net/batman-adv/routing.c
net/batman-adv/routing.h
net/batman-adv/send.c
net/batman-adv/send.h
net/batman-adv/soft-interface.c
net/batman-adv/soft-interface.h
net/batman-adv/sysfs.c
net/batman-adv/sysfs.h
net/batman-adv/tp_meter.c
net/batman-adv/tp_meter.h
net/batman-adv/trace.c
net/batman-adv/trace.h
net/batman-adv/translation-table.c
net/batman-adv/translation-table.h
net/batman-adv/tvlv.c
net/batman-adv/tvlv.h
net/batman-adv/types.h

index 894d8d2f713d96502872c6c1db839e1801793583..7eb2936a8e221adb48807088cefbd9e4469bd7ff 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 324a0e1143e7b8a303f6520ccff1a6654ec0d2d1..a28e76a7e0a2b1d87b1d56c8de643d6c0c863667 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: MIT */
-/* Copyright (C) 2016-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2016-2019  B.A.T.M.A.N. contributors:
  *
  * Matthias Schiffer
  *
index c386e69814169306ed31c9692f624b3b641f6fa1..a31db5e9ac8e7186cccc49b186364c5d781bd8f2 100644 (file)
@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
-# Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+# Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
 #
 # Marek Lindner, Simon Wunderlich
 #
index 9b58160fe485a6548bcfe58080852bef9df96585..a887ecc3efa124d6728859493510bb612323915a 100644 (file)
@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
-# Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+# Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
 #
 # Marek Lindner, Simon Wunderlich
 #
index ea309ad0617502a436b4b1874bbb871d051b25b2..7b7e15641fef4d1f12f7fd71753c8038e868b196 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 534b790c3753d40cc1e18fa36465a318553a944e..25e7bb51928ccabd3e7aa0f5b31278556aed717a 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2011-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Linus Lüssing
  *
index f97e566f0402ba3702abc878ae9935385d8e7eef..de61091af6668734709ab5fc46a40358eff54b82 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 3dc6a7a43eb71dbdd40701602bc2f44a6854e06e..785f6666273c58cfc628b3bf000171a654b892ad 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 90e33f84d37ab83733abfcd394f14825e86fd34f..445594ed58afe55ef8284509b6ac856ba0604745 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2013-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2013-2019  B.A.T.M.A.N. contributors:
  *
  * Linus Lüssing, Marek Lindner
  *
index ec4a2a569750c48d7c302a2153f3bb49fb074dea..465a4fc23354753cf58a08e3fab237b3a903fd3a 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2011-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Linus Lüssing
  *
index e8090f099eb805626ffaa1445d3d0f8254f6c9a7..7b80f6f8d4dcd501c0e753513fea9c56cd1782cf 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2011-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2019  B.A.T.M.A.N. contributors:
  *
  * Linus Lüssing, Marek Lindner
  *
index e8c7b7fd290d7495e0daf0edca654bd4b06e05a3..75f189ee4a1c5bea61aa4471292042937652e5ff 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2013-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2013-2019  B.A.T.M.A.N. contributors:
  *
  * Linus Lüssing, Marek Lindner
  *
index 2948b41b06d47c0ee32649fa410b323f39c36151..c9698ad41854cf4dd5ef2cd773d5dd239f457fa3 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2013-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2013-2019  B.A.T.M.A.N. contributors:
  *
  * Antonio Quartulli
  *
index e5be14c908c663baa5ccfd8d4426ff85e1e61627..f67cf7ee06b281110811abc149d741be8968437d 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2013-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2013-2019  B.A.T.M.A.N. contributors:
  *
  * Antonio Quartulli
  *
index a296a4d851f5130dc24fa8e5fc324e4c6411fc8c..63e134e763e311f8edb030a77c9ead48d5e232d5 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2006-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2006-2019  B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
index 48f6832895318ee2ec43745314cb7ef3aeda4fbe..f3a05ad9afad9b07a3d05ed097f5ee37eb35e34a 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2006-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2006-2019  B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
index 5fdde29478022ecd73a50de51bb672283ad48832..ef39aabdb69435f384ae2ebef26d4d31367f427c 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2011-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2019  B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich
  *
index 71f95a3e4d3f335890408685432f18e5d7411a76..31771c751efb84009c7816b1ad3b02f88fe001f2 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2011-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2019  B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich
  *
index d4a7702e48d8eddc76684a62c858acde0a8a480b..3b9d1ad2f467dd12226adf6e12b709a9906fd865 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2010-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 8de018e5c577e22903dcd7b1a005d4ca3b3d5416..c0b8694041ece9397900506814304fac673a4f7e 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2010-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index b9ffe1826527e01cd49ecfe3d45d4d1fec97e0f4..899ab051ffcefed1892af816c40fc722e97a3186 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2011-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2019  B.A.T.M.A.N. contributors:
  *
  * Antonio Quartulli
  *
@@ -19,6 +19,7 @@
 #include "distributed-arp-table.h"
 #include "main.h"
 
+#include <asm/unaligned.h>
 #include <linux/atomic.h>
 #include <linux/bitops.h>
 #include <linux/byteorder/generic.h>
@@ -29,6 +30,7 @@
 #include <linux/if_ether.h>
 #include <linux/if_vlan.h>
 #include <linux/in.h>
+#include <linux/ip.h>
 #include <linux/jiffies.h>
 #include <linux/kernel.h>
 #include <linux/kref.h>
@@ -42,6 +44,7 @@
 #include <linux/spinlock.h>
 #include <linux/stddef.h>
 #include <linux/string.h>
+#include <linux/udp.h>
 #include <linux/workqueue.h>
 #include <net/arp.h>
 #include <net/genetlink.h>
 #include "translation-table.h"
 #include "tvlv.h"
 
+enum batadv_bootpop {
+       BATADV_BOOTREPLY        = 2,
+};
+
+enum batadv_boothtype {
+       BATADV_HTYPE_ETHERNET   = 1,
+};
+
+enum batadv_dhcpoptioncode {
+       BATADV_DHCP_OPT_PAD             = 0,
+       BATADV_DHCP_OPT_MSG_TYPE        = 53,
+       BATADV_DHCP_OPT_END             = 255,
+};
+
+enum batadv_dhcptype {
+       BATADV_DHCPACK          = 5,
+};
+
+/* { 99, 130, 83, 99 } */
+#define BATADV_DHCP_MAGIC 1669485411
+
+struct batadv_dhcp_packet {
+       __u8 op;
+       __u8 htype;
+       __u8 hlen;
+       __u8 hops;
+       __be32 xid;
+       __be16 secs;
+       __be16 flags;
+       __be32 ciaddr;
+       __be32 yiaddr;
+       __be32 siaddr;
+       __be32 giaddr;
+       __u8 chaddr[16];
+       __u8 sname[64];
+       __u8 file[128];
+       __be32 magic;
+       __u8 options[0];
+};
+
+#define BATADV_DHCP_YIADDR_LEN sizeof(((struct batadv_dhcp_packet *)0)->yiaddr)
+#define BATADV_DHCP_CHADDR_LEN sizeof(((struct batadv_dhcp_packet *)0)->chaddr)
+
 static void batadv_dat_purge(struct work_struct *work);
 
 /**
@@ -1439,6 +1485,359 @@ out:
        return dropped;
 }
 
+/**
+ * batadv_dat_check_dhcp_ipudp() - check skb for IP+UDP headers valid for DHCP
+ * @skb: the packet to check
+ * @ip_src: a buffer to store the IPv4 source address in
+ *
+ * Checks whether the given skb has an IP and UDP header valid for a DHCP
+ * message from a DHCP server. And if so, stores the IPv4 source address in
+ * the provided buffer.
+ *
+ * Return: True if valid, false otherwise.
+ */
+static bool
+batadv_dat_check_dhcp_ipudp(struct sk_buff *skb, __be32 *ip_src)
+{
+       unsigned int offset = skb_network_offset(skb);
+       struct udphdr *udphdr, _udphdr;
+       struct iphdr *iphdr, _iphdr;
+
+       iphdr = skb_header_pointer(skb, offset, sizeof(_iphdr), &_iphdr);
+       if (!iphdr || iphdr->version != 4 || iphdr->ihl * 4 < sizeof(_iphdr))
+               return false;
+
+       if (iphdr->protocol != IPPROTO_UDP)
+               return false;
+
+       offset += iphdr->ihl * 4;
+       skb_set_transport_header(skb, offset);
+
+       udphdr = skb_header_pointer(skb, offset, sizeof(_udphdr), &_udphdr);
+       if (!udphdr || udphdr->source != htons(67))
+               return false;
+
+       *ip_src = get_unaligned(&iphdr->saddr);
+
+       return true;
+}
+
+/**
+ * batadv_dat_check_dhcp() - examine packet for valid DHCP message
+ * @skb: the packet to check
+ * @proto: ethernet protocol hint (behind a potential vlan)
+ * @ip_src: a buffer to store the IPv4 source address in
+ *
+ * Checks whether the given skb is a valid DHCP packet. And if so, stores the
+ * IPv4 source address in the provided buffer.
+ *
+ * Caller needs to ensure that the skb network header is set correctly.
+ *
+ * Return: If skb is a valid DHCP packet, then returns its op code
+ * (e.g. BOOTREPLY vs. BOOTREQUEST). Otherwise returns -EINVAL.
+ */
+static int
+batadv_dat_check_dhcp(struct sk_buff *skb, __be16 proto, __be32 *ip_src)
+{
+       __be32 *magic, _magic;
+       unsigned int offset;
+       struct {
+               __u8 op;
+               __u8 htype;
+               __u8 hlen;
+               __u8 hops;
+       } *dhcp_h, _dhcp_h;
+
+       if (proto != htons(ETH_P_IP))
+               return -EINVAL;
+
+       if (!batadv_dat_check_dhcp_ipudp(skb, ip_src))
+               return -EINVAL;
+
+       offset = skb_transport_offset(skb) + sizeof(struct udphdr);
+       if (skb->len < offset + sizeof(struct batadv_dhcp_packet))
+               return -EINVAL;
+
+       dhcp_h = skb_header_pointer(skb, offset, sizeof(_dhcp_h), &_dhcp_h);
+       if (!dhcp_h || dhcp_h->htype != BATADV_HTYPE_ETHERNET ||
+           dhcp_h->hlen != ETH_ALEN)
+               return -EINVAL;
+
+       offset += offsetof(struct batadv_dhcp_packet, magic);
+
+       magic = skb_header_pointer(skb, offset, sizeof(_magic), &_magic);
+       if (!magic || get_unaligned(magic) != htonl(BATADV_DHCP_MAGIC))
+               return -EINVAL;
+
+       return dhcp_h->op;
+}
+
+/**
+ * batadv_dat_get_dhcp_message_type() - get message type of a DHCP packet
+ * @skb: the DHCP packet to parse
+ *
+ * Iterates over the DHCP options of the given DHCP packet to find a
+ * DHCP Message Type option and parse it.
+ *
+ * Caller needs to ensure that the given skb is a valid DHCP packet and
+ * that the skb transport header is set correctly.
+ *
+ * Return: The found DHCP message type value, if found. -EINVAL otherwise.
+ */
+static int batadv_dat_get_dhcp_message_type(struct sk_buff *skb)
+{
+       unsigned int offset = skb_transport_offset(skb) + sizeof(struct udphdr);
+       u8 *type, _type;
+       struct {
+               u8 type;
+               u8 len;
+       } *tl, _tl;
+
+       offset += sizeof(struct batadv_dhcp_packet);
+
+       while ((tl = skb_header_pointer(skb, offset, sizeof(_tl), &_tl))) {
+               if (tl->type == BATADV_DHCP_OPT_MSG_TYPE)
+                       break;
+
+               if (tl->type == BATADV_DHCP_OPT_END)
+                       break;
+
+               if (tl->type == BATADV_DHCP_OPT_PAD)
+                       offset++;
+               else
+                       offset += tl->len + sizeof(_tl);
+       }
+
+       /* Option Overload Code not supported */
+       if (!tl || tl->type != BATADV_DHCP_OPT_MSG_TYPE ||
+           tl->len != sizeof(_type))
+               return -EINVAL;
+
+       offset += sizeof(_tl);
+
+       type = skb_header_pointer(skb, offset, sizeof(_type), &_type);
+       if (!type)
+               return -EINVAL;
+
+       return *type;
+}
+
+/**
+ * batadv_dat_get_dhcp_yiaddr() - get yiaddr from a DHCP packet
+ * @skb: the DHCP packet to parse
+ * @buf: a buffer to store the yiaddr in
+ *
+ * Caller needs to ensure that the given skb is a valid DHCP packet and
+ * that the skb transport header is set correctly.
+ *
+ * Return: True on success, false otherwise.
+ */
+static bool batadv_dat_dhcp_get_yiaddr(struct sk_buff *skb, __be32 *buf)
+{
+       unsigned int offset = skb_transport_offset(skb) + sizeof(struct udphdr);
+       __be32 *yiaddr;
+
+       offset += offsetof(struct batadv_dhcp_packet, yiaddr);
+       yiaddr = skb_header_pointer(skb, offset, BATADV_DHCP_YIADDR_LEN, buf);
+
+       if (!yiaddr)
+               return false;
+
+       if (yiaddr != buf)
+               *buf = get_unaligned(yiaddr);
+
+       return true;
+}
+
+/**
+ * batadv_dat_get_dhcp_chaddr() - get chaddr from a DHCP packet
+ * @skb: the DHCP packet to parse
+ * @buf: a buffer to store the chaddr in
+ *
+ * Caller needs to ensure that the given skb is a valid DHCP packet and
+ * that the skb transport header is set correctly.
+ *
+ * Return: True on success, false otherwise
+ */
+static bool batadv_dat_get_dhcp_chaddr(struct sk_buff *skb, u8 *buf)
+{
+       unsigned int offset = skb_transport_offset(skb) + sizeof(struct udphdr);
+       u8 *chaddr;
+
+       offset += offsetof(struct batadv_dhcp_packet, chaddr);
+       chaddr = skb_header_pointer(skb, offset, BATADV_DHCP_CHADDR_LEN, buf);
+
+       if (!chaddr)
+               return false;
+
+       if (chaddr != buf)
+               memcpy(buf, chaddr, BATADV_DHCP_CHADDR_LEN);
+
+       return true;
+}
+
+/**
+ * batadv_dat_put_dhcp() - puts addresses from a DHCP packet into the DHT and
+ *  DAT cache
+ * @bat_priv: the bat priv with all the soft interface information
+ * @chaddr: the DHCP client MAC address
+ * @yiaddr: the DHCP client IP address
+ * @hw_dst: the DHCP server MAC address
+ * @ip_dst: the DHCP server IP address
+ * @vid: VLAN identifier
+ *
+ * Adds given MAC/IP pairs to the local DAT cache and propagates them further
+ * into the DHT.
+ *
+ * For the DHT propagation, client MAC + IP will appear as the ARP Reply
+ * transmitter (and hw_dst/ip_dst as the target).
+ */
+static void batadv_dat_put_dhcp(struct batadv_priv *bat_priv, u8 *chaddr,
+                               __be32 yiaddr, u8 *hw_dst, __be32 ip_dst,
+                               unsigned short vid)
+{
+       struct sk_buff *skb;
+
+       skb = batadv_dat_arp_create_reply(bat_priv, yiaddr, ip_dst, chaddr,
+                                         hw_dst, vid);
+       if (!skb)
+               return;
+
+       skb_set_network_header(skb, ETH_HLEN);
+
+       batadv_dat_entry_add(bat_priv, yiaddr, chaddr, vid);
+       batadv_dat_entry_add(bat_priv, ip_dst, hw_dst, vid);
+
+       batadv_dat_send_data(bat_priv, skb, yiaddr, vid, BATADV_P_DAT_DHT_PUT);
+       batadv_dat_send_data(bat_priv, skb, ip_dst, vid, BATADV_P_DAT_DHT_PUT);
+
+       batadv_dbg(BATADV_DBG_DAT, bat_priv,
+                  "Snooped from outgoing DHCPACK (server address): %pI4, %pM (vid: %i)\n",
+                  &ip_dst, hw_dst, batadv_print_vid(vid));
+       batadv_dbg(BATADV_DBG_DAT, bat_priv,
+                  "Snooped from outgoing DHCPACK (client address): %pI4, %pM (vid: %i)\n",
+                  &yiaddr, chaddr, batadv_print_vid(vid));
+}
+
+/**
+ * batadv_dat_check_dhcp_ack() - examine packet for valid DHCP message
+ * @skb: the packet to check
+ * @proto: ethernet protocol hint (behind a potential vlan)
+ * @ip_src: a buffer to store the IPv4 source address in
+ * @chaddr: a buffer to store the DHCP Client Hardware Address in
+ * @yiaddr: a buffer to store the DHCP Your IP Address in
+ *
+ * Checks whether the given skb is a valid DHCPACK. And if so, stores the
+ * IPv4 server source address (ip_src), client MAC address (chaddr) and client
+ * IPv4 address (yiaddr) in the provided buffers.
+ *
+ * Caller needs to ensure that the skb network header is set correctly.
+ *
+ * Return: True if the skb is a valid DHCPACK. False otherwise.
+ */
+static bool
+batadv_dat_check_dhcp_ack(struct sk_buff *skb, __be16 proto, __be32 *ip_src,
+                         u8 *chaddr, __be32 *yiaddr)
+{
+       int type;
+
+       type = batadv_dat_check_dhcp(skb, proto, ip_src);
+       if (type != BATADV_BOOTREPLY)
+               return false;
+
+       type = batadv_dat_get_dhcp_message_type(skb);
+       if (type != BATADV_DHCPACK)
+               return false;
+
+       if (!batadv_dat_dhcp_get_yiaddr(skb, yiaddr))
+               return false;
+
+       if (!batadv_dat_get_dhcp_chaddr(skb, chaddr))
+               return false;
+
+       return true;
+}
+
+/**
+ * batadv_dat_snoop_outgoing_dhcp_ack() - snoop DHCPACK and fill DAT with it
+ * @bat_priv: the bat priv with all the soft interface information
+ * @skb: the packet to snoop
+ * @proto: ethernet protocol hint (behind a potential vlan)
+ * @vid: VLAN identifier
+ *
+ * This function first checks whether the given skb is a valid DHCPACK. If
+ * so then its source MAC and IP as well as its DHCP Client Hardware Address
+ * field and DHCP Your IP Address field are added to the local DAT cache and
+ * propagated into the DHT.
+ *
+ * Caller needs to ensure that the skb mac and network headers are set
+ * correctly.
+ */
+void batadv_dat_snoop_outgoing_dhcp_ack(struct batadv_priv *bat_priv,
+                                       struct sk_buff *skb,
+                                       __be16 proto,
+                                       unsigned short vid)
+{
+       u8 chaddr[BATADV_DHCP_CHADDR_LEN];
+       __be32 ip_src, yiaddr;
+
+       if (!atomic_read(&bat_priv->distributed_arp_table))
+               return;
+
+       if (!batadv_dat_check_dhcp_ack(skb, proto, &ip_src, chaddr, &yiaddr))
+               return;
+
+       batadv_dat_put_dhcp(bat_priv, chaddr, yiaddr, eth_hdr(skb)->h_source,
+                           ip_src, vid);
+}
+
+/**
+ * batadv_dat_snoop_incoming_dhcp_ack() - snoop DHCPACK and fill DAT cache
+ * @bat_priv: the bat priv with all the soft interface information
+ * @skb: the packet to snoop
+ * @hdr_size: header size, up to the tail of the batman-adv header
+ *
+ * This function first checks whether the given skb is a valid DHCPACK. If
+ * so then its source MAC and IP as well as its DHCP Client Hardware Address
+ * field and DHCP Your IP Address field are added to the local DAT cache.
+ */
+void batadv_dat_snoop_incoming_dhcp_ack(struct batadv_priv *bat_priv,
+                                       struct sk_buff *skb, int hdr_size)
+{
+       u8 chaddr[BATADV_DHCP_CHADDR_LEN];
+       struct ethhdr *ethhdr;
+       __be32 ip_src, yiaddr;
+       unsigned short vid;
+       __be16 proto;
+       u8 *hw_src;
+
+       if (!atomic_read(&bat_priv->distributed_arp_table))
+               return;
+
+       if (unlikely(!pskb_may_pull(skb, hdr_size + ETH_HLEN)))
+               return;
+
+       ethhdr = (struct ethhdr *)(skb->data + hdr_size);
+       skb_set_network_header(skb, hdr_size + ETH_HLEN);
+       proto = ethhdr->h_proto;
+
+       if (!batadv_dat_check_dhcp_ack(skb, proto, &ip_src, chaddr, &yiaddr))
+               return;
+
+       hw_src = ethhdr->h_source;
+       vid = batadv_dat_get_vid(skb, &hdr_size);
+
+       batadv_dat_entry_add(bat_priv, yiaddr, chaddr, vid);
+       batadv_dat_entry_add(bat_priv, ip_src, hw_src, vid);
+
+       batadv_dbg(BATADV_DBG_DAT, bat_priv,
+                  "Snooped from incoming DHCPACK (server address): %pI4, %pM (vid: %i)\n",
+                  &ip_src, hw_src, batadv_print_vid(vid));
+       batadv_dbg(BATADV_DBG_DAT, bat_priv,
+                  "Snooped from incoming DHCPACK (client address): %pI4, %pM (vid: %i)\n",
+                  &yiaddr, chaddr, batadv_print_vid(vid));
+}
+
 /**
  * batadv_dat_drop_broadcast_packet() - check if an ARP request has to be
  *  dropped (because the node has already obtained the reply via DAT) or not
index a045960283375406b9a093b8c18a6f6c3882e814..68c0ff321acde30eb6bb162d80bb4918771cb00a 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2011-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2011-2019  B.A.T.M.A.N. contributors:
  *
  * Antonio Quartulli
  *
@@ -46,6 +46,12 @@ void batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv,
                                         struct sk_buff *skb);
 bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
                                         struct sk_buff *skb, int hdr_size);
+void batadv_dat_snoop_outgoing_dhcp_ack(struct batadv_priv *bat_priv,
+                                       struct sk_buff *skb,
+                                       __be16 proto,
+                                       unsigned short vid);
+void batadv_dat_snoop_incoming_dhcp_ack(struct batadv_priv *bat_priv,
+                                       struct sk_buff *skb, int hdr_size);
 bool batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv,
                                      struct batadv_forw_packet *forw_packet);
 
@@ -140,6 +146,19 @@ batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
        return false;
 }
 
+static inline void
+batadv_dat_snoop_outgoing_dhcp_ack(struct batadv_priv *bat_priv,
+                                  struct sk_buff *skb, __be16 proto,
+                                  unsigned short vid)
+{
+}
+
+static inline void
+batadv_dat_snoop_incoming_dhcp_ack(struct batadv_priv *bat_priv,
+                                  struct sk_buff *skb, int hdr_size)
+{
+}
+
 static inline bool
 batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv,
                                 struct batadv_forw_packet *forw_packet)
index 5b71a289d04fc80de6c20e7a24d621727c77825a..b506d15b823032fb051ab96d49a37b39c5f27074 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2013-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2013-2019  B.A.T.M.A.N. contributors:
  *
  * Martin Hundebøll <martin@hundeboll.net>
  *
index 944512e0778290c3539193b262c83e4bebc19754..abdac26579bfb7fc0d9563bea22fcb9f04bc5323 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2013-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2013-2019  B.A.T.M.A.N. contributors:
  *
  * Martin Hundebøll <martin@hundeboll.net>
  *
index 9d8e5eda2314119f1ba4118587ffc29d792fc8e0..0a6b9b30eabd19d320feee8fe1bd2223aa71a06a 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2009-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2009-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index f0b86fcb249386b746d77f1abaefadc62d222b8c..b5732c8be81a30d9eb0573c48eaf03ca58410cb0 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2009-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2009-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 936c107f31991215d332bff6a7b9f7897f1089c1..53d03adc9bfc2b13543d9ca6028c5846fb4e07ba 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2009-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2009-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 80afb2793687317f7d6f0e8a8563b9808e6cbdb8..89bae100a0b0d9d0ad075cedb135bcb70ebf5c20 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2009-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2009-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 508f4416dfc9154494888adb5b76efa62673eeaa..28c1fb8d1af0c3d8188bbda7a70ebdbc1993cd84 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index d1c0f61893016b9a12fa81ba1d2de68172cbca96..48de28c8340150fad752f49334a67c4d25bc0f27 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 9194f4d891b1263c48f7442824c55095b56576c0..56a08ce193d507b856828756fb3fc54c72efca0b 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2006-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2006-2019  B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
index 0e36fa1c7c3eccdd33f8ede8ddac0780c3f8039e..37507b6d40068aa4f5f0fa2ebee3a497a45487ff 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2006-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2006-2019  B.A.T.M.A.N. contributors:
  *
  * Simon Wunderlich, Marek Lindner
  *
index 6d5859714f52ba453f10055598074ceca25c1323..9859ababb82e3d7863ddf3faf1e4c2c1eb757d01 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 958be22beda9f460699a9a4633ef84c378edb621..5f8926522ff0d74e4482b927810aab407158cb7a 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 75f602e1ce94ecf3b2aa570939bd4444185b3ce2..3e610df8debfb2e7dd13b89101a07861c60b1de6 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2010-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 35f4f397ed57dd351ca2eb4135ddaffd84235d61..660e9bcc85a289295b3ab095f4dc4061e45101e1 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index d1ed839fd32bb9c42c1954e1c8396d5c8e6e21bc..75750870cf048e6beb39fdf311883449a9c73731 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index b572066325e4f30b4a5a37d13a513b36c4145a94..3ed669d7dc6ba93c04eefd1dc2ba38766ccd7ea2 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -25,7 +25,7 @@
 #define BATADV_DRIVER_DEVICE "batman-adv"
 
 #ifndef BATADV_SOURCE_VERSION
-#define BATADV_SOURCE_VERSION "2019.0"
+#define BATADV_SOURCE_VERSION "2019.1"
 #endif
 
 /* B.A.T.M.A.N. parameters */
index 1dd70f048e7b5c4f65f7f9d42038b53b31f64ae2..f91b1b6265cfea6d0f4d056defe30eeed452270e 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2014-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2014-2019  B.A.T.M.A.N. contributors:
  *
  * Linus Lüssing
  *
index 3b04ab13f0eb1044454315c04e75a22ce4351afd..466013fe88af50e9298e4e445d8f31147420f5c5 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2014-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2014-2019  B.A.T.M.A.N. contributors:
  *
  * Linus Lüssing
  *
index 2dc3304cee54be2ee1cf3da14ad501e3ad6297a6..5fe833cc950791f2ee5d1cfcaddbdbc9fab85057 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2016-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2016-2019  B.A.T.M.A.N. contributors:
  *
  * Matthias Schiffer
  *
index 571d9a5ae7aaaf043629949fae141fd2f4511cee..216484b8b82d76630dc906cced00f6d422fdc5b5 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2016-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2016-2019  B.A.T.M.A.N. contributors:
  *
  * Matthias Schiffer
  *
index 34caf129a9bf5531360f798be6a7059bad26a50f..278762bd94c65d82d5c5e4363a8d82a9d60c4924 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2012-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2012-2019  B.A.T.M.A.N. contributors:
  *
  * Martin Hundebøll, Jeppe Ledet-Pedersen
  *
index 65c346812bc11e7b9c32698ab50b435c321743d0..96ef0a511fc7b4913e23a08da01e0a887e2049dc 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2012-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2012-2019  B.A.T.M.A.N. contributors:
  *
  * Martin Hundebøll, Jeppe Ledet-Pedersen
  *
index 56a981af5c928fe7c160dad67c267d681395c3b5..e5cdf89ef63c292d8f6c3f797702bf4cf6c3f450 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2009-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2009-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index a8b4c7b667ecfc713203e14d89110a9fba2fe265..dca1e4a34ec6c96b6e7a8265a943fa354473f5d3 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index cc3ed93a6d513dffd4711cac50545d65ef7d640e..cae0e5dd0768bdc4241915b8e2ed09b096caba14 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -1043,6 +1043,8 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
                                                        hdr_size))
                        goto rx_success;
 
+               batadv_dat_snoop_incoming_dhcp_ack(bat_priv, skb, hdr_size);
+
                batadv_interface_rx(recv_if->soft_iface, skb, hdr_size,
                                    orig_node);
 
@@ -1278,6 +1280,8 @@ int batadv_recv_bcast_packet(struct sk_buff *skb,
        if (batadv_dat_snoop_incoming_arp_reply(bat_priv, skb, hdr_size))
                goto rx_success;
 
+       batadv_dat_snoop_incoming_dhcp_ack(bat_priv, skb, hdr_size);
+
        /* broadcast for me */
        batadv_interface_rx(recv_if->soft_iface, skb, hdr_size, orig_node);
 
index db54c2d9b8bfb7bf45cdc7e4f5cff6429c6ff7d7..0102d69d345cf5737fde69793e4d52a47ac89ded 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 4a35f5c2f52ba60d57f564daba05de5c2829ee5b..66a8b3e445012248a9ffcb8f635b74dac10f0190 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 64cce07b8fe62da8c36898a9259816d3353c504b..1f6132922e6061793a76de6b89f2d872ab1dc131 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index 5db5a0a4c959b796c86315832f64073b5642e46a..b14fb3462af73cf2118430cffe8998df5cbf46e4 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -212,6 +212,7 @@ static netdev_tx_t batadv_interface_tx(struct sk_buff *skb,
        enum batadv_forw_mode forw_mode;
        struct batadv_orig_node *mcast_single_orig = NULL;
        int network_offset = ETH_HLEN;
+       __be16 proto;
 
        if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
                goto dropped;
@@ -223,12 +224,15 @@ static netdev_tx_t batadv_interface_tx(struct sk_buff *skb,
        vid = batadv_get_vid(skb, 0);
        ethhdr = eth_hdr(skb);
 
-       switch (ntohs(ethhdr->h_proto)) {
+       proto = ethhdr->h_proto;
+
+       switch (ntohs(proto)) {
        case ETH_P_8021Q:
                vhdr = vlan_eth_hdr(skb);
+               proto = vhdr->h_vlan_encapsulated_proto;
 
                /* drop batman-in-batman packets to prevent loops */
-               if (vhdr->h_vlan_encapsulated_proto != htons(ETH_P_BATMAN)) {
+               if (proto != htons(ETH_P_BATMAN)) {
                        network_offset += VLAN_HLEN;
                        break;
                }
@@ -256,6 +260,9 @@ static netdev_tx_t batadv_interface_tx(struct sk_buff *skb,
                        goto dropped;
        }
 
+       /* Snoop address candidates from DHCPACKs for early DAT filling */
+       batadv_dat_snoop_outgoing_dhcp_ack(bat_priv, skb, proto, vid);
+
        /* don't accept stp packets. STP does not help in meshes.
         * better use the bridge loop avoidance ...
         *
index daf87f07fadd8e8a4d82d35a0d268bc9c3f2d3c3..538bb661878cdd1115d8670925246110d85b46ef 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 09427fc6494a157554d8b19f3481a878a9f97bba..e1b816262c53b615ed56c4277027bf4ffdd11bc1 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2010-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index c1e3fb69952df67dde8c13977544926a27e62767..705ffbe763f47968e3649b871728b71b0eeed908 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2010-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner
  *
index 11520de96ccb1a87183e9666066e21731538ccd9..500109bbd551314317d8982a419b3388dd872e28 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2012-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2012-2019  B.A.T.M.A.N. contributors:
  *
  * Edo Monticelli, Antonio Quartulli
  *
index 68e600974759a9b005062b1689f91e0dbffb1b30..6b4d0f733896ac47210c360157aa1590d6337c9f 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2012-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2012-2019  B.A.T.M.A.N. contributors:
  *
  * Edo Monticelli, Antonio Quartulli
  *
index 8e1024217cff00e1ecb8c73e4bda91737fad5a4b..f77c917ed20d175b7d95e4c60c7f49d7bf3a3b12 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2010-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2019  B.A.T.M.A.N. contributors:
  *
  * Sven Eckelmann
  *
index 104784be94d7e413b44e95b71ef6a1aa1c46f222..5e55790514008d949abd6b57f1ec25b4c61892c2 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2010-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2010-2019  B.A.T.M.A.N. contributors:
  *
  * Sven Eckelmann
  *
index 8dcd4968cde774f806ee4883b6d9734552d23ece..f73d79139ae79834a3e429fab82b7d55e8a373d5 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich, Antonio Quartulli
  *
index 01b6c8eafaf91322944265233946619fda673381..61bca75e5911a0214a64913aabf09a62a0eecd3f 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich, Antonio Quartulli
  *
index 40e69c9346d22c09481544b8b4dec56cad88b64a..7e947b01919d8324ce22d9d52708d2e538a0c978 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index ef5867f49824feaa0786843a46cac9f952444380..c0f033b1acb8829e25c83cf7861e0e894747e88d 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
index cbe17da36fcbe2691eb9996bdb5ddade807ff927..a21b34ed6548f4017ce3bf58949f2d758a9c84a8 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *