* [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability
@ 2012-03-01 7:35 Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 2/6] batman-adv: introduce packet type handler array for incoming packets Marek Lindner
` (6 more replies)
0 siblings, 7 replies; 18+ messages in thread
From: Marek Lindner @ 2012-03-01 7:35 UTC (permalink / raw)
To: b.a.t.m.a.n; +Cc: Marek Lindner
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
---
bat_iv_ogm.c | 16 +++++++++-------
1 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c
index d9195b3..aba0204 100644
--- a/bat_iv_ogm.c
+++ b/bat_iv_ogm.c
@@ -483,7 +483,8 @@ static void bat_iv_ogm_queue_add(struct bat_priv *bat_priv,
static void bat_iv_ogm_forward(struct orig_node *orig_node,
const struct ethhdr *ethhdr,
struct batman_ogm_packet *batman_ogm_packet,
- int directlink, struct hard_iface *if_incoming)
+ bool is_single_hop_neigh,
+ struct hard_iface *if_incoming)
{
struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
struct neigh_node *router;
@@ -537,7 +538,7 @@ static void bat_iv_ogm_forward(struct orig_node *orig_node,
/* switch of primaries first hop flag when forwarding */
batman_ogm_packet->flags &= ~PRIMARIES_FIRST_HOP;
- if (directlink)
+ if (is_single_hop_neigh)
batman_ogm_packet->flags |= DIRECTLINK;
else
batman_ogm_packet->flags &= ~DIRECTLINK;
@@ -926,7 +927,8 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr,
struct neigh_node *orig_neigh_router = NULL;
int has_directlink_flag;
int is_my_addr = 0, is_my_orig = 0, is_my_oldorig = 0;
- int is_broadcast = 0, is_bidirectional, is_single_hop_neigh;
+ int is_broadcast = 0, is_bidirectional;
+ bool is_single_hop_neigh = false;
int is_duplicate;
uint32_t if_incoming_seqno;
@@ -950,8 +952,8 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr,
has_directlink_flag = (batman_ogm_packet->flags & DIRECTLINK ? 1 : 0);
- is_single_hop_neigh = (compare_eth(ethhdr->h_source,
- batman_ogm_packet->orig) ? 1 : 0);
+ if (compare_eth(ethhdr->h_source, batman_ogm_packet->orig))
+ is_single_hop_neigh = true;
bat_dbg(DBG_BATMAN, bat_priv,
"Received BATMAN packet via NB: %pM, IF: %s [%pM] "
@@ -1125,7 +1127,7 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr,
/* mark direct link on incoming interface */
bat_iv_ogm_forward(orig_node, ethhdr, batman_ogm_packet,
- 1, if_incoming);
+ is_single_hop_neigh, if_incoming);
bat_dbg(DBG_BATMAN, bat_priv, "Forwarding packet: "
"rebroadcast neighbor packet with direct link flag\n");
@@ -1148,7 +1150,7 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr,
bat_dbg(DBG_BATMAN, bat_priv,
"Forwarding packet: rebroadcast originator packet\n");
bat_iv_ogm_forward(orig_node, ethhdr, batman_ogm_packet,
- 0, if_incoming);
+ is_single_hop_neigh, if_incoming);
out_neigh:
if ((orig_neigh_node) && (!is_single_hop_neigh))
--
1.7.9
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [B.A.T.M.A.N.] [PATCH 2/6] batman-adv: introduce packet type handler array for incoming packets
2012-03-01 7:35 [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability Marek Lindner
@ 2012-03-01 7:35 ` Marek Lindner
2012-03-01 8:32 ` Sven Eckelmann
2012-03-05 19:26 ` Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 3/6] batman-adv: register batman ogm receive function during protocol init Marek Lindner
` (5 subsequent siblings)
6 siblings, 2 replies; 18+ messages in thread
From: Marek Lindner @ 2012-03-01 7:35 UTC (permalink / raw)
To: b.a.t.m.a.n; +Cc: Marek Lindner
The packet handler array replaces the growing switch statement, thus
dealing with incoming packets in a more efficient way. It also adds
to possibility to register packet handlers on the fly.
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
---
hard-interface.c | 114 ----------------------------------------------------
main.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
main.h | 6 +++
3 files changed, 124 insertions(+), 114 deletions(-)
diff --git a/hard-interface.c b/hard-interface.c
index cf43540..3ddd5de 100644
--- a/hard-interface.c
+++ b/hard-interface.c
@@ -33,12 +33,6 @@
#include <linux/if_arp.h>
-
-static int batman_skb_recv(struct sk_buff *skb,
- struct net_device *dev,
- struct packet_type *ptype,
- struct net_device *orig_dev);
-
void hardif_free_rcu(struct rcu_head *rcu)
{
struct hard_iface *hard_iface;
@@ -567,114 +561,6 @@ out:
return NOTIFY_DONE;
}
-/* incoming packets with the batman ethertype received on any active hard
- * interface */
-static int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
- struct packet_type *ptype,
- struct net_device *orig_dev)
-{
- struct bat_priv *bat_priv;
- struct batman_ogm_packet *batman_ogm_packet;
- struct hard_iface *hard_iface;
- int ret;
-
- hard_iface = container_of(ptype, struct hard_iface, batman_adv_ptype);
- skb = skb_share_check(skb, GFP_ATOMIC);
-
- /* skb was released by skb_share_check() */
- if (!skb)
- goto err_out;
-
- /* packet should hold at least type and version */
- if (unlikely(!pskb_may_pull(skb, 2)))
- goto err_free;
-
- /* expect a valid ethernet header here. */
- if (unlikely(skb->mac_len != ETH_HLEN || !skb_mac_header(skb)))
- goto err_free;
-
- if (!hard_iface->soft_iface)
- goto err_free;
-
- bat_priv = netdev_priv(hard_iface->soft_iface);
-
- if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE)
- goto err_free;
-
- /* discard frames on not active interfaces */
- if (hard_iface->if_status != IF_ACTIVE)
- goto err_free;
-
- batman_ogm_packet = (struct batman_ogm_packet *)skb->data;
-
- if (batman_ogm_packet->header.version != COMPAT_VERSION) {
- bat_dbg(DBG_BATMAN, bat_priv,
- "Drop packet: incompatible batman version (%i)\n",
- batman_ogm_packet->header.version);
- goto err_free;
- }
-
- /* all receive handlers return whether they received or reused
- * the supplied skb. if not, we have to free the skb. */
-
- switch (batman_ogm_packet->header.packet_type) {
- /* batman originator packet */
- case BAT_IV_OGM:
- ret = recv_bat_ogm_packet(skb, hard_iface);
- break;
-
- /* batman icmp packet */
- case BAT_ICMP:
- ret = recv_icmp_packet(skb, hard_iface);
- break;
-
- /* unicast packet */
- case BAT_UNICAST:
- case BAT_UNICAST_4ADDR:
- ret = recv_unicast_packet(skb, hard_iface);
- break;
-
- /* fragmented unicast packet */
- case BAT_UNICAST_FRAG:
- ret = recv_ucast_frag_packet(skb, hard_iface);
- break;
-
- /* broadcast packet */
- case BAT_BCAST:
- ret = recv_bcast_packet(skb, hard_iface);
- break;
-
- /* vis packet */
- case BAT_VIS:
- ret = recv_vis_packet(skb, hard_iface);
- break;
- /* Translation table query (request or response) */
- case BAT_TT_QUERY:
- ret = recv_tt_query(skb, hard_iface);
- break;
- /* Roaming advertisement */
- case BAT_ROAM_ADV:
- ret = recv_roam_adv(skb, hard_iface);
- break;
- default:
- ret = NET_RX_DROP;
- }
-
- if (ret == NET_RX_DROP)
- kfree_skb(skb);
-
- /* return NET_RX_SUCCESS in any case as we
- * most probably dropped the packet for
- * routing-logical reasons. */
-
- return NET_RX_SUCCESS;
-
-err_free:
- kfree_skb(skb);
-err_out:
- return NET_RX_DROP;
-}
-
/* This function returns true if the interface represented by ifindex is a
* 802.11 wireless device */
bool is_wifi_iface(int ifindex)
diff --git a/main.c b/main.c
index 87b75a9..0d0cd48 100644
--- a/main.c
+++ b/main.c
@@ -39,6 +39,7 @@
/* List manipulations on hardif_list have to be rtnl_lock()'ed,
* list traversals just rcu-locked */
struct list_head hardif_list;
+static int (*recv_packet_handler[256])(struct sk_buff *, struct hard_iface *);
char bat_routing_algo[20] = "BATMAN IV";
static struct hlist_head bat_algo_list;
@@ -46,11 +47,15 @@ unsigned char broadcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
struct workqueue_struct *bat_event_workqueue;
+static void recv_handler_init(void);
+
static int __init batman_init(void)
{
INIT_LIST_HEAD(&hardif_list);
INIT_HLIST_HEAD(&bat_algo_list);
+ recv_handler_init();
+
bat_iv_init();
/* the name should not be longer than 10 chars - see
@@ -179,6 +184,119 @@ int is_my_mac(const uint8_t *addr)
return 0;
}
+static int recv_unhandled_packet(struct sk_buff *skb,
+ struct hard_iface *recv_if)
+{
+ return NET_RX_DROP;
+}
+
+/* incoming packets with the batman ethertype received on any active hard
+ * interface */
+int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
+ struct packet_type *ptype, struct net_device *orig_dev)
+{
+ struct bat_priv *bat_priv;
+ struct batman_ogm_packet *batman_ogm_packet;
+ struct hard_iface *hard_iface;
+ uint8_t idx;
+ int ret;
+
+ hard_iface = container_of(ptype, struct hard_iface, batman_adv_ptype);
+ skb = skb_share_check(skb, GFP_ATOMIC);
+
+ /* skb was released by skb_share_check() */
+ if (!skb)
+ goto err_out;
+
+ /* packet should hold at least type and version */
+ if (unlikely(!pskb_may_pull(skb, 2)))
+ goto err_free;
+
+ /* expect a valid ethernet header here. */
+ if (unlikely(skb->mac_len != ETH_HLEN || !skb_mac_header(skb)))
+ goto err_free;
+
+ if (!hard_iface->soft_iface)
+ goto err_free;
+
+ bat_priv = netdev_priv(hard_iface->soft_iface);
+
+ if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE)
+ goto err_free;
+
+ /* discard frames on not active interfaces */
+ if (hard_iface->if_status != IF_ACTIVE)
+ goto err_free;
+
+ batman_ogm_packet = (struct batman_ogm_packet *)skb->data;
+
+ if (batman_ogm_packet->header.version != COMPAT_VERSION) {
+ bat_dbg(DBG_BATMAN, bat_priv,
+ "Drop packet: incompatible batman version (%i)\n",
+ batman_ogm_packet->header.version);
+ goto err_free;
+ }
+
+ /* all receive handlers return whether they received or reused
+ * the supplied skb. if not, we have to free the skb. */
+ idx = batman_ogm_packet->header.packet_type;
+ ret = (*recv_packet_handler[idx])(skb, hard_iface);
+
+ if (ret == NET_RX_DROP)
+ kfree_skb(skb);
+
+ /* return NET_RX_SUCCESS in any case as we
+ * most probably dropped the packet for
+ * routing-logical reasons. */
+ return NET_RX_SUCCESS;
+
+err_free:
+ kfree_skb(skb);
+err_out:
+ return NET_RX_DROP;
+}
+
+static void recv_handler_init(void)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(recv_packet_handler); i++)
+ recv_packet_handler[i] = recv_unhandled_packet;
+
+ /* batman originator packet */
+ recv_packet_handler[BAT_IV_OGM] = recv_bat_ogm_packet;
+ /* batman icmp packet */
+ recv_packet_handler[BAT_ICMP] = recv_icmp_packet;
+ /* unicast packet */
+ recv_packet_handler[BAT_UNICAST] = recv_unicast_packet;
+ /* fragmented unicast packet */
+ recv_packet_handler[BAT_UNICAST_FRAG] = recv_ucast_frag_packet;
+ /* broadcast packet */
+ recv_packet_handler[BAT_BCAST] = recv_bcast_packet;
+ /* vis packet */
+ recv_packet_handler[BAT_VIS] = recv_vis_packet;
+ /* Translation table query (request or response) */
+ recv_packet_handler[BAT_TT_QUERY] = recv_tt_query;
+ /* Roaming advertisement */
+ recv_packet_handler[BAT_ROAM_ADV] = recv_roam_adv;
+}
+
+int recv_handler_register(uint8_t packet_type,
+ int (*recv_handler)(struct sk_buff *,
+ struct hard_iface *))
+{
+ if (recv_packet_handler[packet_type] != &recv_unhandled_packet)
+ return -EBUSY;
+
+ recv_packet_handler[packet_type] = recv_handler;
+ return 0;
+}
+
+void recv_handler_unregister(uint8_t packet_type)
+{
+ recv_packet_handler[packet_type] = recv_unhandled_packet;
+}
+
static struct bat_algo_ops *bat_algo_get(char *name)
{
struct bat_algo_ops *bat_algo_ops = NULL, *bat_algo_ops_tmp;
diff --git a/main.h b/main.h
index 218be63..c25ad17 100644
--- a/main.h
+++ b/main.h
@@ -178,6 +178,12 @@ void mesh_free(struct net_device *soft_iface);
void inc_module_count(void);
void dec_module_count(void);
int is_my_mac(const uint8_t *addr);
+int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
+ struct packet_type *ptype, struct net_device *orig_dev);
+int recv_handler_register(uint8_t packet_type,
+ int (*recv_handler)(struct sk_buff *,
+ struct hard_iface *));
+void recv_handler_unregister(uint8_t packet_type);
int bat_algo_register(struct bat_algo_ops *bat_algo_ops);
int bat_algo_select(struct bat_priv *bat_priv, char *name);
int bat_algo_seq_print_text(struct seq_file *seq, void *offset);
--
1.7.9
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [B.A.T.M.A.N.] [PATCH 3/6] batman-adv: register batman ogm receive function during protocol init
2012-03-01 7:35 [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 2/6] batman-adv: introduce packet type handler array for incoming packets Marek Lindner
@ 2012-03-01 7:35 ` Marek Lindner
2012-03-03 17:59 ` Simon Wunderlich
2012-03-04 8:56 ` [B.A.T.M.A.N.] [PATCHv2 " Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 4/6] batman-adv: rename last_valid to last_seen Marek Lindner
` (4 subsequent siblings)
6 siblings, 2 replies; 18+ messages in thread
From: Marek Lindner @ 2012-03-01 7:35 UTC (permalink / raw)
To: b.a.t.m.a.n; +Cc: Marek Lindner
The B.A.T.M.A.N. IV OGM receive function still was hard-coded although
it is a routing protocol specific function. This patch takes advantage
of the dynamic packet handler registration to remove the hard-coded
function calls.
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
---
bat_iv_ogm.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++----
main.c | 5 +----
routing.c | 33 ---------------------------------
routing.h | 1 -
types.h | 3 ---
5 files changed, 53 insertions(+), 45 deletions(-)
diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c
index aba0204..5833a3e 100644
--- a/bat_iv_ogm.c
+++ b/bat_iv_ogm.c
@@ -1166,8 +1166,8 @@ out:
orig_node_free_ref(orig_node);
}
-static void bat_iv_ogm_receive(struct hard_iface *if_incoming,
- struct sk_buff *skb)
+static void _bat_iv_ogm_receive(struct sk_buff *skb,
+ struct hard_iface *if_incoming)
{
struct batman_ogm_packet *batman_ogm_packet;
struct ethhdr *ethhdr;
@@ -1200,6 +1200,39 @@ static void bat_iv_ogm_receive(struct hard_iface *if_incoming,
batman_ogm_packet->tt_num_changes));
}
+static int bat_iv_ogm_receive(struct sk_buff *skb,
+ struct hard_iface *hard_iface)
+{
+ struct ethhdr *ethhdr;
+
+ /* drop packet if it has not necessary minimum size */
+ if (unlikely(!pskb_may_pull(skb, BATMAN_OGM_HLEN)))
+ return NET_RX_DROP;
+
+ ethhdr = (struct ethhdr *)skb_mac_header(skb);
+
+ /* packet with broadcast indication but unicast recipient */
+ if (!is_broadcast_ether_addr(ethhdr->h_dest))
+ return NET_RX_DROP;
+
+ /* packet with broadcast sender address */
+ if (is_broadcast_ether_addr(ethhdr->h_source))
+ return NET_RX_DROP;
+
+ /* create a copy of the skb, if needed, to modify it. */
+ if (skb_cow(skb, 0) < 0)
+ return NET_RX_DROP;
+
+ /* keep skb linear */
+ if (skb_linearize(skb) < 0)
+ return NET_RX_DROP;
+
+ _bat_iv_ogm_receive(skb, hard_iface);
+
+ kfree_skb(skb);
+ return NET_RX_SUCCESS;
+}
+
static struct bat_algo_ops batman_iv __read_mostly = {
.name = "BATMAN IV",
.bat_iface_enable = bat_iv_ogm_iface_enable,
@@ -1208,10 +1241,25 @@ static struct bat_algo_ops batman_iv __read_mostly = {
.bat_ogm_update_mac = bat_iv_ogm_update_mac,
.bat_ogm_schedule = bat_iv_ogm_schedule,
.bat_ogm_emit = bat_iv_ogm_emit,
- .bat_ogm_receive = bat_iv_ogm_receive,
};
int __init bat_iv_init(void)
{
- return bat_algo_register(&batman_iv);
+ int ret;
+
+ /* batman originator packet */
+ ret = recv_handler_register(BAT_IV_OGM, bat_iv_ogm_receive);
+ if (ret < 0)
+ goto out;
+
+ ret = bat_algo_register(&batman_iv);
+ if (ret < 0)
+ goto handler_unregister;
+
+ goto out;
+
+handler_unregister:
+ recv_handler_unregister(BAT_IV_OGM);
+out:
+ return ret;
}
diff --git a/main.c b/main.c
index 0d0cd48..8c3ff21 100644
--- a/main.c
+++ b/main.c
@@ -263,8 +263,6 @@ static void recv_handler_init(void)
for (i = 0; i < ARRAY_SIZE(recv_packet_handler); i++)
recv_packet_handler[i] = recv_unhandled_packet;
- /* batman originator packet */
- recv_packet_handler[BAT_IV_OGM] = recv_bat_ogm_packet;
/* batman icmp packet */
recv_packet_handler[BAT_ICMP] = recv_icmp_packet;
/* unicast packet */
@@ -331,8 +329,7 @@ int bat_algo_register(struct bat_algo_ops *bat_algo_ops)
!bat_algo_ops->bat_primary_iface_set ||
!bat_algo_ops->bat_ogm_update_mac ||
!bat_algo_ops->bat_ogm_schedule ||
- !bat_algo_ops->bat_ogm_emit ||
- !bat_algo_ops->bat_ogm_receive) {
+ !bat_algo_ops->bat_ogm_emit) {
pr_info("Routing algo '%s' does not implement required ops\n",
bat_algo_ops->name);
goto out;
diff --git a/routing.c b/routing.c
index 0da9f5a..9ec4593 100644
--- a/routing.c
+++ b/routing.c
@@ -248,39 +248,6 @@ int window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff,
return 0;
}
-int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *hard_iface)
-{
- struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
- struct ethhdr *ethhdr;
-
- /* drop packet if it has not necessary minimum size */
- if (unlikely(!pskb_may_pull(skb, BATMAN_OGM_HLEN)))
- return NET_RX_DROP;
-
- ethhdr = (struct ethhdr *)skb_mac_header(skb);
-
- /* packet with broadcast indication but unicast recipient */
- if (!is_broadcast_ether_addr(ethhdr->h_dest))
- return NET_RX_DROP;
-
- /* packet with broadcast sender address */
- if (is_broadcast_ether_addr(ethhdr->h_source))
- return NET_RX_DROP;
-
- /* create a copy of the skb, if needed, to modify it. */
- if (skb_cow(skb, 0) < 0)
- return NET_RX_DROP;
-
- /* keep skb linear */
- if (skb_linearize(skb) < 0)
- return NET_RX_DROP;
-
- bat_priv->bat_algo_ops->bat_ogm_receive(hard_iface, skb);
-
- kfree_skb(skb);
- return NET_RX_SUCCESS;
-}
-
static int recv_my_icmp_packet(struct bat_priv *bat_priv,
struct sk_buff *skb, size_t icmp_len)
{
diff --git a/routing.h b/routing.h
index 3d729cb..d69a5a0 100644
--- a/routing.h
+++ b/routing.h
@@ -30,7 +30,6 @@ int recv_unicast_packet(struct sk_buff *skb, struct hard_iface *recv_if);
int recv_ucast_frag_packet(struct sk_buff *skb, struct hard_iface *recv_if);
int recv_bcast_packet(struct sk_buff *skb, struct hard_iface *recv_if);
int recv_vis_packet(struct sk_buff *skb, struct hard_iface *recv_if);
-int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *recv_if);
int recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if);
int recv_roam_adv(struct sk_buff *skb, struct hard_iface *recv_if);
struct neigh_node *find_router(struct bat_priv *bat_priv,
diff --git a/types.h b/types.h
index 6a3cc88..51c59c2 100644
--- a/types.h
+++ b/types.h
@@ -408,9 +408,6 @@ struct bat_algo_ops {
int tt_num_changes);
/* send scheduled OGM */
void (*bat_ogm_emit)(struct forw_packet *forw_packet);
- /* receive incoming OGM */
- void (*bat_ogm_receive)(struct hard_iface *if_incoming,
- struct sk_buff *skb);
};
struct dht_candidate {
--
1.7.9
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [B.A.T.M.A.N.] [PATCH 4/6] batman-adv: rename last_valid to last_seen
2012-03-01 7:35 [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 2/6] batman-adv: introduce packet type handler array for incoming packets Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 3/6] batman-adv: register batman ogm receive function during protocol init Marek Lindner
@ 2012-03-01 7:35 ` Marek Lindner
2012-03-05 19:30 ` Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 5/6] batman-adv: replace HZ calculations with jiffies_to_msecs() Marek Lindner
` (3 subsequent siblings)
6 siblings, 1 reply; 18+ messages in thread
From: Marek Lindner @ 2012-03-01 7:35 UTC (permalink / raw)
To: b.a.t.m.a.n; +Cc: Marek Lindner
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
---
bat_iv_ogm.c | 8 ++++----
originator.c | 16 ++++++++--------
types.h | 8 ++++----
3 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c
index 5833a3e..209722f 100644
--- a/bat_iv_ogm.c
+++ b/bat_iv_ogm.c
@@ -655,7 +655,7 @@ static void bat_iv_ogm_orig_update(struct bat_priv *bat_priv,
rcu_read_unlock();
orig_node->flags = batman_ogm_packet->flags;
- neigh_node->last_valid = jiffies;
+ neigh_node->last_seen = jiffies;
spin_lock_bh(&neigh_node->tq_lock);
ring_buffer_set(neigh_node->tq_recv,
@@ -776,11 +776,11 @@ static int bat_iv_ogm_calc_tq(struct orig_node *orig_node,
if (!neigh_node)
goto out;
- /* if orig_node is direct neighbor update neigh_node last_valid */
+ /* if orig_node is direct neighbor update neigh_node last_seen */
if (orig_node == orig_neigh_node)
- neigh_node->last_valid = jiffies;
+ neigh_node->last_seen = jiffies;
- orig_node->last_valid = jiffies;
+ orig_node->last_seen = jiffies;
/* find packet count of corresponding one hop neighbor */
spin_lock_bh(&orig_node->ogm_cnt_lock);
diff --git a/originator.c b/originator.c
index 06c8187..aa33337 100644
--- a/originator.c
+++ b/originator.c
@@ -285,7 +285,7 @@ static bool purge_orig_neighbors(struct bat_priv *bat_priv,
hlist_for_each_entry_safe(neigh_node, node, node_tmp,
&orig_node->neigh_list, list) {
- if ((has_timed_out(neigh_node->last_valid, PURGE_TIMEOUT)) ||
+ if ((has_timed_out(neigh_node->last_seen, PURGE_TIMEOUT)) ||
(neigh_node->if_incoming->if_status == IF_INACTIVE) ||
(neigh_node->if_incoming->if_status == IF_NOT_IN_USE) ||
(neigh_node->if_incoming->if_status == IF_TO_BE_REMOVED)) {
@@ -304,9 +304,9 @@ static bool purge_orig_neighbors(struct bat_priv *bat_priv,
else
bat_dbg(DBG_BATMAN, bat_priv,
"neighbor timeout: originator %pM, "
- "neighbor: %pM, last_valid: %lu\n",
+ "neighbor: %pM, last_seen: %lu\n",
orig_node->orig, neigh_node->addr,
- (neigh_node->last_valid / HZ));
+ (neigh_node->last_seen / HZ));
neigh_purged = true;
@@ -329,10 +329,10 @@ static bool purge_orig_node(struct bat_priv *bat_priv,
{
struct neigh_node *best_neigh_node;
- if (has_timed_out(orig_node->last_valid, 2 * PURGE_TIMEOUT)) {
+ if (has_timed_out(orig_node->last_seen, 2 * PURGE_TIMEOUT)) {
bat_dbg(DBG_BATMAN, bat_priv,
- "Originator timeout: originator %pM, last_valid %lu\n",
- orig_node->orig, (orig_node->last_valid / HZ));
+ "Originator timeout: originator %pM, last_seen %lu\n",
+ orig_node->orig, (orig_node->last_seen / HZ));
return true;
} else {
if (purge_orig_neighbors(bat_priv, orig_node,
@@ -450,9 +450,9 @@ int orig_seq_print_text(struct seq_file *seq, void *offset)
goto next;
last_seen_secs = jiffies_to_msecs(jiffies -
- orig_node->last_valid) / 1000;
+ orig_node->last_seen) / 1000;
last_seen_msecs = jiffies_to_msecs(jiffies -
- orig_node->last_valid) % 1000;
+ orig_node->last_seen) % 1000;
seq_printf(seq, "%pM %4i.%03is (%3i) %pM [%10s]:",
orig_node->orig, last_seen_secs,
diff --git a/types.h b/types.h
index 51c59c2..0643271 100644
--- a/types.h
+++ b/types.h
@@ -64,7 +64,7 @@ struct hard_iface {
/**
* orig_node - structure for orig_list maintaining nodes of mesh
* @primary_addr: hosts primary interface address
- * @last_valid: when last packet from this node was received
+ * @last_seen: when last packet from this node was received
* @bcast_seqno_reset: time when the broadcast seqno window was reset
* @batman_seqno_reset: time when the batman seqno window was reset
* @gw_flags: flags related to gateway class
@@ -85,7 +85,7 @@ struct orig_node {
struct neigh_node __rcu *router; /* rcu protected pointer */
unsigned long *bcast_own;
uint8_t *bcast_own_sum;
- unsigned long last_valid;
+ unsigned long last_seen;
unsigned long bcast_seqno_reset;
unsigned long batman_seqno_reset;
uint8_t gw_flags;
@@ -135,7 +135,7 @@ struct gw_node {
/**
* neigh_node
- * @last_valid: when last packet via this neighbor was received
+ * @last_seen: when last packet via this neighbor was received
*/
struct neigh_node {
struct hlist_node list;
@@ -146,7 +146,7 @@ struct neigh_node {
uint8_t tq_avg;
uint8_t last_ttl;
struct list_head bonding_list;
- unsigned long last_valid;
+ unsigned long last_seen;
DECLARE_BITMAP(real_bits, TQ_LOCAL_WINDOW_SIZE);
atomic_t refcount;
struct rcu_head rcu;
--
1.7.9
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [B.A.T.M.A.N.] [PATCH 5/6] batman-adv: replace HZ calculations with jiffies_to_msecs()
2012-03-01 7:35 [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability Marek Lindner
` (2 preceding siblings ...)
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 4/6] batman-adv: rename last_valid to last_seen Marek Lindner
@ 2012-03-01 7:35 ` Marek Lindner
2012-03-05 19:33 ` Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 6/6] batman-adv: split neigh_new function into generic and batman iv specific parts Marek Lindner
` (2 subsequent siblings)
6 siblings, 1 reply; 18+ messages in thread
From: Marek Lindner @ 2012-03-01 7:35 UTC (permalink / raw)
To: b.a.t.m.a.n; +Cc: Marek Lindner
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
---
bat_debugfs.c | 4 ++--
originator.c | 15 ++++++++++-----
send.c | 2 +-
3 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/bat_debugfs.c b/bat_debugfs.c
index 916380c..3b588f8 100644
--- a/bat_debugfs.c
+++ b/bat_debugfs.c
@@ -83,8 +83,8 @@ int debug_log(struct bat_priv *bat_priv, const char *fmt, ...)
va_start(args, fmt);
vscnprintf(tmp_log_buf, sizeof(tmp_log_buf), fmt, args);
- fdebug_log(bat_priv->debug_log, "[%10lu] %s",
- (jiffies / HZ), tmp_log_buf);
+ fdebug_log(bat_priv->debug_log, "[%10u] %s",
+ jiffies_to_msecs(jiffies), tmp_log_buf);
va_end(args);
return 0;
diff --git a/originator.c b/originator.c
index aa33337..183a1fe 100644
--- a/originator.c
+++ b/originator.c
@@ -36,7 +36,8 @@ static void purge_orig(struct work_struct *work);
static void start_purge_timer(struct bat_priv *bat_priv)
{
INIT_DELAYED_WORK(&bat_priv->orig_work, purge_orig);
- queue_delayed_work(bat_event_workqueue, &bat_priv->orig_work, 1 * HZ);
+ queue_delayed_work(bat_event_workqueue,
+ &bat_priv->orig_work, msecs_to_jiffies(1000));
}
/* returns 1 if they are the same originator */
@@ -276,6 +277,7 @@ static bool purge_orig_neighbors(struct bat_priv *bat_priv,
struct hlist_node *node, *node_tmp;
struct neigh_node *neigh_node;
bool neigh_purged = false;
+ unsigned long last_seen;
*best_neigh_node = NULL;
@@ -290,6 +292,8 @@ static bool purge_orig_neighbors(struct bat_priv *bat_priv,
(neigh_node->if_incoming->if_status == IF_NOT_IN_USE) ||
(neigh_node->if_incoming->if_status == IF_TO_BE_REMOVED)) {
+ last_seen = neigh_node->last_seen;
+
if ((neigh_node->if_incoming->if_status ==
IF_INACTIVE) ||
(neigh_node->if_incoming->if_status ==
@@ -304,9 +308,9 @@ static bool purge_orig_neighbors(struct bat_priv *bat_priv,
else
bat_dbg(DBG_BATMAN, bat_priv,
"neighbor timeout: originator %pM, "
- "neighbor: %pM, last_seen: %lu\n",
+ "neighbor: %pM, last_seen: %u\n",
orig_node->orig, neigh_node->addr,
- (neigh_node->last_seen / HZ));
+ jiffies_to_msecs(last_seen));
neigh_purged = true;
@@ -331,8 +335,9 @@ static bool purge_orig_node(struct bat_priv *bat_priv,
if (has_timed_out(orig_node->last_seen, 2 * PURGE_TIMEOUT)) {
bat_dbg(DBG_BATMAN, bat_priv,
- "Originator timeout: originator %pM, last_seen %lu\n",
- orig_node->orig, (orig_node->last_seen / HZ));
+ "Originator timeout: originator %pM, last_seen %u\n",
+ orig_node->orig,
+ jiffies_to_msecs(orig_node->last_seen));
return true;
} else {
if (purge_orig_neighbors(bat_priv, orig_node,
diff --git a/send.c b/send.c
index f7f5e3a..0d01e2b 100644
--- a/send.c
+++ b/send.c
@@ -296,7 +296,7 @@ static void send_outstanding_bcast_packet(struct work_struct *work)
/* if we still have some more bcasts to send */
if (forw_packet->num_packets < 3) {
_add_bcast_packet_to_list(bat_priv, forw_packet,
- ((5 * HZ) / 1000));
+ msecs_to_jiffies(5));
return;
}
--
1.7.9
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [B.A.T.M.A.N.] [PATCH 6/6] batman-adv: split neigh_new function into generic and batman iv specific parts
2012-03-01 7:35 [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability Marek Lindner
` (3 preceding siblings ...)
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 5/6] batman-adv: replace HZ calculations with jiffies_to_msecs() Marek Lindner
@ 2012-03-01 7:35 ` Marek Lindner
2012-03-05 19:36 ` Marek Lindner
2012-03-03 18:02 ` [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability Simon Wunderlich
2012-03-05 19:22 ` Marek Lindner
6 siblings, 1 reply; 18+ messages in thread
From: Marek Lindner @ 2012-03-01 7:35 UTC (permalink / raw)
To: b.a.t.m.a.n; +Cc: Marek Lindner
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
---
bat_iv_ogm.c | 40 ++++++++++++++++++++++++++++++++++------
originator.c | 27 ++++++++++-----------------
originator.h | 6 ++----
3 files changed, 46 insertions(+), 27 deletions(-)
diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c
index 209722f..2d2cc73 100644
--- a/bat_iv_ogm.c
+++ b/bat_iv_ogm.c
@@ -30,6 +30,32 @@
#include "send.h"
#include "bat_algo.h"
+static struct neigh_node *bat_iv_ogm_neigh_new(struct hard_iface *hard_iface,
+ const uint8_t *neigh_addr,
+ struct orig_node *orig_node,
+ struct orig_node *orig_neigh,
+ uint32_t seqno)
+{
+ struct neigh_node *neigh_node;
+
+ neigh_node = neigh_node_new(hard_iface, neigh_addr, seqno);
+ if (!neigh_node)
+ goto out;
+
+ INIT_LIST_HEAD(&neigh_node->bonding_list);
+ spin_lock_init(&neigh_node->tq_lock);
+
+ neigh_node->orig_node = orig_neigh;
+ neigh_node->if_incoming = hard_iface;
+
+ spin_lock_bh(&orig_node->neigh_list_lock);
+ hlist_add_head_rcu(&neigh_node->list, &orig_node->neigh_list);
+ spin_unlock_bh(&orig_node->neigh_list_lock);
+
+out:
+ return neigh_node;
+}
+
static int bat_iv_ogm_iface_enable(struct hard_iface *hard_iface)
{
struct batman_ogm_packet *batman_ogm_packet;
@@ -642,8 +668,9 @@ static void bat_iv_ogm_orig_update(struct bat_priv *bat_priv,
if (!orig_tmp)
goto unlock;
- neigh_node = create_neighbor(orig_node, orig_tmp,
- ethhdr->h_source, if_incoming);
+ neigh_node = bat_iv_ogm_neigh_new(if_incoming, ethhdr->h_source,
+ orig_node, orig_tmp,
+ batman_ogm_packet->seqno);
orig_node_free_ref(orig_tmp);
if (!neigh_node)
@@ -768,10 +795,11 @@ static int bat_iv_ogm_calc_tq(struct orig_node *orig_node,
rcu_read_unlock();
if (!neigh_node)
- neigh_node = create_neighbor(orig_neigh_node,
- orig_neigh_node,
- orig_neigh_node->orig,
- if_incoming);
+ neigh_node = bat_iv_ogm_neigh_new(if_incoming,
+ orig_neigh_node->orig,
+ orig_neigh_node,
+ orig_neigh_node,
+ batman_ogm_packet->seqno);
if (!neigh_node)
goto out;
diff --git a/originator.c b/originator.c
index 183a1fe..9f32aa0 100644
--- a/originator.c
+++ b/originator.c
@@ -86,35 +86,28 @@ struct neigh_node *orig_node_get_router(struct orig_node *orig_node)
return router;
}
-struct neigh_node *create_neighbor(struct orig_node *orig_node,
- struct orig_node *orig_neigh_node,
- const uint8_t *neigh,
- struct hard_iface *if_incoming)
+struct neigh_node *neigh_node_new(struct hard_iface *hard_iface,
+ const uint8_t *neigh_addr, uint32_t seqno)
{
- struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
+ struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
struct neigh_node *neigh_node;
- bat_dbg(DBG_BATMAN, bat_priv,
- "Creating new last-hop neighbor of originator\n");
-
neigh_node = kzalloc(sizeof(*neigh_node), GFP_ATOMIC);
if (!neigh_node)
- return NULL;
+ goto out;
INIT_HLIST_NODE(&neigh_node->list);
- INIT_LIST_HEAD(&neigh_node->bonding_list);
- spin_lock_init(&neigh_node->tq_lock);
- memcpy(neigh_node->addr, neigh, ETH_ALEN);
- neigh_node->orig_node = orig_neigh_node;
- neigh_node->if_incoming = if_incoming;
+ memcpy(neigh_node->addr, neigh_addr, ETH_ALEN);
/* extra reference for return */
atomic_set(&neigh_node->refcount, 2);
- spin_lock_bh(&orig_node->neigh_list_lock);
- hlist_add_head_rcu(&neigh_node->list, &orig_node->neigh_list);
- spin_unlock_bh(&orig_node->neigh_list_lock);
+ bat_dbg(DBG_BATMAN, bat_priv,
+ "Creating new neighbor %pM, initial seqno %d\n",
+ neigh_addr, seqno);
+
+out:
return neigh_node;
}
diff --git a/originator.h b/originator.h
index 3fe2eda..64c5d94 100644
--- a/originator.h
+++ b/originator.h
@@ -29,10 +29,8 @@ void originator_free(struct bat_priv *bat_priv);
void purge_orig_ref(struct bat_priv *bat_priv);
void orig_node_free_ref(struct orig_node *orig_node);
struct orig_node *get_orig_node(struct bat_priv *bat_priv, const uint8_t *addr);
-struct neigh_node *create_neighbor(struct orig_node *orig_node,
- struct orig_node *orig_neigh_node,
- const uint8_t *neigh,
- struct hard_iface *if_incoming);
+struct neigh_node *neigh_node_new(struct hard_iface *hard_iface,
+ const uint8_t *neigh_addr, uint32_t seqno);
void neigh_node_free_ref(struct neigh_node *neigh_node);
struct neigh_node *orig_node_get_router(struct orig_node *orig_node);
int orig_seq_print_text(struct seq_file *seq, void *offset);
--
1.7.9
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCH 2/6] batman-adv: introduce packet type handler array for incoming packets
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 2/6] batman-adv: introduce packet type handler array for incoming packets Marek Lindner
@ 2012-03-01 8:32 ` Sven Eckelmann
2012-03-05 19:26 ` Marek Lindner
1 sibling, 0 replies; 18+ messages in thread
From: Sven Eckelmann @ 2012-03-01 8:32 UTC (permalink / raw)
To: b.a.t.m.a.n; +Cc: Marek Lindner
[-- Attachment #1: Type: text/plain, Size: 518 bytes --]
On Thursday 01 March 2012 15:35:17 Marek Lindner wrote:
> The packet handler array replaces the growing switch statement,
> thus
> dealing with incoming packets in a more efficient way.
Usually (there are corner cases) the compiler tries to build such kind of jump
table from a large switch block. So be careful with this statement.
> It also adds
> to possibility to register packet handlers on the fly.
This is true.
Only scrolled over the patch and it looks like the thing we discussed :)
Kind regards,
Sven
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCH 3/6] batman-adv: register batman ogm receive function during protocol init
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 3/6] batman-adv: register batman ogm receive function during protocol init Marek Lindner
@ 2012-03-03 17:59 ` Simon Wunderlich
2012-03-04 8:17 ` Marek Lindner
2012-03-04 8:56 ` [B.A.T.M.A.N.] [PATCHv2 " Marek Lindner
1 sibling, 1 reply; 18+ messages in thread
From: Simon Wunderlich @ 2012-03-03 17:59 UTC (permalink / raw)
To: The list for a Better Approach To Mobile Ad-hoc Networking
[-- Attachment #1: Type: text/plain, Size: 1985 bytes --]
On Thu, Mar 01, 2012 at 03:35:18PM +0800, Marek Lindner wrote:
> -static void bat_iv_ogm_receive(struct hard_iface *if_incoming,
> - struct sk_buff *skb)
> +static void _bat_iv_ogm_receive(struct sk_buff *skb,
> + struct hard_iface *if_incoming)
<rant>
Personally, I don't like underscore functions. They are usually created
because of a lack of creativity, but are later called from different places,
do different jobs and in the end everyone is confused. :) Is it possibble to
change the name, e.g. to bat_iv_ogm_handle()?
</rant>
> {
> struct batman_ogm_packet *batman_ogm_packet;
> struct ethhdr *ethhdr;
> @@ -1200,6 +1200,39 @@ static void bat_iv_ogm_receive(struct hard_iface *if_incoming,
> batman_ogm_packet->tt_num_changes));
> }
>
> +static int bat_iv_ogm_receive(struct sk_buff *skb,
> + struct hard_iface *hard_iface)
> +{
> + struct ethhdr *ethhdr;
> +
> + /* drop packet if it has not necessary minimum size */
> + if (unlikely(!pskb_may_pull(skb, BATMAN_OGM_HLEN)))
> + return NET_RX_DROP;
> +
> + ethhdr = (struct ethhdr *)skb_mac_header(skb);
> +
> + /* packet with broadcast indication but unicast recipient */
> + if (!is_broadcast_ether_addr(ethhdr->h_dest))
> + return NET_RX_DROP;
> +
> + /* packet with broadcast sender address */
> + if (is_broadcast_ether_addr(ethhdr->h_source))
> + return NET_RX_DROP;
> +
> + /* create a copy of the skb, if needed, to modify it. */
> + if (skb_cow(skb, 0) < 0)
> + return NET_RX_DROP;
> +
> + /* keep skb linear */
> + if (skb_linearize(skb) < 0)
> + return NET_RX_DROP;
> +
> + _bat_iv_ogm_receive(skb, hard_iface);
> +
> + kfree_skb(skb);
> + return NET_RX_SUCCESS;
> +}
> +
We should somewhere add a check whether the hard_iface is actually assigned to
a mesh using the BATMAN IV algorithm. When more algorithms are added, we only want
the assigned protocol to be handled, others should be ignored.
Cheers,
Simon
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability
2012-03-01 7:35 [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability Marek Lindner
` (4 preceding siblings ...)
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 6/6] batman-adv: split neigh_new function into generic and batman iv specific parts Marek Lindner
@ 2012-03-03 18:02 ` Simon Wunderlich
2012-03-05 19:22 ` Marek Lindner
6 siblings, 0 replies; 18+ messages in thread
From: Simon Wunderlich @ 2012-03-03 18:02 UTC (permalink / raw)
To: The list for a Better Approach To Mobile Ad-hoc Networking
[-- Attachment #1: Type: text/plain, Size: 390 bytes --]
Hey Marek,
I did a rough review over your patches, and a more detailed one to the HZ/jiffies
patch. Looks fine, nice approach to get some more compatibility in. You've also
added the handler table from our beer discussion - nice. ;)
Apart from some minor comments on patch no. 3, feel free to add
Acked-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
to all the patches.
Cheers,
Simon
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCH 3/6] batman-adv: register batman ogm receive function during protocol init
2012-03-03 17:59 ` Simon Wunderlich
@ 2012-03-04 8:17 ` Marek Lindner
0 siblings, 0 replies; 18+ messages in thread
From: Marek Lindner @ 2012-03-04 8:17 UTC (permalink / raw)
To: The list for a Better Approach To Mobile Ad-hoc Networking
On Sunday, March 04, 2012 01:59:53 Simon Wunderlich wrote:
> On Thu, Mar 01, 2012 at 03:35:18PM +0800, Marek Lindner wrote:
> > -static void bat_iv_ogm_receive(struct hard_iface *if_incoming,
> > - struct sk_buff *skb)
> > +static void _bat_iv_ogm_receive(struct sk_buff *skb,
> > + struct hard_iface *if_incoming)
>
> <rant>
> Personally, I don't like underscore functions. They are usually created
> because of a lack of creativity, but are later called from different
> places, do different jobs and in the end everyone is confused. :) Is it
> possibble to change the name, e.g. to bat_iv_ogm_handle()?
> </rant>
Hmm.., I kind of agree. I'll think about another solution. :-)
> We should somewhere add a check whether the hard_iface is actually assigned
> to a mesh using the BATMAN IV algorithm. When more algorithms are added,
> we only want the assigned protocol to be handled, others should be
> ignored.
You are right - we need a check but not necessarily in this patch. We lived
without such a check for quite while. This patch is not introducing a loophole
that did not exist before. I'll send a separate patch.
Thanks for the comments!
Cheers,
Marek
^ permalink raw reply [flat|nested] 18+ messages in thread
* [B.A.T.M.A.N.] [PATCHv2 3/6] batman-adv: register batman ogm receive function during protocol init
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 3/6] batman-adv: register batman ogm receive function during protocol init Marek Lindner
2012-03-03 17:59 ` Simon Wunderlich
@ 2012-03-04 8:56 ` Marek Lindner
2012-03-05 18:21 ` Simon Wunderlich
2012-03-05 19:28 ` Marek Lindner
1 sibling, 2 replies; 18+ messages in thread
From: Marek Lindner @ 2012-03-04 8:56 UTC (permalink / raw)
To: b.a.t.m.a.n; +Cc: Marek Lindner
The B.A.T.M.A.N. IV OGM receive function still was hard-coded although
it is a routing protocol specific function. This patch takes advantage
of the dynamic packet handler registration to remove the hard-coded
function calls.
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
---
bat_iv_ogm.c | 31 +++++++++++++++++++++++++++----
main.c | 5 +----
routing.c | 22 ++++++++++------------
routing.h | 4 +++-
types.h | 3 ---
5 files changed, 41 insertions(+), 24 deletions(-)
diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c
index aba0204..784fcef 100644
--- a/bat_iv_ogm.c
+++ b/bat_iv_ogm.c
@@ -1166,13 +1166,18 @@ out:
orig_node_free_ref(orig_node);
}
-static void bat_iv_ogm_receive(struct hard_iface *if_incoming,
- struct sk_buff *skb)
+static int bat_iv_ogm_receive(struct sk_buff *skb,
+ struct hard_iface *if_incoming)
{
struct batman_ogm_packet *batman_ogm_packet;
struct ethhdr *ethhdr;
int buff_pos = 0, packet_len;
unsigned char *tt_buff, *packet_buff;
+ bool ret;
+
+ ret = check_management_packet(skb, if_incoming, BATMAN_OGM_HLEN);
+ if (!ret)
+ return NET_RX_DROP;
packet_len = skb_headlen(skb);
ethhdr = (struct ethhdr *)skb_mac_header(skb);
@@ -1198,6 +1203,9 @@ static void bat_iv_ogm_receive(struct hard_iface *if_incoming,
(packet_buff + buff_pos);
} while (bat_iv_ogm_aggr_packet(buff_pos, packet_len,
batman_ogm_packet->tt_num_changes));
+
+ kfree_skb(skb);
+ return NET_RX_SUCCESS;
}
static struct bat_algo_ops batman_iv __read_mostly = {
@@ -1208,10 +1216,25 @@ static struct bat_algo_ops batman_iv __read_mostly = {
.bat_ogm_update_mac = bat_iv_ogm_update_mac,
.bat_ogm_schedule = bat_iv_ogm_schedule,
.bat_ogm_emit = bat_iv_ogm_emit,
- .bat_ogm_receive = bat_iv_ogm_receive,
};
int __init bat_iv_init(void)
{
- return bat_algo_register(&batman_iv);
+ int ret;
+
+ /* batman originator packet */
+ ret = recv_handler_register(BAT_IV_OGM, bat_iv_ogm_receive);
+ if (ret < 0)
+ goto out;
+
+ ret = bat_algo_register(&batman_iv);
+ if (ret < 0)
+ goto handler_unregister;
+
+ goto out;
+
+handler_unregister:
+ recv_handler_unregister(BAT_IV_OGM);
+out:
+ return ret;
}
diff --git a/main.c b/main.c
index 0d0cd48..8c3ff21 100644
--- a/main.c
+++ b/main.c
@@ -263,8 +263,6 @@ static void recv_handler_init(void)
for (i = 0; i < ARRAY_SIZE(recv_packet_handler); i++)
recv_packet_handler[i] = recv_unhandled_packet;
- /* batman originator packet */
- recv_packet_handler[BAT_IV_OGM] = recv_bat_ogm_packet;
/* batman icmp packet */
recv_packet_handler[BAT_ICMP] = recv_icmp_packet;
/* unicast packet */
@@ -331,8 +329,7 @@ int bat_algo_register(struct bat_algo_ops *bat_algo_ops)
!bat_algo_ops->bat_primary_iface_set ||
!bat_algo_ops->bat_ogm_update_mac ||
!bat_algo_ops->bat_ogm_schedule ||
- !bat_algo_ops->bat_ogm_emit ||
- !bat_algo_ops->bat_ogm_receive) {
+ !bat_algo_ops->bat_ogm_emit) {
pr_info("Routing algo '%s' does not implement required ops\n",
bat_algo_ops->name);
goto out;
diff --git a/routing.c b/routing.c
index 0da9f5a..d83502a 100644
--- a/routing.c
+++ b/routing.c
@@ -248,37 +248,35 @@ int window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff,
return 0;
}
-int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *hard_iface)
+bool check_management_packet(struct sk_buff *skb,
+ struct hard_iface *hard_iface,
+ int header_len)
{
- struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
struct ethhdr *ethhdr;
/* drop packet if it has not necessary minimum size */
- if (unlikely(!pskb_may_pull(skb, BATMAN_OGM_HLEN)))
- return NET_RX_DROP;
+ if (unlikely(!pskb_may_pull(skb, header_len)))
+ return false;
ethhdr = (struct ethhdr *)skb_mac_header(skb);
/* packet with broadcast indication but unicast recipient */
if (!is_broadcast_ether_addr(ethhdr->h_dest))
- return NET_RX_DROP;
+ return false;
/* packet with broadcast sender address */
if (is_broadcast_ether_addr(ethhdr->h_source))
- return NET_RX_DROP;
+ return false;
/* create a copy of the skb, if needed, to modify it. */
if (skb_cow(skb, 0) < 0)
- return NET_RX_DROP;
+ return false;
/* keep skb linear */
if (skb_linearize(skb) < 0)
- return NET_RX_DROP;
-
- bat_priv->bat_algo_ops->bat_ogm_receive(hard_iface, skb);
+ return false;
- kfree_skb(skb);
- return NET_RX_SUCCESS;
+ return true;
}
static int recv_my_icmp_packet(struct bat_priv *bat_priv,
diff --git a/routing.h b/routing.h
index 3d729cb..d6bbbeb 100644
--- a/routing.h
+++ b/routing.h
@@ -23,6 +23,9 @@
#define _NET_BATMAN_ADV_ROUTING_H_
void slide_own_bcast_window(struct hard_iface *hard_iface);
+bool check_management_packet(struct sk_buff *skb,
+ struct hard_iface *hard_iface,
+ int header_len);
void update_route(struct bat_priv *bat_priv, struct orig_node *orig_node,
struct neigh_node *neigh_node);
int recv_icmp_packet(struct sk_buff *skb, struct hard_iface *recv_if);
@@ -30,7 +33,6 @@ int recv_unicast_packet(struct sk_buff *skb, struct hard_iface *recv_if);
int recv_ucast_frag_packet(struct sk_buff *skb, struct hard_iface *recv_if);
int recv_bcast_packet(struct sk_buff *skb, struct hard_iface *recv_if);
int recv_vis_packet(struct sk_buff *skb, struct hard_iface *recv_if);
-int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *recv_if);
int recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if);
int recv_roam_adv(struct sk_buff *skb, struct hard_iface *recv_if);
struct neigh_node *find_router(struct bat_priv *bat_priv,
diff --git a/types.h b/types.h
index 6a3cc88..51c59c2 100644
--- a/types.h
+++ b/types.h
@@ -408,9 +408,6 @@ struct bat_algo_ops {
int tt_num_changes);
/* send scheduled OGM */
void (*bat_ogm_emit)(struct forw_packet *forw_packet);
- /* receive incoming OGM */
- void (*bat_ogm_receive)(struct hard_iface *if_incoming,
- struct sk_buff *skb);
};
struct dht_candidate {
--
1.7.9
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCHv2 3/6] batman-adv: register batman ogm receive function during protocol init
2012-03-04 8:56 ` [B.A.T.M.A.N.] [PATCHv2 " Marek Lindner
@ 2012-03-05 18:21 ` Simon Wunderlich
2012-03-05 19:28 ` Marek Lindner
1 sibling, 0 replies; 18+ messages in thread
From: Simon Wunderlich @ 2012-03-05 18:21 UTC (permalink / raw)
To: The list for a Better Approach To Mobile Ad-hoc Networking
[-- Attachment #1: Type: text/plain, Size: 6760 bytes --]
Hey Marek,
this looks much cleaner. Thanks!
Simon
Acked-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
On Sun, Mar 04, 2012 at 04:56:25PM +0800, Marek Lindner wrote:
> The B.A.T.M.A.N. IV OGM receive function still was hard-coded although
> it is a routing protocol specific function. This patch takes advantage
> of the dynamic packet handler registration to remove the hard-coded
> function calls.
>
> Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
> ---
> bat_iv_ogm.c | 31 +++++++++++++++++++++++++++----
> main.c | 5 +----
> routing.c | 22 ++++++++++------------
> routing.h | 4 +++-
> types.h | 3 ---
> 5 files changed, 41 insertions(+), 24 deletions(-)
>
> diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c
> index aba0204..784fcef 100644
> --- a/bat_iv_ogm.c
> +++ b/bat_iv_ogm.c
> @@ -1166,13 +1166,18 @@ out:
> orig_node_free_ref(orig_node);
> }
>
> -static void bat_iv_ogm_receive(struct hard_iface *if_incoming,
> - struct sk_buff *skb)
> +static int bat_iv_ogm_receive(struct sk_buff *skb,
> + struct hard_iface *if_incoming)
> {
> struct batman_ogm_packet *batman_ogm_packet;
> struct ethhdr *ethhdr;
> int buff_pos = 0, packet_len;
> unsigned char *tt_buff, *packet_buff;
> + bool ret;
> +
> + ret = check_management_packet(skb, if_incoming, BATMAN_OGM_HLEN);
> + if (!ret)
> + return NET_RX_DROP;
>
> packet_len = skb_headlen(skb);
> ethhdr = (struct ethhdr *)skb_mac_header(skb);
> @@ -1198,6 +1203,9 @@ static void bat_iv_ogm_receive(struct hard_iface *if_incoming,
> (packet_buff + buff_pos);
> } while (bat_iv_ogm_aggr_packet(buff_pos, packet_len,
> batman_ogm_packet->tt_num_changes));
> +
> + kfree_skb(skb);
> + return NET_RX_SUCCESS;
> }
>
> static struct bat_algo_ops batman_iv __read_mostly = {
> @@ -1208,10 +1216,25 @@ static struct bat_algo_ops batman_iv __read_mostly = {
> .bat_ogm_update_mac = bat_iv_ogm_update_mac,
> .bat_ogm_schedule = bat_iv_ogm_schedule,
> .bat_ogm_emit = bat_iv_ogm_emit,
> - .bat_ogm_receive = bat_iv_ogm_receive,
> };
>
> int __init bat_iv_init(void)
> {
> - return bat_algo_register(&batman_iv);
> + int ret;
> +
> + /* batman originator packet */
> + ret = recv_handler_register(BAT_IV_OGM, bat_iv_ogm_receive);
> + if (ret < 0)
> + goto out;
> +
> + ret = bat_algo_register(&batman_iv);
> + if (ret < 0)
> + goto handler_unregister;
> +
> + goto out;
> +
> +handler_unregister:
> + recv_handler_unregister(BAT_IV_OGM);
> +out:
> + return ret;
> }
> diff --git a/main.c b/main.c
> index 0d0cd48..8c3ff21 100644
> --- a/main.c
> +++ b/main.c
> @@ -263,8 +263,6 @@ static void recv_handler_init(void)
> for (i = 0; i < ARRAY_SIZE(recv_packet_handler); i++)
> recv_packet_handler[i] = recv_unhandled_packet;
>
> - /* batman originator packet */
> - recv_packet_handler[BAT_IV_OGM] = recv_bat_ogm_packet;
> /* batman icmp packet */
> recv_packet_handler[BAT_ICMP] = recv_icmp_packet;
> /* unicast packet */
> @@ -331,8 +329,7 @@ int bat_algo_register(struct bat_algo_ops *bat_algo_ops)
> !bat_algo_ops->bat_primary_iface_set ||
> !bat_algo_ops->bat_ogm_update_mac ||
> !bat_algo_ops->bat_ogm_schedule ||
> - !bat_algo_ops->bat_ogm_emit ||
> - !bat_algo_ops->bat_ogm_receive) {
> + !bat_algo_ops->bat_ogm_emit) {
> pr_info("Routing algo '%s' does not implement required ops\n",
> bat_algo_ops->name);
> goto out;
> diff --git a/routing.c b/routing.c
> index 0da9f5a..d83502a 100644
> --- a/routing.c
> +++ b/routing.c
> @@ -248,37 +248,35 @@ int window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff,
> return 0;
> }
>
> -int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *hard_iface)
> +bool check_management_packet(struct sk_buff *skb,
> + struct hard_iface *hard_iface,
> + int header_len)
> {
> - struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
> struct ethhdr *ethhdr;
>
> /* drop packet if it has not necessary minimum size */
> - if (unlikely(!pskb_may_pull(skb, BATMAN_OGM_HLEN)))
> - return NET_RX_DROP;
> + if (unlikely(!pskb_may_pull(skb, header_len)))
> + return false;
>
> ethhdr = (struct ethhdr *)skb_mac_header(skb);
>
> /* packet with broadcast indication but unicast recipient */
> if (!is_broadcast_ether_addr(ethhdr->h_dest))
> - return NET_RX_DROP;
> + return false;
>
> /* packet with broadcast sender address */
> if (is_broadcast_ether_addr(ethhdr->h_source))
> - return NET_RX_DROP;
> + return false;
>
> /* create a copy of the skb, if needed, to modify it. */
> if (skb_cow(skb, 0) < 0)
> - return NET_RX_DROP;
> + return false;
>
> /* keep skb linear */
> if (skb_linearize(skb) < 0)
> - return NET_RX_DROP;
> -
> - bat_priv->bat_algo_ops->bat_ogm_receive(hard_iface, skb);
> + return false;
>
> - kfree_skb(skb);
> - return NET_RX_SUCCESS;
> + return true;
> }
>
> static int recv_my_icmp_packet(struct bat_priv *bat_priv,
> diff --git a/routing.h b/routing.h
> index 3d729cb..d6bbbeb 100644
> --- a/routing.h
> +++ b/routing.h
> @@ -23,6 +23,9 @@
> #define _NET_BATMAN_ADV_ROUTING_H_
>
> void slide_own_bcast_window(struct hard_iface *hard_iface);
> +bool check_management_packet(struct sk_buff *skb,
> + struct hard_iface *hard_iface,
> + int header_len);
> void update_route(struct bat_priv *bat_priv, struct orig_node *orig_node,
> struct neigh_node *neigh_node);
> int recv_icmp_packet(struct sk_buff *skb, struct hard_iface *recv_if);
> @@ -30,7 +33,6 @@ int recv_unicast_packet(struct sk_buff *skb, struct hard_iface *recv_if);
> int recv_ucast_frag_packet(struct sk_buff *skb, struct hard_iface *recv_if);
> int recv_bcast_packet(struct sk_buff *skb, struct hard_iface *recv_if);
> int recv_vis_packet(struct sk_buff *skb, struct hard_iface *recv_if);
> -int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *recv_if);
> int recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if);
> int recv_roam_adv(struct sk_buff *skb, struct hard_iface *recv_if);
> struct neigh_node *find_router(struct bat_priv *bat_priv,
> diff --git a/types.h b/types.h
> index 6a3cc88..51c59c2 100644
> --- a/types.h
> +++ b/types.h
> @@ -408,9 +408,6 @@ struct bat_algo_ops {
> int tt_num_changes);
> /* send scheduled OGM */
> void (*bat_ogm_emit)(struct forw_packet *forw_packet);
> - /* receive incoming OGM */
> - void (*bat_ogm_receive)(struct hard_iface *if_incoming,
> - struct sk_buff *skb);
> };
>
> struct dht_candidate {
> --
> 1.7.9
>
>
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability
2012-03-01 7:35 [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability Marek Lindner
` (5 preceding siblings ...)
2012-03-03 18:02 ` [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability Simon Wunderlich
@ 2012-03-05 19:22 ` Marek Lindner
6 siblings, 0 replies; 18+ messages in thread
From: Marek Lindner @ 2012-03-05 19:22 UTC (permalink / raw)
To: The list for a Better Approach To Mobile Ad-hoc Networking
On Thursday, March 01, 2012 15:35:16 Marek Lindner wrote:
> Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
> ---
> bat_iv_ogm.c | 16 +++++++++-------
> 1 files changed, 9 insertions(+), 7 deletions(-)
Applied in revision 94df16a.
Regards,
Marek
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCH 2/6] batman-adv: introduce packet type handler array for incoming packets
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 2/6] batman-adv: introduce packet type handler array for incoming packets Marek Lindner
2012-03-01 8:32 ` Sven Eckelmann
@ 2012-03-05 19:26 ` Marek Lindner
1 sibling, 0 replies; 18+ messages in thread
From: Marek Lindner @ 2012-03-05 19:26 UTC (permalink / raw)
To: The list for a Better Approach To Mobile Ad-hoc Networking
On Thursday, March 01, 2012 15:35:17 Marek Lindner wrote:
> The packet handler array replaces the growing switch statement, thus
> dealing with incoming packets in a more efficient way. It also adds
> to possibility to register packet handlers on the fly.
Applied in revision 1887248.
Regards,
Marek
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCHv2 3/6] batman-adv: register batman ogm receive function during protocol init
2012-03-04 8:56 ` [B.A.T.M.A.N.] [PATCHv2 " Marek Lindner
2012-03-05 18:21 ` Simon Wunderlich
@ 2012-03-05 19:28 ` Marek Lindner
1 sibling, 0 replies; 18+ messages in thread
From: Marek Lindner @ 2012-03-05 19:28 UTC (permalink / raw)
To: The list for a Better Approach To Mobile Ad-hoc Networking
On Sunday, March 04, 2012 16:56:25 Marek Lindner wrote:
> The B.A.T.M.A.N. IV OGM receive function still was hard-coded although
> it is a routing protocol specific function. This patch takes advantage
> of the dynamic packet handler registration to remove the hard-coded
> function calls.
Applied in revision 9f72fc2.
Regards,
Marek
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCH 4/6] batman-adv: rename last_valid to last_seen
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 4/6] batman-adv: rename last_valid to last_seen Marek Lindner
@ 2012-03-05 19:30 ` Marek Lindner
0 siblings, 0 replies; 18+ messages in thread
From: Marek Lindner @ 2012-03-05 19:30 UTC (permalink / raw)
To: The list for a Better Approach To Mobile Ad-hoc Networking
On Thursday, March 01, 2012 15:35:19 Marek Lindner wrote:
> Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
> ---
> bat_iv_ogm.c | 8 ++++----
> originator.c | 16 ++++++++--------
> types.h | 8 ++++----
> 3 files changed, 16 insertions(+), 16 deletions(-)
Applied in revision 02b4338.
Regards,
Marek
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCH 5/6] batman-adv: replace HZ calculations with jiffies_to_msecs()
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 5/6] batman-adv: replace HZ calculations with jiffies_to_msecs() Marek Lindner
@ 2012-03-05 19:33 ` Marek Lindner
0 siblings, 0 replies; 18+ messages in thread
From: Marek Lindner @ 2012-03-05 19:33 UTC (permalink / raw)
To: The list for a Better Approach To Mobile Ad-hoc Networking
On Thursday, March 01, 2012 15:35:20 Marek Lindner wrote:
> Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
> ---
> bat_debugfs.c | 4 ++--
> originator.c | 15 ++++++++++-----
> send.c | 2 +-
> 3 files changed, 13 insertions(+), 8 deletions(-)
Applied in revision bfe9936.
Regards,
Marek
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCH 6/6] batman-adv: split neigh_new function into generic and batman iv specific parts
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 6/6] batman-adv: split neigh_new function into generic and batman iv specific parts Marek Lindner
@ 2012-03-05 19:36 ` Marek Lindner
0 siblings, 0 replies; 18+ messages in thread
From: Marek Lindner @ 2012-03-05 19:36 UTC (permalink / raw)
To: The list for a Better Approach To Mobile Ad-hoc Networking
On Thursday, March 01, 2012 15:35:21 Marek Lindner wrote:
> Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
> ---
> bat_iv_ogm.c | 40 ++++++++++++++++++++++++++++++++++------
> originator.c | 27 ++++++++++-----------------
> originator.h | 6 ++----
> 3 files changed, 46 insertions(+), 27 deletions(-)
Applied in revision 0c9a249.
Regards,
Marek
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2012-03-05 19:36 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-01 7:35 [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 2/6] batman-adv: introduce packet type handler array for incoming packets Marek Lindner
2012-03-01 8:32 ` Sven Eckelmann
2012-03-05 19:26 ` Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 3/6] batman-adv: register batman ogm receive function during protocol init Marek Lindner
2012-03-03 17:59 ` Simon Wunderlich
2012-03-04 8:17 ` Marek Lindner
2012-03-04 8:56 ` [B.A.T.M.A.N.] [PATCHv2 " Marek Lindner
2012-03-05 18:21 ` Simon Wunderlich
2012-03-05 19:28 ` Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 4/6] batman-adv: rename last_valid to last_seen Marek Lindner
2012-03-05 19:30 ` Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 5/6] batman-adv: replace HZ calculations with jiffies_to_msecs() Marek Lindner
2012-03-05 19:33 ` Marek Lindner
2012-03-01 7:35 ` [B.A.T.M.A.N.] [PATCH 6/6] batman-adv: split neigh_new function into generic and batman iv specific parts Marek Lindner
2012-03-05 19:36 ` Marek Lindner
2012-03-03 18:02 ` [B.A.T.M.A.N.] [PATCH 1/6] batman-adv: introduce is_single_hop_neigh variable to increase readability Simon Wunderlich
2012-03-05 19:22 ` Marek Lindner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).