|
@@ -1,4 +1,4 @@
|
|
|
-/* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors:
|
|
|
+/* Copyright (C) 2007-2015 B.A.T.M.A.N. contributors:
|
|
|
*
|
|
|
* Marek Lindner, Simon Wunderlich
|
|
|
*
|
|
@@ -308,7 +308,6 @@ static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
|
|
|
struct batadv_ogm_packet *batadv_ogm_packet;
|
|
|
unsigned char *ogm_buff;
|
|
|
uint32_t random_seqno;
|
|
|
- int res = -ENOMEM;
|
|
|
|
|
|
/* randomize initial seqno to avoid collision */
|
|
|
get_random_bytes(&random_seqno, sizeof(random_seqno));
|
|
@@ -317,7 +316,7 @@ static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
|
|
|
hard_iface->bat_iv.ogm_buff_len = BATADV_OGM_HLEN;
|
|
|
ogm_buff = kmalloc(hard_iface->bat_iv.ogm_buff_len, GFP_ATOMIC);
|
|
|
if (!ogm_buff)
|
|
|
- goto out;
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
hard_iface->bat_iv.ogm_buff = ogm_buff;
|
|
|
|
|
@@ -329,10 +328,7 @@ static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
|
|
|
batadv_ogm_packet->reserved = 0;
|
|
|
batadv_ogm_packet->tq = BATADV_TQ_MAX_VALUE;
|
|
|
|
|
|
- res = 0;
|
|
|
-
|
|
|
-out:
|
|
|
- return res;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void batadv_iv_ogm_iface_disable(struct batadv_hard_iface *hard_iface)
|
|
@@ -396,8 +392,8 @@ static uint8_t batadv_hop_penalty(uint8_t tq,
|
|
|
}
|
|
|
|
|
|
/* is there another aggregated packet here? */
|
|
|
-static int batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len,
|
|
|
- __be16 tvlv_len)
|
|
|
+static bool batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len,
|
|
|
+ __be16 tvlv_len)
|
|
|
{
|
|
|
int next_buff_pos = 0;
|
|
|
|
|
@@ -413,7 +409,7 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet,
|
|
|
struct batadv_hard_iface *hard_iface)
|
|
|
{
|
|
|
struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
|
|
|
- char *fwd_str;
|
|
|
+ const char *fwd_str;
|
|
|
uint8_t packet_num;
|
|
|
int16_t buff_pos;
|
|
|
struct batadv_ogm_packet *batadv_ogm_packet;
|
|
@@ -548,58 +544,62 @@ batadv_iv_ogm_can_aggregate(const struct batadv_ogm_packet *new_bat_ogm_packet,
|
|
|
* - the send time is within our MAX_AGGREGATION_MS time
|
|
|
* - the resulting packet wont be bigger than
|
|
|
* MAX_AGGREGATION_BYTES
|
|
|
+ * otherwise aggregation is not possible
|
|
|
*/
|
|
|
- if (time_before(send_time, forw_packet->send_time) &&
|
|
|
- time_after_eq(aggregation_end_time, forw_packet->send_time) &&
|
|
|
- (aggregated_bytes <= BATADV_MAX_AGGREGATION_BYTES)) {
|
|
|
- /* check aggregation compatibility
|
|
|
- * -> direct link packets are broadcasted on
|
|
|
- * their interface only
|
|
|
- * -> aggregate packet if the current packet is
|
|
|
- * a "global" packet as well as the base
|
|
|
- * packet
|
|
|
- */
|
|
|
- primary_if = batadv_primary_if_get_selected(bat_priv);
|
|
|
- if (!primary_if)
|
|
|
- goto out;
|
|
|
-
|
|
|
- /* packet is not leaving on the same interface. */
|
|
|
- if (forw_packet->if_outgoing != if_outgoing)
|
|
|
- goto out;
|
|
|
+ if (!time_before(send_time, forw_packet->send_time) ||
|
|
|
+ !time_after_eq(aggregation_end_time, forw_packet->send_time))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (aggregated_bytes > BATADV_MAX_AGGREGATION_BYTES)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ /* packet is not leaving on the same interface. */
|
|
|
+ if (forw_packet->if_outgoing != if_outgoing)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ /* check aggregation compatibility
|
|
|
+ * -> direct link packets are broadcasted on
|
|
|
+ * their interface only
|
|
|
+ * -> aggregate packet if the current packet is
|
|
|
+ * a "global" packet as well as the base
|
|
|
+ * packet
|
|
|
+ */
|
|
|
+ primary_if = batadv_primary_if_get_selected(bat_priv);
|
|
|
+ if (!primary_if)
|
|
|
+ return false;
|
|
|
|
|
|
- /* packets without direct link flag and high TTL
|
|
|
- * are flooded through the net
|
|
|
- */
|
|
|
- if ((!directlink) &&
|
|
|
- (!(batadv_ogm_packet->flags & BATADV_DIRECTLINK)) &&
|
|
|
- (batadv_ogm_packet->ttl != 1) &&
|
|
|
-
|
|
|
- /* own packets originating non-primary
|
|
|
- * interfaces leave only that interface
|
|
|
- */
|
|
|
- ((!forw_packet->own) ||
|
|
|
- (forw_packet->if_incoming == primary_if))) {
|
|
|
- res = true;
|
|
|
- goto out;
|
|
|
- }
|
|
|
+ /* packets without direct link flag and high TTL
|
|
|
+ * are flooded through the net
|
|
|
+ */
|
|
|
+ if (!directlink &&
|
|
|
+ !(batadv_ogm_packet->flags & BATADV_DIRECTLINK) &&
|
|
|
+ batadv_ogm_packet->ttl != 1 &&
|
|
|
+
|
|
|
+ /* own packets originating non-primary
|
|
|
+ * interfaces leave only that interface
|
|
|
+ */
|
|
|
+ (!forw_packet->own ||
|
|
|
+ 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
|
|
|
- */
|
|
|
- if ((directlink) &&
|
|
|
- (new_bat_ogm_packet->ttl == 1) &&
|
|
|
- (forw_packet->if_incoming == if_incoming) &&
|
|
|
-
|
|
|
- /* packets from direct neighbors or
|
|
|
- * own secondary interface packets
|
|
|
- * (= secondary interface packets in general)
|
|
|
- */
|
|
|
- (batadv_ogm_packet->flags & BATADV_DIRECTLINK ||
|
|
|
- (forw_packet->own &&
|
|
|
- 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
|
|
|
+ */
|
|
|
+ if (directlink &&
|
|
|
+ new_bat_ogm_packet->ttl == 1 &&
|
|
|
+ forw_packet->if_incoming == if_incoming &&
|
|
|
+
|
|
|
+ /* packets from direct neighbors or
|
|
|
+ * own secondary interface packets
|
|
|
+ * (= secondary interface packets in general)
|
|
|
+ */
|
|
|
+ (batadv_ogm_packet->flags & BATADV_DIRECTLINK ||
|
|
|
+ (forw_packet->own &&
|
|
|
+ forw_packet->if_incoming != primary_if))) {
|
|
|
+ res = true;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
out:
|
|
@@ -1081,7 +1081,7 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
|
|
|
* won't consider it either
|
|
|
*/
|
|
|
if (router_ifinfo &&
|
|
|
- (neigh_ifinfo->bat_iv.tq_avg == router_ifinfo->bat_iv.tq_avg)) {
|
|
|
+ neigh_ifinfo->bat_iv.tq_avg == router_ifinfo->bat_iv.tq_avg) {
|
|
|
orig_node_tmp = router->orig_node;
|
|
|
spin_lock_bh(&orig_node_tmp->bat_iv.ogm_cnt_lock);
|
|
|
if_num = router->if_incoming->if_num;
|