mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-15 00:34:10 +08:00
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 -----BEGIN PGP SIGNATURE----- iQJKBAABCgA0FiEE1ilQI7G+y+fdhnrfoSvjmEKSnqEFAlxUKp8WHHN3QHNpbW9u d3VuZGVybGljaC5kZQAKCRChK+OYQpKeoc1rD/oC39wZl/ZdubJogpGWI3G9SdU8 SxbjnaCVCkLMsLJH/wv/OM9OWwHa2OhvOzmMO5Zq47dy5SYXqBMkvv0QOMJcUQqz 1nPMssTVo9gQLrJiPiP+yXGZ5+sc4dsLCiykFsCs7YRhqeStL1QTZkAOEKfy0K+7 6G5OQsLT62aY+1OWLbb5oJaB9nlhUY+GyuQZ213jNuYxP7I6MyM9FfMHokASMLn8 H58fIvDyGkC0PXvYZiJedlnFBU92TPEnBAV/afJ8egcmYQw9jkWL3cbS5ZzqDG4m 49p9/Xmt2ARsf4UMDxQTEE3elw3tu1PZGPSecTmU+rRzHyYHIIYWnFgTZWmK7/zU TKQMlrPx4ky8HOyIY6/5AHNR7x5muchgxf0ft+4Jf0Bf+rGFIgdqfAIeQliUNAUc IW+HC0c1SEU/519a6z1V/ARrC6W4qk8aBZ0G4zyx+76KLvxlyvgjEo3XNasyNJnY GpHHhpyIeY5xeNOsGmoVrQraJRMqwr4jnWdcmf1LS8o9loB6X7bij8SRKUsEwNi2 AkIK2sojUf6c4YZW/GVqIgvPuGtZL/Sy9FHx7Ve5f1NRuxpcMStSVV+daYqHYEe6 72/WYF+oJc4fCR3zAXc67wVoyuPVPxOKpwh2uJUeVbvdvHZ0+dpOV740ktdFjIWQ 3XAGhl/dSrn7OXYJqA== =G6IW -----END PGP SIGNATURE----- Merge tag 'batadv-next-for-davem-20190201' of git://git.open-mesh.org/linux-merge 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>
This commit is contained in:
commit
d3a5fd3c98
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
#
|
||||
|
@ -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
|
||||
#
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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>
|
||||
@ -60,6 +63,49 @@
|
||||
#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
|
||||
|
@ -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)
|
||||
|
@ -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>
|
||||
*
|
||||
|
@ -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>
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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 ...
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user