local mesh="$1"
local aggregated_ogms ap_isolation bonding bridge_loop_avoidance distributed_arp_table fragmentation
local gw_bandwidth gw_mode gw_sel_class isolation_mark hop_penalty multicast_mode network_coding log_level
- local orig_interval vis_mode
+ local orig_interval
config_get aggregated_ogms "$mesh" aggregated_ogms
config_get ap_isolation "$mesh" ap_isolation
config_get network_coding "$mesh" network_coding
config_get log_level "$mesh" log_level
config_get orig_interval "$mesh" orig_interval
- config_get vis_mode "$mesh" vis_mode
[ ! -f "/sys/class/net/$mesh/mesh/orig_interval" ] && echo "batman-adv mesh $mesh does not exist - check your interface configuration" && return 1
- [ -n "$aggregate_ogms" ] && echo $aggregate_ogms > /sys/class/net/$mesh/mesh/aggregate_ogms
+ [ -n "$aggregated_ogms" ] && echo $aggregated_ogms > /sys/class/net/$mesh/mesh/aggregated_ogms
[ -n "$ap_isolation" ] && echo $ap_isolation > /sys/class/net/$mesh/mesh/ap_isolation
[ -n "$bonding" ] && echo $bonding > /sys/class/net/$mesh/mesh/bonding
[ -n "$bridge_loop_avoidance" ] && echo $bridge_loop_avoidance > /sys/class/net/$mesh/mesh/bridge_loop_avoidance 2>&-
[ -n "$network_coding" ] && echo $network_coding > /sys/class/net/$mesh/mesh/network_coding 2>&-
[ -n "$log_level" ] && echo $log_level > /sys/class/net/$mesh/mesh/log_level 2>&-
[ -n "$orig_interval" ] && echo $orig_interval > /sys/class/net/$mesh/mesh/orig_interval
- [ -n "$vis_mode" ] && echo $vis_mode > /sys/class/net/$mesh/mesh/vis_mode
}
--- /dev/null
+From: Sven Eckelmann <sven@narfation.org>
+Date: Tue, 27 Dec 2016 08:51:17 +0100
+Subject: [PATCH] batman-adv: Decrease hardif refcnt on fragmentation send error
+
+An error before the hardif is found has to free the skb. But every error
+after that has to free the skb + put the hard interface.
+
+Fixes: 8b4132b1447a ("batman-adv: Consume skb in batadv_frag_send_packet")
+Signed-off-by: Sven Eckelmann <sven@narfation.org>
+Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
+---
+ net/batman-adv/fragmentation.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
+index 9c561e6..0854ebd 100644
+--- a/net/batman-adv/fragmentation.c
++++ b/net/batman-adv/fragmentation.c
+@@ -474,7 +474,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
+ primary_if = batadv_primary_if_get_selected(bat_priv);
+ if (!primary_if) {
+ ret = -EINVAL;
+- goto put_primary_if;
++ goto free_skb;
+ }
+
+ /* Create one header to be copied to all fragments */
+@@ -502,7 +502,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
+ skb_fragment = batadv_frag_create(skb, &frag_header, mtu);
+ if (!skb_fragment) {
+ ret = -ENOMEM;
+- goto free_skb;
++ goto put_primary_if;
+ }
+
+ batadv_inc_counter(bat_priv, BATADV_CNT_FRAG_TX);
+@@ -511,7 +511,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
+ ret = batadv_send_unicast_skb(skb_fragment, neigh_node);
+ if (ret != NET_XMIT_SUCCESS) {
+ ret = NET_XMIT_DROP;
+- goto free_skb;
++ goto put_primary_if;
+ }
+
+ frag_header.no++;
+@@ -519,7 +519,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
+ /* The initial check in this function should cover this case */
+ if (frag_header.no == BATADV_FRAG_MAX_FRAGMENTS - 1) {
+ ret = -EINVAL;
+- goto free_skb;
++ goto put_primary_if;
+ }
+ }
+
+@@ -527,7 +527,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
+ if (batadv_skb_head_push(skb, header_size) < 0 ||
+ pskb_expand_head(skb, header_size + ETH_HLEN, 0, GFP_ATOMIC) < 0) {
+ ret = -ENOMEM;
+- goto free_skb;
++ goto put_primary_if;
+ }
+
+ memcpy(skb->data, &frag_header, header_size);