From patchwork Thu Feb 25 06:29:33 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andreas Pape X-Patchwork-Id: 15840 X-Patchwork-Delegate: mareklindner@neomailbox.ch Return-Path: X-Original-To: patchwork@open-mesh.org Delivered-To: patchwork@open-mesh.org Received: from open-mesh.org (localhost [127.0.0.1]) by open-mesh.org (Postfix) with ESMTP id E076781882; Thu, 25 Feb 2016 07:29:38 +0100 (CET) Received-SPF: None (no SPF record) identity=mailfrom; client-ip=62.157.123.121; helo=mail2.phoenixcontact.com; envelope-from=apape@phoenixcontact.com; receiver=b.a.t.m.a.n@lists.open-mesh.org Authentication-Results: open-mesh.org; dmarc=none header.from=phoenixcontact.com Received: from mail2.phoenixcontact.com (mail2.phoenixcontact.com [62.157.123.121]) by open-mesh.org (Postfix) with ESMTPS id 65BCB8184C for ; Thu, 25 Feb 2016 07:29:37 +0100 (CET) Received: from localhost.localdomain ([149.208.237.66]) by de-nice01.de.phoenixcontact.com with ESMTP id 2016022507293568-8422 ; Thu, 25 Feb 2016 07:29:35 +0100 From: Andreas Pape To: b.a.t.m.a.n@lists.open-mesh.org X-Mailer: git-send-email 1.7.0.4 X-MIMETrack: Itemize by SMTP Server on DE-NICE01/Hub/SRV/DE/Phoenix Contact at 25.02.2016 07:29:35, Serialize by ntm_grab.EXE on nemex02/spoke/SRV/DE/Phoenix Contact at 25.02.2016 07:29:30, Serialize complete at 25.02.2016 07:29:30, Itemize by ntm_grab.EXE on nemex02/spoke/SRV/DE/Phoenix Contact at 25.02.2016 07:29:30, Serialize by Router on nemex02/spoke/SRV/DE/Phoenix Contact at 25.02.2016 07:29:31, Serialize complete at 25.02.2016 07:29:31 X-TNEFEvaluated: 1 Message-ID: <1456381773-29678-1-git-send-email-apape@phoenixcontact.com> Date: Thu, 25 Feb 2016 07:29:33 +0100 content-transfer-encoding: quoted-printable content-type: text/plain; charset="utf-8" Subject: [B.A.T.M.A.N.] [PATCH 2/7] batman-adv: speed up dat by snooping received ip traffic X-BeenThere: b.a.t.m.a.n@lists.open-mesh.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: The list for a Better Approach To Mobile Ad-hoc Networking List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: The list for a Better Approach To Mobile Ad-hoc Networking Errors-To: b.a.t.m.a.n-bounces@lists.open-mesh.org Sender: "B.A.T.M.A.N" This patch speeds up dat by snooping all incoming ip traffic instead of only relying on ARP handling. This increases especially the propability that a gateway into a backbone network already has a fitting dat entry to answer incoming ARP requests directly coming from the backbone network. Signed-off-by: Andreas Pape --- net/batman-adv/distributed-arp-table.c | 18 ++++++++++++++++++ net/batman-adv/distributed-arp-table.h | 8 +++++++- net/batman-adv/soft-interface.c | 22 +++++++++++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) -- 1.7.0.4 .................................................................. PHOENIX CONTACT ELECTRONICS GmbH Sitz der Gesellschaft / registered office of the company: 31812 Bad Pyrmont USt-Id-Nr.: DE811742156 Amtsgericht Hannover HRB 100528 / district court Hannover HRB 100528 Geschäftsführer / Executive Board: Roland Bent, Dr. Martin Heubeck diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c index aab9548..fe46a3d 100644 --- a/net/batman-adv/distributed-arp-table.c +++ b/net/batman-adv/distributed-arp-table.c @@ -362,6 +362,24 @@ out: batadv_dat_entry_put(dat_entry); } +/** + * batadv_dat_entry_check - check and update a dat entry + * @bat_priv: the bat priv with all the soft interface information + * @ip: ipv4 to add/edit + * @mac_addr: mac address to assign to the given ipv4 + * @vid: VLAN identifier + * + * checks additionally, if dat is enabled. can be called from other modules. + */ +void batadv_dat_entry_check(struct batadv_priv *bat_priv, __be32 ip, + u8 *mac_addr, unsigned short vid) +{ + if (!atomic_read(&bat_priv->distributed_arp_table)) + return; + + batadv_dat_entry_add(bat_priv, ip, mac_addr, vid); +} + #ifdef CONFIG_BATMAN_ADV_DEBUG /** diff --git a/net/batman-adv/distributed-arp-table.h b/net/batman-adv/distributed-arp-table.h index 813ecea..a2ab16b 100644 --- a/net/batman-adv/distributed-arp-table.h +++ b/net/batman-adv/distributed-arp-table.h @@ -80,7 +80,8 @@ batadv_dat_init_own_addr(struct batadv_priv *bat_priv, int batadv_dat_init(struct batadv_priv *bat_priv); void batadv_dat_free(struct batadv_priv *bat_priv); int batadv_dat_cache_seq_print_text(struct seq_file *seq, void *offset); - +void batadv_dat_entry_check(struct batadv_priv *bat_priv, __be32 ip, + u8 *mac_addr, unsigned short vid); /** * batadv_dat_inc_counter - increment the correct DAT packet counter * @bat_priv: the bat priv with all the soft interface information @@ -173,6 +174,11 @@ static inline void batadv_dat_inc_counter(struct batadv_priv *bat_priv, { } +void batadv_dat_entry_check(struct batadv_priv *bat_priv, __be32 ip, + u8 *mac_addr, unsigned short vid) +{ +} + #endif /* CONFIG_BATMAN_ADV_DAT */ #endif /* _NET_BATMAN_ADV_DISTRIBUTED_ARP_TABLE_H_ */ diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c index 0710379..affd370 100644 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -390,6 +391,7 @@ void batadv_interface_rx(struct net_device *soft_iface, __be16 ethertype = htons(ETH_P_BATMAN); struct vlan_ethhdr *vhdr; struct ethhdr *ethhdr; + struct iphdr *iphdr; unsigned short vid; bool is_bcast; @@ -412,11 +414,29 @@ void batadv_interface_rx(struct net_device *soft_iface, ethhdr = eth_hdr(skb); switch (ntohs(ethhdr->h_proto)) { + case ETH_P_IP: + iphdr = (struct iphdr *)(skb->data + ETH_HLEN); + /* snoop incoming traffic for dat update using the source mac + * and source ip to speed up dat. + */ + batadv_dat_entry_check(bat_priv, iphdr->saddr, ethhdr->h_source, + vid); + break; case ETH_P_8021Q: vhdr = (struct vlan_ethhdr *)skb->data; - if (vhdr->h_vlan_encapsulated_proto != ethertype) + if (vhdr->h_vlan_encapsulated_proto != ethertype) { + /* snoop incoming traffic for dat update also for vlan + * tagged frames. + */ + if (vhdr->h_vlan_encapsulated_proto == ETH_P_IP) { + iphdr = (struct iphdr *)(vhdr + + sizeof(struct vlan_ethhdr)); + batadv_dat_entry_check(bat_priv, iphdr->saddr, + vhdr->h_source, vid); + } break; + } /* fall through */ case ETH_P_BATMAN: