Skip to content

Commit

Permalink
Merge branch 'batman-adv/next' of git://git.open-mesh.org/linux-merge
Browse files Browse the repository at this point in the history
  • Loading branch information
David S. Miller committed Jul 6, 2011
2 parents 994635a + 44c4349 commit f8bae99
Show file tree
Hide file tree
Showing 13 changed files with 71 additions and 59 deletions.
25 changes: 20 additions & 5 deletions net/batman-adv/aggregation.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

/* return true if new_packet can be aggregated with forw_packet */
static bool can_aggregate_with(const struct batman_packet *new_batman_packet,
struct bat_priv *bat_priv,
int packet_len,
unsigned long send_time,
bool directlink,
Expand All @@ -37,6 +38,8 @@ static bool can_aggregate_with(const struct batman_packet *new_batman_packet,
struct batman_packet *batman_packet =
(struct batman_packet *)forw_packet->skb->data;
int aggregated_bytes = forw_packet->packet_len + packet_len;
struct hard_iface *primary_if = NULL;
bool res = false;

/**
* we can aggregate the current packet to this aggregated packet
Expand All @@ -61,6 +64,10 @@ static bool can_aggregate_with(const struct batman_packet *new_batman_packet,
* packet
*/

primary_if = primary_if_get_selected(bat_priv);
if (!primary_if)
goto out;

/* packets without direct link flag and high TTL
* are flooded through the net */
if ((!directlink) &&
Expand All @@ -70,8 +77,10 @@ static bool can_aggregate_with(const struct batman_packet *new_batman_packet,
/* own packets originating non-primary
* interfaces leave only that interface */
((!forw_packet->own) ||
(forw_packet->if_incoming->if_num == 0)))
return true;
(forw_packet->if_incoming == primary_if))) {
res = true;
goto out;
}

/* if the incoming packet is sent via this one
* interface only - we still can aggregate */
Expand All @@ -84,11 +93,16 @@ static bool can_aggregate_with(const struct batman_packet *new_batman_packet,
* (= secondary interface packets in general) */
(batman_packet->flags & DIRECTLINK ||
(forw_packet->own &&
forw_packet->if_incoming->if_num != 0)))
return true;
forw_packet->if_incoming != primary_if))) {
res = true;
goto out;
}
}

return false;
out:
if (primary_if)
hardif_free_ref(primary_if);
return res;
}

