]> Pileus Git - ~andy/linux/blobdiff - net/batman-adv/network-coding.c
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
[~andy/linux] / net / batman-adv / network-coding.c
index 511d7e1eea38b6d6e13247df0f8d4399deea8382..f1b604d88dc3c2124c86083f36e5bafaad50b9bc 100644 (file)
@@ -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
  *
@@ -12,9 +12,7 @@
  * General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include <linux/debugfs.h>
@@ -720,9 +718,21 @@ static bool batadv_can_nc_with_orig(struct batadv_priv *bat_priv,
                                    struct batadv_orig_node *orig_node,
                                    struct batadv_ogm_packet *ogm_packet)
 {
-       if (orig_node->last_real_seqno != ntohl(ogm_packet->seqno))
+       struct batadv_orig_ifinfo *orig_ifinfo;
+       uint32_t last_real_seqno;
+       uint8_t last_ttl;
+
+       orig_ifinfo = batadv_orig_ifinfo_get(orig_node, BATADV_IF_DEFAULT);
+       if (!orig_ifinfo)
                return false;
-       if (orig_node->last_ttl != ogm_packet->ttl + 1)
+
+       last_ttl = orig_ifinfo->last_ttl;
+       last_real_seqno = orig_ifinfo->last_real_seqno;
+       batadv_orig_ifinfo_free_ref(orig_ifinfo);
+
+       if (last_real_seqno != ntohl(ogm_packet->seqno))
+               return false;
+       if (last_ttl != ogm_packet->ttl + 1)
                return false;
        if (!batadv_compare_eth(ogm_packet->orig, ogm_packet->prev_sender))
                return false;
@@ -1010,6 +1020,8 @@ static bool batadv_nc_code_packets(struct batadv_priv *bat_priv,
        struct batadv_coded_packet *coded_packet;
        struct batadv_neigh_node *neigh_tmp, *router_neigh;
        struct batadv_neigh_node *router_coding = NULL;
+       struct batadv_neigh_ifinfo *router_neigh_ifinfo = NULL;
+       struct batadv_neigh_ifinfo *router_coding_ifinfo = NULL;
        uint8_t *first_source, *first_dest, *second_source, *second_dest;
        __be32 packet_id1, packet_id2;
        size_t count;
@@ -1019,19 +1031,34 @@ static bool batadv_nc_code_packets(struct batadv_priv *bat_priv,
        int coded_size = sizeof(*coded_packet);
        int header_add = coded_size - unicast_size;
 
-       router_neigh = batadv_orig_node_get_router(neigh_node->orig_node);
+       /* TODO: do we need to consider the outgoing interface for
+        * coded packets?
+        */
+       router_neigh = batadv_orig_router_get(neigh_node->orig_node,
+                                             BATADV_IF_DEFAULT);
        if (!router_neigh)
                goto out;
 
+       router_neigh_ifinfo = batadv_neigh_ifinfo_get(router_neigh,
+                                                     BATADV_IF_DEFAULT);
+       if (!router_neigh_ifinfo)
+               goto out;
+
        neigh_tmp = nc_packet->neigh_node;
-       router_coding = batadv_orig_node_get_router(neigh_tmp->orig_node);
+       router_coding = batadv_orig_router_get(neigh_tmp->orig_node,
+                                              BATADV_IF_DEFAULT);
        if (!router_coding)
                goto out;
 
-       tq_tmp = batadv_nc_random_weight_tq(router_neigh->bat_iv.tq_avg);
-       tq_weighted_neigh = tq_tmp;
-       tq_tmp = batadv_nc_random_weight_tq(router_coding->bat_iv.tq_avg);
-       tq_weighted_coding = tq_tmp;
+       router_coding_ifinfo = batadv_neigh_ifinfo_get(router_coding,
+                                                      BATADV_IF_DEFAULT);
+       if (!router_coding_ifinfo)
+               goto out;
+
+       tq_tmp = router_neigh_ifinfo->bat_iv.tq_avg;
+       tq_weighted_neigh = batadv_nc_random_weight_tq(tq_tmp);
+       tq_tmp = router_coding_ifinfo->bat_iv.tq_avg;
+       tq_weighted_coding = batadv_nc_random_weight_tq(tq_tmp);
 
        /* Select one destination for the MAC-header dst-field based on
         * weighted TQ-values.
@@ -1155,6 +1182,10 @@ out:
                batadv_neigh_node_free_ref(router_neigh);
        if (router_coding)
                batadv_neigh_node_free_ref(router_coding);
+       if (router_neigh_ifinfo)
+               batadv_neigh_ifinfo_free_ref(router_neigh_ifinfo);
+       if (router_coding_ifinfo)
+               batadv_neigh_ifinfo_free_ref(router_coding_ifinfo);
        return res;
 }