The following commit has been merged in the merge/master branch: commit 5dbc980182623f66508ad59d66f1c911f83e4496 Merge: ff6511646a6c127ed472de2f92cfeeeb4fa3d19c cb6070296aed529514f26fec675024390bdca230 Author: Antonio Quartulli antonio@meshcoding.com Date: Wed Jan 8 17:30:51 2014 +0100
Merge commit 'cb6070296aed529514f26fec675024390bdca230' into merge/master
Signed-off-by: Antonio Quartulli antonio@meshcoding.com
Conflicts: net/batman-adv/CHANGELOG net/batman-adv/Makefile.kbuild net/batman-adv/README.external net/batman-adv/compat.c net/batman-adv/compat.h
diff --combined net/batman-adv/Makefile index e595415,42df18f..42df18f --- a/net/batman-adv/Makefile +++ b/net/batman-adv/Makefile @@@ -1,5 -1,5 +1,5 @@@ # - # Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + # Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: # # Marek Lindner, Simon Wunderlich # diff --combined net/batman-adv/bat_algo.h index 92435bf,4e49666..4e49666 --- a/net/batman-adv/bat_algo.h +++ b/net/batman-adv/bat_algo.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2011-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2011-2014 B.A.T.M.A.N. contributors: * * Marek Lindner * diff --combined net/batman-adv/bat_iv_ogm.c index fb196a0,921ac20..921ac20 --- a/net/batman-adv/bat_iv_ogm.c +++ b/net/batman-adv/bat_iv_ogm.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich * diff --combined net/batman-adv/bitarray.c index 89d3a5b,9586750..9586750 --- a/net/batman-adv/bitarray.c +++ b/net/batman-adv/bitarray.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2006-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2006-2014 B.A.T.M.A.N. contributors: * * Simon Wunderlich, Marek Lindner * diff --combined net/batman-adv/bitarray.h index 685e0af,cc24073..cc24073 --- a/net/batman-adv/bitarray.h +++ b/net/batman-adv/bitarray.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2006-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2006-2014 B.A.T.M.A.N. contributors: * * Simon Wunderlich, Marek Lindner * diff --combined net/batman-adv/bridge_loop_avoidance.c index b164a07,5c0eda4..5c0eda4 --- a/net/batman-adv/bridge_loop_avoidance.c +++ b/net/batman-adv/bridge_loop_avoidance.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2011-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2011-2014 B.A.T.M.A.N. contributors: * * Simon Wunderlich * diff --combined net/batman-adv/bridge_loop_avoidance.h index 377dae0,43c985d..43c985d --- a/net/batman-adv/bridge_loop_avoidance.h +++ b/net/batman-adv/bridge_loop_avoidance.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2011-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2011-2014 B.A.T.M.A.N. contributors: * * Simon Wunderlich * diff --combined net/batman-adv/debugfs.c index 26cbf34,b758881..b758881 --- a/net/batman-adv/debugfs.c +++ b/net/batman-adv/debugfs.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2010-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2010-2014 B.A.T.M.A.N. contributors: * * Marek Lindner * diff --combined net/batman-adv/debugfs.h index 981794f,37c4d6d..37c4d6d --- a/net/batman-adv/debugfs.h +++ b/net/batman-adv/debugfs.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2010-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2010-2014 B.A.T.M.A.N. contributors: * * Marek Lindner * diff --combined net/batman-adv/distributed-arp-table.c index 1d214cd,edee504..edee504 --- a/net/batman-adv/distributed-arp-table.c +++ b/net/batman-adv/distributed-arp-table.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2011-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2011-2014 B.A.T.M.A.N. contributors: * * Antonio Quartulli * diff --combined net/batman-adv/distributed-arp-table.h index afa13ca,ac9be9b..ac9be9b --- a/net/batman-adv/distributed-arp-table.h +++ b/net/batman-adv/distributed-arp-table.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2011-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2011-2014 B.A.T.M.A.N. contributors: * * Antonio Quartulli * diff --combined net/batman-adv/fragmentation.c index 43185ca,88df9b1..88df9b1 --- a/net/batman-adv/fragmentation.c +++ b/net/batman-adv/fragmentation.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2013-2014 B.A.T.M.A.N. contributors: * * Martin Hundebøll martin@hundeboll.net * diff --combined net/batman-adv/fragmentation.h index 0347f0c,5d7a0e6..5d7a0e6 --- a/net/batman-adv/fragmentation.h +++ b/net/batman-adv/fragmentation.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2013-2014 B.A.T.M.A.N. contributors: * * Martin Hundebøll martin@hundeboll.net * diff --combined net/batman-adv/gateway_client.c index 9ece204,55cf226..55cf226 --- a/net/batman-adv/gateway_client.c +++ b/net/batman-adv/gateway_client.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2009-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2009-2014 B.A.T.M.A.N. contributors: * * Marek Lindner * diff --combined net/batman-adv/gateway_client.h index 006befb,7ee53bb..7ee53bb --- a/net/batman-adv/gateway_client.h +++ b/net/batman-adv/gateway_client.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2009-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2009-2014 B.A.T.M.A.N. contributors: * * Marek Lindner * diff --combined net/batman-adv/gateway_common.c index f76816c,6f5e621..6f5e621 --- a/net/batman-adv/gateway_common.c +++ b/net/batman-adv/gateway_common.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2009-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2009-2014 B.A.T.M.A.N. contributors: * * Marek Lindner * diff --combined net/batman-adv/gateway_common.h index c47b17a,aa51165..aa51165 --- a/net/batman-adv/gateway_common.h +++ b/net/batman-adv/gateway_common.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2009-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2009-2014 B.A.T.M.A.N. contributors: * * Marek Lindner * diff --combined net/batman-adv/hard-interface.c index 3f0e41a,1b12573..1b12573 --- a/net/batman-adv/hard-interface.c +++ b/net/batman-adv/hard-interface.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich * diff --combined net/batman-adv/hard-interface.h index ccd42c2,1918cd5..1918cd5 --- a/net/batman-adv/hard-interface.h +++ b/net/batman-adv/hard-interface.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich * diff --combined net/batman-adv/hash.c index d9cfa03,63bdf7e..63bdf7e --- a/net/batman-adv/hash.c +++ b/net/batman-adv/hash.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2006-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2006-2014 B.A.T.M.A.N. contributors: * * Simon Wunderlich, Marek Lindner * diff --combined net/batman-adv/hash.h index df5ece9,539fc12..539fc12 --- a/net/batman-adv/hash.h +++ b/net/batman-adv/hash.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2006-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2006-2014 B.A.T.M.A.N. contributors: * * Simon Wunderlich, Marek Lindner * diff --combined net/batman-adv/icmp_socket.c index b384cb8,abb9d6e..abb9d6e --- a/net/batman-adv/icmp_socket.c +++ b/net/batman-adv/icmp_socket.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner * diff --combined net/batman-adv/icmp_socket.h index 559e54a,0c33950..0c33950 --- a/net/batman-adv/icmp_socket.h +++ b/net/batman-adv/icmp_socket.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner * diff --combined net/batman-adv/main.c index ad6aeed,e56b4d6..e56b4d6 --- a/net/batman-adv/main.c +++ b/net/batman-adv/main.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich * diff --combined net/batman-adv/main.h index 49a2394,0000000..9374f1a mode 100644,000000..100644 --- a/net/batman-adv/main.h +++ b/net/batman-adv/main.h @@@ -1,380 -1,0 +1,380 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: ++/* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: + * + * Marek Lindner, Simon Wunderlich + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see http://www.gnu.org/licenses/. + */ + +#ifndef _NET_BATMAN_ADV_MAIN_H_ +#define _NET_BATMAN_ADV_MAIN_H_ + +#define BATADV_DRIVER_AUTHOR "Marek Lindner mareklindner@neomailbox.ch, " \ + "Simon Wunderlich sw@simonwunderlich.de" +#define BATADV_DRIVER_DESC "B.A.T.M.A.N. advanced" +#define BATADV_DRIVER_DEVICE "batman-adv" + +#ifndef BATADV_SOURCE_VERSION - #define BATADV_SOURCE_VERSION "2013.5.0" ++#define BATADV_SOURCE_VERSION "2014.1.0" +#endif + +/* B.A.T.M.A.N. parameters */ + +#define BATADV_TQ_MAX_VALUE 255 +#define BATADV_JITTER 20 + +/* Time To Live of broadcast messages */ +#define BATADV_TTL 50 + +/* purge originators after time in seconds if no valid packet comes in + * -> TODO: check influence on BATADV_TQ_LOCAL_WINDOW_SIZE + */ +#define BATADV_PURGE_TIMEOUT 200000 /* 200 seconds */ +#define BATADV_TT_LOCAL_TIMEOUT 600000 /* in milliseconds */ +#define BATADV_TT_CLIENT_ROAM_TIMEOUT 600000 /* in milliseconds */ +#define BATADV_TT_CLIENT_TEMP_TIMEOUT 600000 /* in milliseconds */ +#define BATADV_TT_WORK_PERIOD 5000 /* 5 seconds */ +#define BATADV_ORIG_WORK_PERIOD 1000 /* 1 second */ +#define BATADV_DAT_ENTRY_TIMEOUT (5*60000) /* 5 mins in milliseconds */ +/* sliding packet range of received originator messages in sequence numbers + * (should be a multiple of our word size) + */ +#define BATADV_TQ_LOCAL_WINDOW_SIZE 64 +/* milliseconds we have to keep pending tt_req */ +#define BATADV_TT_REQUEST_TIMEOUT 3000 + +#define BATADV_TQ_GLOBAL_WINDOW_SIZE 5 +#define BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM 1 +#define BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM 1 +#define BATADV_TQ_TOTAL_BIDRECT_LIMIT 1 + +/* number of OGMs sent with the last tt diff */ +#define BATADV_TT_OGM_APPEND_MAX 3 + +/* Time in which a client can roam at most ROAMING_MAX_COUNT times in + * milliseconds + */ +#define BATADV_ROAMING_MAX_TIME 20000 +#define BATADV_ROAMING_MAX_COUNT 5 + +#define BATADV_NO_FLAGS 0 + +#define BATADV_NULL_IFINDEX 0 /* dummy ifindex used to avoid iface checks */ + +#define BATADV_NO_MARK 0 + +/* default interface for multi interface operation. The default interface is + * used for communication which originated locally (i.e. is not forwarded) + * or where special forwarding is not desired/necessary. + */ +#define BATADV_IF_DEFAULT ((struct batadv_hard_iface *)NULL) + +#define BATADV_NUM_WORDS BITS_TO_LONGS(BATADV_TQ_LOCAL_WINDOW_SIZE) + +#define BATADV_LOG_BUF_LEN 8192 /* has to be a power of 2 */ + +/* number of packets to send for broadcasts on different interface types */ +#define BATADV_NUM_BCASTS_DEFAULT 1 +#define BATADV_NUM_BCASTS_WIRELESS 3 +#define BATADV_NUM_BCASTS_MAX 3 + +/* msecs after which an ARP_REQUEST is sent in broadcast as fallback */ +#define ARP_REQ_DELAY 250 +/* numbers of originator to contact for any PUT/GET DHT operation */ +#define BATADV_DAT_CANDIDATES_NUM 3 + +/** + * BATADV_TQ_SIMILARITY_THRESHOLD - TQ points that a secondary metric can differ + * at most from the primary one in order to be still considered acceptable + */ +#define BATADV_TQ_SIMILARITY_THRESHOLD 50 + +/* how much worse secondary interfaces may be to be considered as bonding + * candidates + */ +#define BATADV_BONDING_TQ_THRESHOLD 50 + +/* should not be bigger than 512 bytes or change the size of + * forw_packet->direct_link_flags + */ +#define BATADV_MAX_AGGREGATION_BYTES 512 +#define BATADV_MAX_AGGREGATION_MS 100 + +#define BATADV_BLA_PERIOD_LENGTH 10000 /* 10 seconds */ +#define BATADV_BLA_BACKBONE_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 3) +#define BATADV_BLA_CLAIM_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 10) +#define BATADV_BLA_WAIT_PERIODS 3 + +#define BATADV_DUPLIST_SIZE 16 +#define BATADV_DUPLIST_TIMEOUT 500 /* 500 ms */ +/* don't reset again within 30 seconds */ +#define BATADV_RESET_PROTECTION_MS 30000 +#define BATADV_EXPECTED_SEQNO_RANGE 65536 + +#define BATADV_NC_NODE_TIMEOUT 10000 /* Milliseconds */ + +enum batadv_mesh_state { + BATADV_MESH_INACTIVE, + BATADV_MESH_ACTIVE, + BATADV_MESH_DEACTIVATING, +}; + +#define BATADV_BCAST_QUEUE_LEN 256 +#define BATADV_BATMAN_QUEUE_LEN 256 + +enum batadv_uev_action { + BATADV_UEV_ADD = 0, + BATADV_UEV_DEL, + BATADV_UEV_CHANGE, +}; + +enum batadv_uev_type { + BATADV_UEV_GW = 0, +}; + +#define BATADV_GW_THRESHOLD 50 + +/* Number of fragment chains for each orig_node */ +#define BATADV_FRAG_BUFFER_COUNT 8 +/* Maximum number of fragments for one packet */ +#define BATADV_FRAG_MAX_FRAGMENTS 16 +/* Maxumim size of each fragment */ +#define BATADV_FRAG_MAX_FRAG_SIZE 1400 +/* Time to keep fragments while waiting for rest of the fragments */ +#define BATADV_FRAG_TIMEOUT 10000 + +#define BATADV_DAT_CANDIDATE_NOT_FOUND 0 +#define BATADV_DAT_CANDIDATE_ORIG 1 + +/* Debug Messages */ +#ifdef pr_fmt +#undef pr_fmt +#endif +/* Append 'batman-adv: ' before kernel messages */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +/* Kernel headers */ + +#include <linux/mutex.h> /* mutex */ +#include <linux/module.h> /* needed by all modules */ +#include <linux/netdevice.h> /* netdevice */ +#include <linux/etherdevice.h> /* ethernet address classification */ +#include <linux/if_ether.h> /* ethernet header */ +#include <linux/poll.h> /* poll_table */ +#include <linux/kthread.h> /* kernel threads */ +#include <linux/pkt_sched.h> /* schedule types */ +#include <linux/workqueue.h> /* workqueue */ +#include <linux/percpu.h> +#include <linux/slab.h> +#include <net/sock.h> /* struct sock */ +#include <net/rtnetlink.h> +#include <linux/jiffies.h> +#include <linux/seq_file.h> +#include <linux/if_vlan.h> + +#include "types.h" + +#define BATADV_PRINT_VID(vid) (vid & BATADV_VLAN_HAS_TAG ? \ + (int)(vid & VLAN_VID_MASK) : -1) + +extern char batadv_routing_algo[]; +extern struct list_head batadv_hardif_list; + +extern unsigned char batadv_broadcast_addr[]; +extern struct workqueue_struct *batadv_event_workqueue; + +int batadv_mesh_init(struct net_device *soft_iface); +void batadv_mesh_free(struct net_device *soft_iface); +int batadv_is_my_mac(struct batadv_priv *bat_priv, const uint8_t *addr); +struct batadv_hard_iface * +batadv_seq_print_text_primary_if_get(struct seq_file *seq); +int batadv_max_header_len(void); +void batadv_skb_set_priority(struct sk_buff *skb, int offset); +int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev, + struct packet_type *ptype, + struct net_device *orig_dev); +int +batadv_recv_handler_register(uint8_t packet_type, + int (*recv_handler)(struct sk_buff *, + struct batadv_hard_iface *)); +void batadv_recv_handler_unregister(uint8_t packet_type); +int batadv_algo_register(struct batadv_algo_ops *bat_algo_ops); +int batadv_algo_select(struct batadv_priv *bat_priv, char *name); +int batadv_algo_seq_print_text(struct seq_file *seq, void *offset); +__be32 batadv_skb_crc32(struct sk_buff *skb, u8 *payload_ptr); + +/** + * enum batadv_dbg_level - available log levels + * @BATADV_DBG_BATMAN: OGM and TQ computations related messages + * @BATADV_DBG_ROUTES: route added / changed / deleted + * @BATADV_DBG_TT: translation table messages + * @BATADV_DBG_BLA: bridge loop avoidance messages + * @BATADV_DBG_DAT: ARP snooping and DAT related messages + * @BATADV_DBG_NC: network coding related messages + * @BATADV_DBG_ALL: the union of all the above log levels + */ +enum batadv_dbg_level { + BATADV_DBG_BATMAN = BIT(0), + BATADV_DBG_ROUTES = BIT(1), + BATADV_DBG_TT = BIT(2), + BATADV_DBG_BLA = BIT(3), + BATADV_DBG_DAT = BIT(4), + BATADV_DBG_NC = BIT(5), + BATADV_DBG_ALL = 63, +}; + +#ifdef CONFIG_BATMAN_ADV_DEBUG +int batadv_debug_log(struct batadv_priv *bat_priv, const char *fmt, ...) +__printf(2, 3); + +#define batadv_dbg(type, bat_priv, fmt, arg...) \ + do { \ + if (atomic_read(&bat_priv->log_level) & type) \ + batadv_debug_log(bat_priv, fmt, ## arg);\ + } \ + while (0) +#else /* !CONFIG_BATMAN_ADV_DEBUG */ +__printf(3, 4) +static inline void batadv_dbg(int type __always_unused, + struct batadv_priv *bat_priv __always_unused, + const char *fmt __always_unused, ...) +{ +} +#endif + +#define batadv_info(net_dev, fmt, arg...) \ + do { \ + struct net_device *_netdev = (net_dev); \ + struct batadv_priv *_batpriv = netdev_priv(_netdev); \ + batadv_dbg(BATADV_DBG_ALL, _batpriv, fmt, ## arg); \ + pr_info("%s: " fmt, _netdev->name, ## arg); \ + } while (0) +#define batadv_err(net_dev, fmt, arg...) \ + do { \ + struct net_device *_netdev = (net_dev); \ + struct batadv_priv *_batpriv = netdev_priv(_netdev); \ + batadv_dbg(BATADV_DBG_ALL, _batpriv, fmt, ## arg); \ + pr_err("%s: " fmt, _netdev->name, ## arg); \ + } while (0) + +/* returns 1 if they are the same ethernet addr + * + * note: can't use ether_addr_equal() as it requires aligned memory + */ +static inline int batadv_compare_eth(const void *data1, const void *data2) +{ + return ether_addr_equal_unaligned(data1, data2); +} + +/** + * has_timed_out - compares current time (jiffies) and timestamp + timeout + * @timestamp: base value to compare with (in jiffies) + * @timeout: added to base value before comparing (in milliseconds) + * + * Returns true if current time is after timestamp + timeout + */ +static inline bool batadv_has_timed_out(unsigned long timestamp, + unsigned int timeout) +{ + return time_is_before_jiffies(timestamp + msecs_to_jiffies(timeout)); +} + +#define batadv_atomic_dec_not_zero(v) atomic_add_unless((v), -1, 0) + +/* Returns the smallest signed integer in two's complement with the sizeof x */ +#define batadv_smallest_signed_int(x) (1u << (7u + 8u * (sizeof(x) - 1u))) + +/* Checks if a sequence number x is a predecessor/successor of y. + * they handle overflows/underflows and can correctly check for a + * predecessor/successor unless the variable sequence number has grown by + * more then 2**(bitwidth(x)-1)-1. + * This means that for a uint8_t with the maximum value 255, it would think: + * - when adding nothing - it is neither a predecessor nor a successor + * - before adding more than 127 to the starting value - it is a predecessor, + * - when adding 128 - it is neither a predecessor nor a successor, + * - after adding more than 127 to the starting value - it is a successor + */ +#define batadv_seq_before(x, y) ({typeof(x) _d1 = (x); \ + typeof(y) _d2 = (y); \ + typeof(x) _dummy = (_d1 - _d2); \ + (void) (&_d1 == &_d2); \ + _dummy > batadv_smallest_signed_int(_dummy); }) +#define batadv_seq_after(x, y) batadv_seq_before(y, x) + +/* Stop preemption on local cpu while incrementing the counter */ +static inline void batadv_add_counter(struct batadv_priv *bat_priv, size_t idx, + size_t count) +{ + this_cpu_add(bat_priv->bat_counters[idx], count); +} + +#define batadv_inc_counter(b, i) batadv_add_counter(b, i, 1) + +/* Sum and return the cpu-local counters for index 'idx' */ +static inline uint64_t batadv_sum_counter(struct batadv_priv *bat_priv, + size_t idx) +{ + uint64_t *counters, sum = 0; + int cpu; + + for_each_possible_cpu(cpu) { + counters = per_cpu_ptr(bat_priv->bat_counters, cpu); + sum += counters[idx]; + } + + return sum; +} + +/* Define a macro to reach the control buffer of the skb. The members of the + * control buffer are defined in struct batadv_skb_cb in types.h. + * The macro is inspired by the similar macro TCP_SKB_CB() in tcp.h. + */ +#define BATADV_SKB_CB(__skb) ((struct batadv_skb_cb *)&((__skb)->cb[0])) + +void batadv_tvlv_container_register(struct batadv_priv *bat_priv, + uint8_t type, uint8_t version, + void *tvlv_value, uint16_t tvlv_value_len); +uint16_t batadv_tvlv_container_ogm_append(struct batadv_priv *bat_priv, + unsigned char **packet_buff, + int *packet_buff_len, + int packet_min_len); +void batadv_tvlv_ogm_receive(struct batadv_priv *bat_priv, + struct batadv_ogm_packet *batadv_ogm_packet, + struct batadv_orig_node *orig_node); +void batadv_tvlv_container_unregister(struct batadv_priv *bat_priv, + uint8_t type, uint8_t version); + +void batadv_tvlv_handler_register(struct batadv_priv *bat_priv, + void (*optr)(struct batadv_priv *bat_priv, + struct batadv_orig_node *orig, + uint8_t flags, + void *tvlv_value, + uint16_t tvlv_value_len), + int (*uptr)(struct batadv_priv *bat_priv, + uint8_t *src, uint8_t *dst, + void *tvlv_value, + uint16_t tvlv_value_len), + uint8_t type, uint8_t version, uint8_t flags); +void batadv_tvlv_handler_unregister(struct batadv_priv *bat_priv, + uint8_t type, uint8_t version); +int batadv_tvlv_containers_process(struct batadv_priv *bat_priv, + bool ogm_source, + struct batadv_orig_node *orig_node, + uint8_t *src, uint8_t *dst, + void *tvlv_buff, uint16_t tvlv_buff_len); +void batadv_tvlv_unicast_send(struct batadv_priv *bat_priv, uint8_t *src, + uint8_t *dst, uint8_t type, uint8_t version, + void *tvlv_value, uint16_t tvlv_value_len); +unsigned short batadv_get_vid(struct sk_buff *skb, size_t header_len); +bool batadv_vlan_ap_isola_get(struct batadv_priv *bat_priv, unsigned short vid); + +#endif /* _NET_BATMAN_ADV_MAIN_H_ */ diff --combined net/batman-adv/network-coding.c index 6a0b328,f1b604d..f1b604d --- a/net/batman-adv/network-coding.c +++ b/net/batman-adv/network-coding.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2012-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2012-2014 B.A.T.M.A.N. contributors: * * Martin Hundebøll, Jeppe Ledet-Pedersen * diff --combined net/batman-adv/network-coding.h index 136db6d,358c0d6..358c0d6 --- a/net/batman-adv/network-coding.h +++ b/net/batman-adv/network-coding.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2012-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2012-2014 B.A.T.M.A.N. contributors: * * Martin Hundebøll, Jeppe Ledet-Pedersen * diff --combined net/batman-adv/originator.c index 4a5d027,6df12a2..6df12a2 --- a/net/batman-adv/originator.c +++ b/net/batman-adv/originator.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2009-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2009-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich * @@@ -39,7 -39,7 +39,7 @@@ int batadv_compare_orig(const struct hl const void *data1 = container_of(node, struct batadv_orig_node, hash_entry);
- return memcmp(data1, data2, ETH_ALEN) == 0 ? 1 : 0; + return batadv_compare_eth(data1, data2); }
/** diff --combined net/batman-adv/originator.h index ad17c3c,37be290..37be290 --- a/net/batman-adv/originator.h +++ b/net/batman-adv/originator.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich * diff --combined net/batman-adv/packet.h index ef2010c,0a381d1..0a381d1 --- a/net/batman-adv/packet.h +++ b/net/batman-adv/packet.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich * diff --combined net/batman-adv/routing.c index 153065a,1ed9f7c..1ed9f7c --- a/net/batman-adv/routing.c +++ b/net/batman-adv/routing.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich * diff --combined net/batman-adv/routing.h index 8fa23fc,557d3d1..557d3d1 --- a/net/batman-adv/routing.h +++ b/net/batman-adv/routing.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich * diff --combined net/batman-adv/send.c index c93b92d,579f5f0..579f5f0 --- a/net/batman-adv/send.c +++ b/net/batman-adv/send.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich * diff --combined net/batman-adv/send.h index 0b17f8d,aaddaa9..aaddaa9 --- a/net/batman-adv/send.h +++ b/net/batman-adv/send.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich * diff --combined net/batman-adv/soft-interface.c index 2f1e843,f82c267..f82c267 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich * @@@ -356,7 -356,7 +356,7 @@@ void batadv_interface_rx(struct net_dev */ nf_reset(skb);
- vid = batadv_get_vid(skb, hdr_size); + vid = batadv_get_vid(skb, 0); ethhdr = eth_hdr(skb);
switch (ntohs(ethhdr->h_proto)) { diff --combined net/batman-adv/soft-interface.h index 4ab0167,dbab22f..dbab22f --- a/net/batman-adv/soft-interface.h +++ b/net/batman-adv/soft-interface.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner * diff --combined net/batman-adv/sysfs.c index b6a4403,e456bf6..e456bf6 --- a/net/batman-adv/sysfs.c +++ b/net/batman-adv/sysfs.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2010-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2010-2014 B.A.T.M.A.N. contributors: * * Marek Lindner * diff --combined net/batman-adv/sysfs.h index ed80b72,b715b60..b715b60 --- a/net/batman-adv/sysfs.h +++ b/net/batman-adv/sysfs.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2010-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2010-2014 B.A.T.M.A.N. contributors: * * Marek Lindner * diff --combined net/batman-adv/translation-table.c index f9483e0,a6fb1ff..a6fb1ff --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich, Antonio Quartulli * @@@ -49,7 -49,7 +49,7 @@@ static int batadv_compare_tt(const stru const void *data1 = container_of(node, struct batadv_tt_common_entry, hash_entry);
- return memcmp(data1, data2, ETH_ALEN) == 0 ? 1 : 0; + return batadv_compare_eth(data1, data2); }
/** diff --combined net/batman-adv/translation-table.h index daa8ab7,20a1d78..20a1d78 --- a/net/batman-adv/translation-table.h +++ b/net/batman-adv/translation-table.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich, Antonio Quartulli * diff --combined net/batman-adv/types.h index 8a1fa16,b53f90d..b53f90d --- a/net/batman-adv/types.h +++ b/net/batman-adv/types.h @@@ -1,4 -1,4 +1,4 @@@ - /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: + /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors: * * Marek Lindner, Simon Wunderlich *