/* create a new aggregated packet and add this packet to it */
Expand Down Expand Up @@ -210,6 +224,7 @@ void add_bat_packet_to_list(struct bat_priv *bat_priv,
hlist_for_each_entry(forw_packet_pos, tmp_node,
&bat_priv->forw_bat_list, list) {
if (can_aggregate_with(batman_packet,
bat_priv,
packet_len,
send_time,
direct_link,
Expand Down
5 changes: 2 additions & 3 deletions net/batman-adv/gateway_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -487,10 +487,9 @@ int gw_client_seq_print_text(struct seq_file *seq, void *offset)
}

seq_printf(seq, " %-12s (%s/%i) %17s [%10s]: gw_class ... "
"[B.A.T.M.A.N. adv %s%s, MainIF/MAC: %s/%pM (%s)]\n",
"[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s)]\n",
"Gateway", "#", TQ_MAX_VALUE, "Nexthop",
"outgoingIF", SOURCE_VERSION, REVISION_VERSION_STR,
primary_if->net_dev->name,
"outgoingIF", SOURCE_VERSION, primary_if->net_dev->name,
primary_if->net_dev->dev_addr, net_dev->name);

rcu_read_lock();
Expand Down
9 changes: 2 additions & 7 deletions net/batman-adv/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,8 @@ static int __init batman_init(void)

register_netdevice_notifier(&hard_if_notifier);

pr_info("B.A.T.M.A.N. advanced %s%s (compatibility version %i) "
"loaded\n", SOURCE_VERSION, REVISION_VERSION_STR,
COMPAT_VERSION);
pr_info("B.A.T.M.A.N. advanced %s (compatibility version %i) "
"loaded\n", SOURCE_VERSION, COMPAT_VERSION);

return 0;
}
Expand Down Expand Up @@ -184,8 +183,4 @@ MODULE_LICENSE("GPL");
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_SUPPORTED_DEVICE(DRIVER_DEVICE);
#ifdef REVISION_VERSION
MODULE_VERSION(SOURCE_VERSION "-" REVISION_VERSION);
#else
MODULE_VERSION(SOURCE_VERSION);
#endif
11 changes: 3 additions & 8 deletions net/batman-adv/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@
#define DRIVER_DESC "B.A.T.M.A.N. advanced"
#define DRIVER_DEVICE "batman-adv"

#define SOURCE_VERSION "next"

#ifndef SOURCE_VERSION
#define SOURCE_VERSION "2011.3.0"
#endif

/* B.A.T.M.A.N. parameters */

Expand Down Expand Up @@ -144,12 +145,6 @@ enum dbg_level {
#include <linux/seq_file.h>
#include "types.h"

#ifndef REVISION_VERSION
#define REVISION_VERSION_STR ""
#else
#define REVISION_VERSION_STR " "REVISION_VERSION
#endif

extern struct list_head hardif_list;

extern unsigned char broadcast_addr[];
Expand Down
5 changes: 2 additions & 3 deletions net/batman-adv/originator.c
Original file line number Diff line number Diff line change
Expand Up @@ -430,9 +430,8 @@ int orig_seq_print_text(struct seq_file *seq, void *offset)
goto out;
}

seq_printf(seq, "[B.A.T.M.A.N. adv %s%s, MainIF/MAC: %s/%pM (%s)]\n",
SOURCE_VERSION, REVISION_VERSION_STR,
primary_if->net_dev->name,
seq_printf(seq, "[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s)]\n",
SOURCE_VERSION, primary_if->net_dev->name,
primary_if->net_dev->dev_addr, net_dev->name);
seq_printf(seq, " %-15s %s (%s/%i) %17s [%10s]: %20s ...\n",
"Originator", "last-seen", "#", TQ_MAX_VALUE, "Nexthop",
Expand Down
11 changes: 7 additions & 4 deletions net/batman-adv/packet.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,13 @@ enum tt_query_flags {
TT_FULL_TABLE = 1 << 2
};

/* TT_CHANGE flags */
enum tt_change_flags {
TT_CHANGE_DEL = 0x01,
TT_CLIENT_ROAM = 0x02
/* TT_CLIENT flags.
* Flags from 1 to 1 << 7 are sent on the wire, while flags from 1 << 8 to
* 1 << 15 are used for local computation only */
enum tt_client_flags {
TT_CLIENT_DEL = 1 << 0,
TT_CLIENT_ROAM = 1 << 1,
TT_CLIENT_NOPURGE = 1 << 8
};

struct batman_packet {
Expand Down
2 changes: 1 addition & 1 deletion net/batman-adv/routing.c
Original file line number Diff line number Diff line change
Expand Up @@ -1677,7 +1677,7 @@ int recv_bcast_packet(struct sk_buff *skb, struct hard_iface *recv_if)
spin_unlock_bh(&orig_node->bcast_seqno_lock);

/* rebroadcast packet */
add_bcast_packet_to_list(bat_priv, skb);
add_bcast_packet_to_list(bat_priv, skb, 1);

/* broadcast for me */
interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size);
Expand Down
21 changes: 15 additions & 6 deletions net/batman-adv/send.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,26 +163,31 @@ static void send_packet(struct forw_packet *forw_packet)
struct hard_iface *hard_iface;
struct net_device *soft_iface;
struct bat_priv *bat_priv;
struct hard_iface *primary_if = NULL;
struct batman_packet *batman_packet =
(struct batman_packet *)(forw_packet->skb->data);
int directlink = (batman_packet->flags & DIRECTLINK ? 1 : 0);

if (!forw_packet->if_incoming) {
pr_err("Error - can't forward packet: incoming iface not "
"specified\n");
return;
goto out;
}

soft_iface = forw_packet->if_incoming->soft_iface;
bat_priv = netdev_priv(soft_iface);

if (forw_packet->if_incoming->if_status != IF_ACTIVE)
return;
goto out;

primary_if = primary_if_get_selected(bat_priv);
if (!primary_if)
goto out;

/* multihomed peer assumed */
/* non-primary OGMs are only broadcasted on their interface */
if ((directlink && (batman_packet->ttl == 1)) ||
(forw_packet->own && (forw_packet->if_incoming->if_num > 0))) {
(forw_packet->own && (forw_packet->if_incoming != primary_if))) {

/* FIXME: what about aggregated packets ? */
bat_dbg(DBG_BATMAN, bat_priv,
Expand All @@ -199,7 +204,7 @@ static void send_packet(struct forw_packet *forw_packet)
broadcast_addr);
forw_packet->skb = NULL;

return;
goto out;
}

/* broadcast on every interface */
Expand All @@ -211,6 +216,10 @@ static void send_packet(struct forw_packet *forw_packet)
send_packet_to_if(forw_packet, hard_iface);
}
rcu_read_unlock();

out:
if (primary_if)
hardif_free_ref(primary_if);
}

static void realloc_packet_buffer(struct hard_iface *hard_iface,
Expand Down Expand Up @@ -455,7 +464,7 @@ static void _add_bcast_packet_to_list(struct bat_priv *bat_priv,
* The skb is not consumed, so the caller should make sure that the
* skb is freed. */
int add_bcast_packet_to_list(struct bat_priv *bat_priv,
const struct sk_buff *skb)
const struct sk_buff *skb, unsigned long delay)
{
struct hard_iface *primary_if = NULL;
struct forw_packet *forw_packet;
Expand Down Expand Up @@ -492,7 +501,7 @@ int add_bcast_packet_to_list(struct bat_priv *bat_priv,
/* how often did we send the bcast packet ? */
forw_packet->num_packets = 0;

_add_bcast_packet_to_list(bat_priv, forw_packet, 1);
_add_bcast_packet_to_list(bat_priv, forw_packet, delay);
return NETDEV_TX_OK;

packet_free:
Expand Down
2 changes: 1 addition & 1 deletion net/batman-adv/send.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ void schedule_forward_packet(struct orig_node *orig_node,
int directlink,
struct hard_iface *if_outgoing);
int add_bcast_packet_to_list(struct bat_priv *bat_priv,
const struct sk_buff *skb);
const struct sk_buff *skb, unsigned long delay);
void send_outstanding_bat_packet(struct work_struct *work);
void purge_outstanding_packets(struct bat_priv *bat_priv,
const struct hard_iface *hard_iface);
Expand Down
2 changes: 1 addition & 1 deletion net/batman-adv/soft-interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -634,7 +634,7 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)
bcast_packet->seqno =
htonl(atomic_inc_return(&bat_priv->bcast_seqno));

add_bcast_packet_to_list(bat_priv, skb);
add_bcast_packet_to_list(bat_priv, skb, 1);

/* a copy is stored in the bcast list, therefore removing
* the original skb. */
Expand Down
30 changes: 14 additions & 16 deletions net/batman-adv/translation-table.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,8 @@ static void tt_global_entry_free_ref(struct tt_global_entry *tt_global_entry)
kfree_rcu(tt_global_entry, rcu);
}

static void tt_local_event(struct bat_priv *bat_priv, uint8_t op,
const uint8_t *addr, bool roaming)
static void tt_local_event(struct bat_priv *bat_priv, const uint8_t *addr,
uint8_t flags)
{
struct tt_change_node *tt_change_node;

Expand All @@ -153,10 +153,7 @@ static void tt_local_event(struct bat_priv *bat_priv, uint8_t op,
if (!tt_change_node)
return;

tt_change_node->change.flags = op;
if (roaming)
tt_change_node->change.flags |= TT_CLIENT_ROAM;

tt_change_node->change.flags = flags;
memcpy(tt_change_node->change.addr, addr, ETH_ALEN);

spin_lock_bh(&bat_priv->tt_changes_list_lock);
Expand Down Expand Up @@ -203,21 +200,20 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr)
if (!tt_local_entry)
goto out;

tt_local_event(bat_priv, NO_FLAGS, addr, false);

bat_dbg(DBG_TT, bat_priv,
"Creating new local tt entry: %pM (ttvn: %d)\n", addr,
(uint8_t)atomic_read(&bat_priv->ttvn));

memcpy(tt_local_entry->addr, addr, ETH_ALEN);
tt_local_entry->last_seen = jiffies;
tt_local_entry->flags = NO_FLAGS;
atomic_set(&tt_local_entry->refcount, 2);

/* the batman interface mac address should never be purged */
if (compare_eth(addr, soft_iface->dev_addr))
tt_local_entry->never_purge = 1;
else
tt_local_entry->never_purge = 0;
tt_local_entry->flags |= TT_CLIENT_NOPURGE;

tt_local_event(bat_priv, addr, tt_local_entry->flags);

hash_add(bat_priv->tt_local_hash, compare_ltt, choose_orig,
tt_local_entry, &tt_local_entry->hash_entry);
Expand Down Expand Up @@ -387,7 +383,9 @@ void tt_local_remove(struct bat_priv *bat_priv, const uint8_t *addr,
if (!tt_local_entry)
goto out;

tt_local_event(bat_priv, TT_CHANGE_DEL, tt_local_entry->addr, roaming);
tt_local_event(bat_priv, tt_local_entry->addr,
tt_local_entry->flags | TT_CLIENT_DEL |
(roaming ? TT_CLIENT_ROAM : NO_FLAGS));
tt_local_del(bat_priv, tt_local_entry, message);
out:
if (tt_local_entry)
Expand All @@ -410,15 +408,15 @@ static void tt_local_purge(struct bat_priv *bat_priv)
spin_lock_bh(list_lock);
hlist_for_each_entry_safe(tt_local_entry, node, node_tmp,
head, hash_entry) {
if (tt_local_entry->never_purge)
if (tt_local_entry->flags & TT_CLIENT_NOPURGE)
continue;

if (!is_out_of_time(tt_local_entry->last_seen,
TT_LOCAL_TIMEOUT * 1000))
continue;

tt_local_event(bat_priv, TT_CHANGE_DEL,
tt_local_entry->addr, false);
tt_local_event(bat_priv, tt_local_entry->addr,
tt_local_entry->flags | TT_CLIENT_DEL);
atomic_dec(&bat_priv->num_local_tt);
bat_dbg(DBG_TT, bat_priv, "Deleting local "
"tt entry (%pM): timed out\n",
Expand Down Expand Up @@ -1335,7 +1333,7 @@ static void _tt_update_changes(struct bat_priv *bat_priv,
int i;

for (i = 0; i < tt_num_changes; i++) {
if ((tt_change + i)->flags & TT_CHANGE_DEL)
if ((tt_change + i)->flags & TT_CLIENT_DEL)
tt_global_del(bat_priv, orig_node,
(tt_change + i)->addr,
"tt removed by changes",
Expand Down
3 changes: 1 addition & 2 deletions net/batman-adv/translation-table.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr);
void tt_local_remove(struct bat_priv *bat_priv,
const uint8_t *addr, const char *message, bool roaming);
int tt_local_seq_print_text(struct seq_file *seq, void *offset);
void tt_global_add_orig(struct bat_priv *bat_priv,
struct orig_node *orig_node,
void tt_global_add_orig(struct bat_priv *bat_priv, struct orig_node *orig_node,
const unsigned char *tt_buff, int tt_buff_len);
int tt_global_add(struct bat_priv *bat_priv,
struct orig_node *orig_node, const unsigned char *addr,
Expand Down
4 changes: 2 additions & 2 deletions net/batman-adv/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ struct socket_packet {
struct tt_local_entry {
uint8_t addr[ETH_ALEN];
unsigned long last_seen;
char never_purge;
uint16_t flags;
atomic_t refcount;
struct rcu_head rcu;
struct hlist_node hash_entry;
Expand All @@ -234,7 +234,7 @@ struct tt_global_entry {
uint8_t addr[ETH_ALEN];
struct orig_node *orig_node;
uint8_t ttvn;
uint8_t flags; /* only TT_GLOBAL_ROAM is used */
uint16_t flags; /* only TT_GLOBAL_ROAM is used */
unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */
atomic_t refcount;
struct rcu_head rcu;
Expand Down

0 comments on commit f8bae99

Please sign in to comment.