|
@@ -1088,6 +1088,7 @@ static int batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
|
|
|
unsigned int neigh_rq_inv_cube, neigh_rq_max_cube;
|
|
|
int tq_asym_penalty, inv_asym_penalty, if_num, ret = 0;
|
|
|
unsigned int combined_tq;
|
|
|
+ int tq_iface_penalty;
|
|
|
|
|
|
/* find corresponding one hop neighbor */
|
|
|
rcu_read_lock();
|
|
@@ -1169,15 +1170,31 @@ static int batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
|
|
|
inv_asym_penalty /= neigh_rq_max_cube;
|
|
|
tq_asym_penalty = BATADV_TQ_MAX_VALUE - inv_asym_penalty;
|
|
|
|
|
|
- combined_tq = batadv_ogm_packet->tq * tq_own * tq_asym_penalty;
|
|
|
- combined_tq /= BATADV_TQ_MAX_VALUE * BATADV_TQ_MAX_VALUE;
|
|
|
+ /* penalize if the OGM is forwarded on the same interface. WiFi
|
|
|
+ * interfaces and other half duplex devices suffer from throughput
|
|
|
+ * drops as they can't send and receive at the same time.
|
|
|
+ */
|
|
|
+ tq_iface_penalty = BATADV_TQ_MAX_VALUE;
|
|
|
+ if (if_outgoing && (if_incoming == if_outgoing) &&
|
|
|
+ batadv_is_wifi_netdev(if_outgoing->net_dev))
|
|
|
+ tq_iface_penalty = batadv_hop_penalty(BATADV_TQ_MAX_VALUE,
|
|
|
+ bat_priv);
|
|
|
+
|
|
|
+ combined_tq = batadv_ogm_packet->tq *
|
|
|
+ tq_own *
|
|
|
+ tq_asym_penalty *
|
|
|
+ tq_iface_penalty;
|
|
|
+ combined_tq /= BATADV_TQ_MAX_VALUE *
|
|
|
+ BATADV_TQ_MAX_VALUE *
|
|
|
+ BATADV_TQ_MAX_VALUE;
|
|
|
batadv_ogm_packet->tq = combined_tq;
|
|
|
|
|
|
batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
|
|
|
- "bidirectional: orig = %-15pM neigh = %-15pM => own_bcast = %2i, real recv = %2i, local tq: %3i, asym_penalty: %3i, total tq: %3i\n",
|
|
|
+ "bidirectional: orig = %-15pM neigh = %-15pM => own_bcast = %2i, real recv = %2i, local tq: %3i, asym_penalty: %3i, iface_penalty: %3i, total tq: %3i, if_incoming = %s, if_outgoing = %s\n",
|
|
|
orig_node->orig, orig_neigh_node->orig, total_count,
|
|
|
- neigh_rq_count, tq_own,
|
|
|
- tq_asym_penalty, batadv_ogm_packet->tq);
|
|
|
+ neigh_rq_count, tq_own, tq_asym_penalty, tq_iface_penalty,
|
|
|
+ batadv_ogm_packet->tq, if_incoming->net_dev->name,
|
|
|
+ if_outgoing ? if_outgoing->net_dev->name : "DEFAULT");
|
|
|
|
|
|
/* if link has the minimum required transmission quality
|
|
|
* consider it bidirectional
|