[RFC,openwrt-routing] batman-adv: Split batadv proto in meshif and hardif part

Message ID 20190224165113.15726-1-sven@narfation.org (mailing list archive)
State RFC, archived
Delegated to: Simon Wunderlich
Headers
Series [RFC,openwrt-routing] batman-adv: Split batadv proto in meshif and hardif part |

Commit Message

Sven Eckelmann Feb. 24, 2019, 4:51 p.m. UTC
  batman-adv allows to configure three different objects:

* batadv hardif

  - network interface used by batadv meshif to transport the batman-adv
    packets
  - its master interface is set to the batadv meshif

* batadv (meshif/softif)

  - virtual interface that emulates a normal 802.3 interface on top
  - encapsulates traffic and forwards it via the batadv hardifs

* batadv vlan

  - potential VLAN ID on top of batadv meshif
  - allows filtering of traffic from specific VIDs

While batadv vlan objects were already represented as an own proto
"batadv_vlan", the batadv meshif could never be fully configured using
/etc/config/network. Instead, parts of its configuration were stored in
/etc/config/batman_adv and some in the interfaces with the "batadv" proto.

To increase the confusion, the "batadv" proto wasn't used to define the
batadv meshif but to identify batadv (slave) hardifs. The batman-adv
meshifs were also never created directly but only when a hardif was
configured. The actual modification of the configuration settings was then
applied using a hotplug script hack. The batadv meshif network interface
could therefore only be created when an hardif was available and not
manipulated with ifup/ifdown. Also `/etc/init.d/network reload` didn't
modify the batadv meshif interface configuration correctly.

The "batadv" is now renamed to "batadv_hardif" and a new "batadv" proto is
used to configure the main (meshif) network interface with all its
configuration.

A simple network configuration with WiFi & ethernet interfaces and static
IP on top of bat0 would look like:

  # batadv meshif bat0
  config interface 'bat0'
  	option proto 'batadv'
  	option routing_algo 'BATMAN_IV'
  	option aggregated_ogms 1
  	option ap_isolation 0
  	option bonding 0
  	option fragmentation 1
  	#option gw_bandwidth '10000/2000'
  	option gw_mode 'off'
  	#option gw_sel_class 20
  	option log_level 0
  	option orig_interval 1000
  	option bridge_loop_avoidance 1
  	option distributed_arp_table 1
  	option multicast_mode 1
  	option network_coding 0
  	option hop_penalty 30
  	option isolation_mark '0x00000000/0x00000000'

  # add *single* wifi-iface with network bat0_hardif_wlan as hardif to bat0
  config interface 'bat0_hardif_wlan'
  	option mtu '1536'
  	option proto 'batadv_hardif'
  	option master 'bat0'
  	# option ifname is filled out by the wifi-iface

  # add eth0 as hardif to bat0
  config interface 'bat0_hardif_eth0'
  	option proto 'batadv_hardif'
  	option master 'bat0'
  	option ifname 'eth0'
  	option mtu '1536'

  # configure IP on bat0
  config interface 'bat0_lan'
  	option ifname 'bat0'
  	option proto 'static'
  	option ipaddr '192.168.1.1'
  	option netmask '255.255.255.0'
  	option ip6assign '60'

Signed-off-by: Sven Eckelmann <sven@narfation.org>
---
Cc: Matthias Schiffer <mschiffer@universe-factory.net>
Cc: openwrt-devel@lists.openwrt.org
Cc: Gui Iribarren <gui@altermundi.net>
Cc: Moritz Warning <moritzwarning@web.de>

Changes depend on https://github.com/openwrt-routing/packages/pull/451
---
 batman-adv/Makefile                           |   2 +-
 batman-adv/files/etc/config/batman-adv        |  20 ----
 .../files/etc/hotplug.d/net/99-batman-adv     |  12 --
 .../etc/uci-defaults/99-migrate-batadv_hardif |  97 +++++++++++++++
 batman-adv/files/lib/batman-adv/config.sh     |  69 -----------
 batman-adv/files/lib/netifd/proto/batadv.sh   | 112 +++++++++++++++---
 .../files/lib/netifd/proto/batadv_hardif.sh   |  40 +++++++
 7 files changed, 235 insertions(+), 117 deletions(-)
 delete mode 100644 batman-adv/files/etc/config/batman-adv
 delete mode 100644 batman-adv/files/etc/hotplug.d/net/99-batman-adv
 create mode 100755 batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif
 delete mode 100644 batman-adv/files/lib/batman-adv/config.sh
 create mode 100755 batman-adv/files/lib/netifd/proto/batadv_hardif.sh
  

Comments

Gui Iribarren via B.A.T.M.A.N Feb. 25, 2019, 1:24 a.m. UTC | #1
The sender domain has a DMARC Reject/Quarantine policy which disallows
sending mailing list messages using the original "From" header.

To mitigate this problem, the original message has been wrapped
automatically by the mailing list software.
agree on the current mess, and congratulations on working on it :)
have you considered, to simplify backwards compatibility, to keep proto "batadv" as it currently is (hardif) and naming "batadv_mesh" the new proto?

Am 24. Februar 2019 13:51:13 GMT-03:00 schrieb Sven Eckelmann <sven@narfation.org>:
>batman-adv allows to configure three different objects:
>
>* batadv hardif
>
>  - network interface used by batadv meshif to transport the batman-adv
>    packets
>  - its master interface is set to the batadv meshif
>
>* batadv (meshif/softif)
>
>  - virtual interface that emulates a normal 802.3 interface on top
>  - encapsulates traffic and forwards it via the batadv hardifs
>
>* batadv vlan
>
>  - potential VLAN ID on top of batadv meshif
>  - allows filtering of traffic from specific VIDs
>
>While batadv vlan objects were already represented as an own proto
>"batadv_vlan", the batadv meshif could never be fully configured using
>/etc/config/network. Instead, parts of its configuration were stored in
>/etc/config/batman_adv and some in the interfaces with the "batadv"
>proto.
>
>To increase the confusion, the "batadv" proto wasn't used to define the
>batadv meshif but to identify batadv (slave) hardifs. The batman-adv
>meshifs were also never created directly but only when a hardif was
>configured. The actual modification of the configuration settings was
>then
>applied using a hotplug script hack. The batadv meshif network
>interface
>could therefore only be created when an hardif was available and not
>manipulated with ifup/ifdown. Also `/etc/init.d/network reload` didn't
>modify the batadv meshif interface configuration correctly.
>
>The "batadv" is now renamed to "batadv_hardif" and a new "batadv" proto
>is
>used to configure the main (meshif) network interface with all its
>configuration.
>
>A simple network configuration with WiFi & ethernet interfaces and
>static
>IP on top of bat0 would look like:
>
>  # batadv meshif bat0
>  config interface 'bat0'
>  	option proto 'batadv'
>  	option routing_algo 'BATMAN_IV'
>  	option aggregated_ogms 1
>  	option ap_isolation 0
>  	option bonding 0
>  	option fragmentation 1
>  	#option gw_bandwidth '10000/2000'
>  	option gw_mode 'off'
>  	#option gw_sel_class 20
>  	option log_level 0
>  	option orig_interval 1000
>  	option bridge_loop_avoidance 1
>  	option distributed_arp_table 1
>  	option multicast_mode 1
>  	option network_coding 0
>  	option hop_penalty 30
>  	option isolation_mark '0x00000000/0x00000000'
>
># add *single* wifi-iface with network bat0_hardif_wlan as hardif to
>bat0
>  config interface 'bat0_hardif_wlan'
>  	option mtu '1536'
>  	option proto 'batadv_hardif'
>  	option master 'bat0'
>  	# option ifname is filled out by the wifi-iface
>
>  # add eth0 as hardif to bat0
>  config interface 'bat0_hardif_eth0'
>  	option proto 'batadv_hardif'
>  	option master 'bat0'
>  	option ifname 'eth0'
>  	option mtu '1536'
>
>  # configure IP on bat0
>  config interface 'bat0_lan'
>  	option ifname 'bat0'
>  	option proto 'static'
>  	option ipaddr '192.168.1.1'
>  	option netmask '255.255.255.0'
>  	option ip6assign '60'
>
>Signed-off-by: Sven Eckelmann <sven@narfation.org>
>---
>Cc: Matthias Schiffer <mschiffer@universe-factory.net>
>Cc: openwrt-devel@lists.openwrt.org
>Cc: Gui Iribarren <gui@altermundi.net>
>Cc: Moritz Warning <moritzwarning@web.de>
>
>Changes depend on https://github.com/openwrt-routing/packages/pull/451
>---
> batman-adv/Makefile                           |   2 +-
> batman-adv/files/etc/config/batman-adv        |  20 ----
> .../files/etc/hotplug.d/net/99-batman-adv     |  12 --
> .../etc/uci-defaults/99-migrate-batadv_hardif |  97 +++++++++++++++
> batman-adv/files/lib/batman-adv/config.sh     |  69 -----------
> batman-adv/files/lib/netifd/proto/batadv.sh   | 112 +++++++++++++++---
> .../files/lib/netifd/proto/batadv_hardif.sh   |  40 +++++++
> 7 files changed, 235 insertions(+), 117 deletions(-)
> delete mode 100644 batman-adv/files/etc/config/batman-adv
> delete mode 100644 batman-adv/files/etc/hotplug.d/net/99-batman-adv
>create mode 100755
>batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif
> delete mode 100644 batman-adv/files/lib/batman-adv/config.sh
> create mode 100755 batman-adv/files/lib/netifd/proto/batadv_hardif.sh
>
>diff --git a/batman-adv/Makefile b/batman-adv/Makefile
>index 82af6c7..b250888 100644
>--- a/batman-adv/Makefile
>+++ b/batman-adv/Makefile
>@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
> PKG_NAME:=batman-adv
> 
> PKG_VERSION:=2019.0
>-PKG_RELEASE:=2
>+PKG_RELEASE:=3
>PKG_HASH:=3e97d8a771cdbd7b2df42c52b88e071eaa58b5d28eb4e17a4b13b6698debbdc0
> 
> PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
>diff --git a/batman-adv/files/etc/config/batman-adv
>b/batman-adv/files/etc/config/batman-adv
>deleted file mode 100644
>index 21138cb..0000000
>--- a/batman-adv/files/etc/config/batman-adv
>+++ /dev/null
>@@ -1,20 +0,0 @@
>-
>-config 'mesh' 'bat0'
>-	#option 'aggregated_ogms' 1
>-	#option 'ap_isolation' 0
>-	#option 'bonding' 0
>-	#option 'fragmentation' 1
>-	#option 'gw_bandwidth' '10000/2000'
>-	#option 'gw_mode' 'off'
>-	#option 'gw_sel_class' 20
>-	#option 'log_level' 0
>-	#option 'orig_interval' 1000
>-	#option 'bridge_loop_avoidance' 1
>-	#option 'distributed_arp_table' 1
>-	#option 'multicast_mode' 1
>-	#option 'network_coding' 0
>-	#option 'hop_penalty' 30
>-	#option 'isolation_mark' '0x00000000/0x00000000'
>-
>-# yet another batX instance
>-# config 'mesh' 'bat5'
>diff --git a/batman-adv/files/etc/hotplug.d/net/99-batman-adv
>b/batman-adv/files/etc/hotplug.d/net/99-batman-adv
>deleted file mode 100644
>index f0c391f..0000000
>--- a/batman-adv/files/etc/hotplug.d/net/99-batman-adv
>+++ /dev/null
>@@ -1,12 +0,0 @@
>-#!/bin/sh
>-
>-. /lib/batman-adv/config.sh
>-
>-bat_load_module
>-config_load batman-adv
>-
>-case "$ACTION" in
>-	add)
>-		[ -d /sys/class/net/$INTERFACE/mesh/ ] && bat_config "$INTERFACE"
>-		;;
>-esac
>diff --git a/batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif
>b/batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif
>new file mode 100755
>index 0000000..156a33f
>--- /dev/null
>+++ b/batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif
>@@ -0,0 +1,97 @@
>+#!/bin/sh
>+
>+# This UCI-Defaults script will split the batadv proto network
>interfaces
>+# in batadv_hardif and batadv proto. The configuration options from
>+# /etc/config/batman-adv will be moved to the latter.
>+
>+. /lib/functions.sh
>+
>+proto_batadv_to_batadv_hardif() {
>+    local section="$1"
>+    local proto
>+    local mesh
>+    local routing_algo
>+
>+    config_get proto "${section}" proto
>+    config_get mesh "${section}" mesh
>+    config_get routing_algo "${section}" routing_algo
>+
>+    if [ -z "$mesh" -o "${proto}" != "batadv" ]; then
>+        continue
>+    fi
>+
>+    uci set network."${section}".proto="batadv_hardif"
>+    uci rename network."${section}".mesh="master"
>+    uci delete network."${section}".routing_algo
>+
>+    # create new section or adjust existing one
>+    uci set network."${mesh}"=interface
>+    uci set network."${mesh}".proto=batadv
>+    [ -n "${routing_algo}" ]  && uci set
>network."${mesh}".routing_algo="${routing_algo}"
>+}
>+
>+mv_batadv_config_section() {
>+    local section="$1"
>+    local aggregated_ogms
>+    local ap_isolation
>+    local bonding
>+    local bridge_loop_avoidance
>+    local distributed_arp_table
>+    local fragmentation
>+    local gw_bandwidth
>+    local gw_mode
>+    local gw_sel_class
>+    local hop_penalty
>+    local isolation_mark
>+    local log_level
>+    local multicast_mode
>+    local network_coding
>+    local orig_interval
>+
>+    config_get aggregated_ogms "${section}" aggregated_ogms
>+    config_get ap_isolation "${section}" ap_isolation
>+    config_get bonding "${section}" bonding
>+    config_get bridge_loop_avoidance "${section}"
>bridge_loop_avoidance
>+    config_get distributed_arp_table "${section}"
>distributed_arp_table
>+    config_get fragmentation "${section}" fragmentation
>+    config_get gw_bandwidth "${section}" gw_bandwidth
>+    config_get gw_mode "${section}" gw_mode
>+    config_get gw_sel_class "${section}" gw_sel_class
>+    config_get hop_penalty "${section}" hop_penalty
>+    config_get isolation_mark "${section}" isolation_mark
>+    config_get log_level "${section}" log_level
>+    config_get multicast_mode "${section}" multicast_mode
>+    config_get network_coding "${section}" network_coding
>+    config_get orig_interval "${section}" orig_interval
>+
>+    # update section in case it exists
>+    [ -n "${aggregated_ogms}" ]  && uci set
>network."${section}".aggregated_ogms="${aggregated_ogms}"
>+    [ -n "${ap_isolation}" ]  && uci set
>network."${section}".ap_isolation="${ap_isolation}"
>+    [ -n "${bonding}" ]  && uci set
>network."${section}".bonding="${bonding}"
>+    [ -n "${bridge_loop_avoidance}" ]  && uci set
>network."${section}".bridge_loop_avoidance="${bridge_loop_avoidance}"
>+    [ -n "${distributed_arp_table}" ]  && uci set
>network."${section}".distributed_arp_table="${distributed_arp_table}"
>+    [ -n "${fragmentation}" ]  && uci set
>network."${section}".fragmentation="${fragmentation}"
>+    [ -n "${gw_bandwidth}" ]  && uci set
>network."${section}".gw_bandwidth="${gw_bandwidth}"
>+    [ -n "${gw_mode}" ]  && uci set
>network."${section}".gw_mode="${gw_mode}"
>+    [ -n "${gw_sel_class}" ]  && uci set
>network."${section}".gw_sel_class="${gw_sel_class}"
>+    [ -n "${hop_penalty}" ]  && uci set
>network."${section}".hop_penalty="${hop_penalty}"
>+    [ -n "${isolation_mark}" ]  && uci set
>network."${section}".isolation_mark="${isolation_mark}"
>+    [ -n "${log_level}" ]  && uci set
>network."${section}".log_level="${log_level}"
>+    [ -n "${multicast_mode}" ]  && uci set
>network."${section}".multicast_mode="${multicast_mode}"
>+    [ -n "${network_coding}" ]  && uci set
>network."${section}".network_coding="${network_coding}"
>+    [ -n "${orig_interval}" ]  && uci set
>network."${section}".orig_interval="${orig_interval}"
>+}
>+
>+if [ -f /etc/config/batman-adv ]; then
>+    config_load network
>+    config_foreach proto_batadv_to_batadv_hardif 'interface'
>+    uci commit network
>+
>+    config_load batman-adv
>+    config_foreach mv_batadv_config_section 'mesh'
>+    uci commit batman-adv
>+
>+    rm -f /etc/config/batman-adv
>+fi
>+
>+exit 0
>diff --git a/batman-adv/files/lib/batman-adv/config.sh
>b/batman-adv/files/lib/batman-adv/config.sh
>deleted file mode 100644
>index 952f93e..0000000
>--- a/batman-adv/files/lib/batman-adv/config.sh
>+++ /dev/null
>@@ -1,69 +0,0 @@
>-#!/bin/sh
>-
>-bat_load_module()
>-{
>-	[ -d "/sys/module/batman_adv/" ] && return
>-
>-	. /lib/functions.sh
>-	load_modules /etc/modules.d/*-crc16 /etc/modules.d/*-crypto*
>/etc/modules.d/*-lib-crc* /etc/modules.d/*-batman-adv*
>-}
>-
>-bat_config()
>-{
>-	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
>-
>-	config_get aggregated_ogms "$mesh" aggregated_ogms
>-	config_get ap_isolation "$mesh" ap_isolation
>-	config_get bonding "$mesh" bonding
>-	config_get bridge_loop_avoidance "$mesh" bridge_loop_avoidance
>-	config_get distributed_arp_table "$mesh" distributed_arp_table
>-	config_get fragmentation "$mesh" fragmentation
>-	config_get gw_bandwidth "$mesh" gw_bandwidth
>-	config_get gw_mode "$mesh" gw_mode
>-	config_get gw_sel_class "$mesh" gw_sel_class
>-	config_get hop_penalty "$mesh" hop_penalty
>-	config_get isolation_mark "$mesh" isolation_mark
>-	config_get multicast_mode "$mesh" multicast_mode
>-	config_get network_coding "$mesh" network_coding
>-	config_get log_level "$mesh" log_level
>-	config_get orig_interval "$mesh" orig_interval
>-
>-	[ ! -f "/sys/class/net/$mesh/mesh/orig_interval" ] && echo
>"batman-adv mesh $mesh does not exist - check your interface
>configuration" && return 1
>-
>-	[ -n "$aggregated_ogms" ] && batctl -m "$mesh" aggregation
>"$aggregated_ogms"
>-	[ -n "$ap_isolation" ] && batctl -m "$mesh" ap_isolation
>"$ap_isolation"
>-	[ -n "$bonding" ] && batctl -m "$mesh" bonding "$bonding"
>-	[ -n "$bridge_loop_avoidance" ] &&  batctl -m "$mesh"
>bridge_loop_avoidance "$bridge_loop_avoidance" 2>&-
>-	[ -n "$distributed_arp_table" ] && batctl -m "$mesh"
>distributed_arp_table "$distributed_arp_table" 2>&-
>-	[ -n "$fragmentation" ] && batctl -m "$mesh" fragmentation
>"$fragmentation"
>-
>-	case "$gw_mode" in
>-	server)
>-		if [ -n "$gw_bandwidth" ]; then
>-			batctl -m "$mesh" gw_mode "server" "$gw_bandwidth"
>-		else
>-			batctl -m "$mesh" gw_mode "server"
>-		fi
>-		;;
>-	client)
>-		if [ -n "$gw_sel_class" ]; then
>-			batctl -m "$mesh" gw_mode "client" "$gw_sel_class"
>-		else
>-			batctl -m "$mesh" gw_mode "client"
>-		fi
>-		;;
>-	*)
>-		batctl -m "$mesh" gw_mode "off"
>-		;;
>-	esac
>-
>-	[ -n "$hop_penalty" ] && batctl -m "$mesh" hop_penalty "$hop_penalty"
>-	[ -n "$isolation_mark" ] && batctl -m "$mesh" isolation_mark
>"$isolation_mark"
>-	[ -n "$multicast_mode" ] && batctl -m "$mesh" multicast_mode
>"$multicast_mode" 2>&-
>-	[ -n "$network_coding" ] && batctl -m "$mesh" network_coding
>"$network_coding" 2>&-
>-	[ -n "$log_level" ] && batctl -m "$mesh" loglevel "$log_level" 2>&-
>-	[ -n "$orig_interval" ] && batctl -m "$mesh" orig_interval
>"$orig_interval"
>-}
>diff --git a/batman-adv/files/lib/netifd/proto/batadv.sh
>b/batman-adv/files/lib/netifd/proto/batadv.sh
>index 2233091..eb8153c 100755
>--- a/batman-adv/files/lib/netifd/proto/batadv.sh
>+++ b/batman-adv/files/lib/netifd/proto/batadv.sh
>@@ -1,37 +1,119 @@
> #!/bin/sh
> 
>-. /lib/functions.sh
>-. ../netifd-proto.sh
>-init_proto "$@"
>+[ -n "$INCLUDE_ONLY" ] || {
>+	. /lib/functions.sh
>+	. ../netifd-proto.sh
>+	init_proto "$@"
>+}
> 
> proto_batadv_init_config() {
>-	proto_config_add_string "mesh"
>-	proto_config_add_string "routing_algo"
>+	no_device=1
>+	available=1
>+
>+	proto_config_add_boolean 'aggregated_ogms:bool'
>+	proto_config_add_boolean 'ap_isolation:bool'
>+	proto_config_add_boolean 'bonding:bool'
>+	proto_config_add_boolean 'bridge_loop_avoidance:bool'
>+	proto_config_add_boolean 'distributed_arp_table:bool'
>+	proto_config_add_boolean 'fragmentation:bool'
>+	proto_config_add_string 'gw_bandwidth'
>+	proto_config_add_string 'gw_mode'
>+	proto_config_add_int 'gw_sel_class'
>+	proto_config_add_int 'hop_penalty'
>+	proto_config_add_string 'isolation_mark'
>+	proto_config_add_string 'log_level'
>+	proto_config_add_boolean 'multicast_mode:bool'
>+	proto_config_add_boolean 'network_coding:bool'
>+	proto_config_add_int 'orig_interval'
>+	proto_config_add_string 'routing_algo'
> }
> 
> proto_batadv_setup() {
> 	local config="$1"
>-	local iface="$2"
>+	local iface="$config"
>+
>+	local aggregated_ogms
>+	local ap_isolation
>+	local bonding
>+	local bridge_loop_avoidance
>+	local distributed_arp_table
>+	local fragmentation
>+	local gw_bandwidth
>+	local gw_mode
>+	local gw_sel_class
>+	local hop_penalty
>+	local isolation_mark
>+	local log_level
>+	local multicast_mode
>+	local network_coding
>+	local orig_interval
>+	local routing_algo
>+
>+	json_get_vars aggregated_ogms
>+	json_get_vars ap_isolation
>+	json_get_vars bonding
>+	json_get_vars bridge_loop_avoidance
>+	json_get_vars distributed_arp_table
>+	json_get_vars fragmentation
>+	json_get_vars gw_bandwidth
>+	json_get_vars gw_mode
>+	json_get_vars gw_sel_class
>+	json_get_vars hop_penalty
>+	json_get_vars isolation_mark
>+	json_get_vars log_level
>+	json_get_vars multicast_mode
>+	json_get_vars network_coding
>+	json_get_vars orig_interval
>+	json_get_vars routing_algo
> 
>-	local mesh routing_algo
>-	json_get_vars mesh routing_algo
>+	set_default routing_algo 'BATMAN_IV'
> 
>-	[ -n "$routing_algo" ] || routing_algo="BATMAN_IV"
> 	batctl routing_algo "$routing_algo"
>+	batctl -m "$iface" interface create
>+
>+	[ -n "$aggregated_ogms" ] && batctl -m "$iface" aggregation
>"$aggregated_ogms"
>+	[ -n "$ap_isolation" ] && batctl -m "$iface" ap_isolation
>"$ap_isolation"
>+	[ -n "$bonding" ] && batctl -m "$iface" bonding "$bonding"
>+	[ -n "$bridge_loop_avoidance" ] &&  batctl -m "$iface"
>bridge_loop_avoidance "$bridge_loop_avoidance" 2>&-
>+	[ -n "$distributed_arp_table" ] && batctl -m "$iface"
>distributed_arp_table "$distributed_arp_table" 2>&-
>+	[ -n "$fragmentation" ] && batctl -m "$iface" fragmentation
>"$fragmentation"
>+
>+	case "$gw_mode" in
>+	server)
>+		if [ -n "$gw_bandwidth" ]; then
>+			batctl -m "$iface" gw_mode "server" "$gw_bandwidth"
>+		else
>+			batctl -m "$iface" gw_mode "server"
>+		fi
>+		;;
>+	client)
>+		if [ -n "$gw_sel_class" ]; then
>+			batctl -m "$iface" gw_mode "client" "$gw_sel_class"
>+		else
>+			batctl -m "$iface" gw_mode "client"
>+		fi
>+		;;
>+	*)
>+		batctl -m "$iface" gw_mode "off"
>+		;;
>+	esac
>+
>+	[ -n "$hop_penalty" ] && batctl -m "$iface" hop_penalty
>"$hop_penalty"
>+	[ -n "$isolation_mark" ] && batctl -m "$iface" isolation_mark
>"$isolation_mark"
>+	[ -n "$multicast_mode" ] && batctl -m "$iface" multicast_mode
>"$multicast_mode" 2>&-
>+	[ -n "$network_coding" ] && batctl -m "$iface" network_coding
>"$network_coding" 2>&-
>+	[ -n "$log_level" ] && batctl -m "$iface" loglevel "$log_level" 2>&-
>+	[ -n "$orig_interval" ] && batctl -m "$iface" orig_interval
>"$orig_interval"
> 
>-	batctl -m "$mesh" interface add "$iface"
> 	proto_init_update "$iface" 1
> 	proto_send_update "$config"
> }
> 
> proto_batadv_teardown() {
> 	local config="$1"
>-	local iface="$2"
>-
>-	local mesh
>-	json_get_vars mesh
>+	local iface="$config"
> 
>-	batctl -m "$mesh" interface del "$iface" || true
>+	batctl -m "$iface" interface destroy
> }
> 
> add_protocol batadv
>diff --git a/batman-adv/files/lib/netifd/proto/batadv_hardif.sh
>b/batman-adv/files/lib/netifd/proto/batadv_hardif.sh
>new file mode 100755
>index 0000000..9283d2b
>--- /dev/null
>+++ b/batman-adv/files/lib/netifd/proto/batadv_hardif.sh
>@@ -0,0 +1,40 @@
>+#!/bin/sh
>+
>+[ -n "$INCLUDE_ONLY" ] || {
>+	. /lib/functions.sh
>+	. ../netifd-proto.sh
>+	init_proto "$@"
>+}
>+
>+proto_batadv_hardif_init_config() {
>+	proto_config_add_string "master"
>+}
>+
>+proto_batadv_hardif_setup() {
>+	local config="$1"
>+	local iface="$2"
>+
>+	local master
>+
>+	json_get_vars master
>+
>+	( proto_add_host_dependency "$config" '' "$master" )
>+
>+	batctl -m "$master" interface -M add "$iface"
>+
>+	proto_init_update "$iface" 1
>+	proto_send_update "$config"
>+}
>+
>+proto_batadv_hardif_teardown() {
>+	local config="$1"
>+	local iface="$2"
>+
>+	local master
>+
>+	json_get_vars master
>+
>+	batctl -m "$master" interface -M del "$iface" || true
>+}
>+
>+add_protocol batadv_hardif
  
Sven Eckelmann Feb. 25, 2019, 7:35 a.m. UTC | #2
On Monday, 25 February 2019 02:24:56 CET Gui Iribarren wrote:
> have you considered, to simplify backwards compatibility, to keep proto 
> "batadv" as it currently is (hardif) and naming "batadv_mesh" the new proto?

It was one of the goals to *not* name the batadv hardif interface proto 
"batadv". And I wanted to have the batman-adv interface proto named "batadv" 
because this is the rtnl kind string. So you actually create batman-adv 
meshifs using:

   ip link add dev bat0 type batadv

But we can call this proto also "batadv_meshif" if there is a strong 
preference for this name.

Kind regards,
	Sven
  
Кирилл Луконин Feb. 25, 2019, 8:03 a.m. UTC | #3
Hello.


That looks pretty cool.
But what about ELP interval parameter?
As I think, it should be covered by UCI config too.


Best Regards,
Lukonin Kirill

пн, 25 февр. 2019 г. в 12:36, Sven Eckelmann <sven@narfation.org>:
>
> On Monday, 25 February 2019 02:24:56 CET Gui Iribarren wrote:
> > have you considered, to simplify backwards compatibility, to keep proto
> > "batadv" as it currently is (hardif) and naming "batadv_mesh" the new proto?
>
> It was one of the goals to *not* name the batadv hardif interface proto
> "batadv". And I wanted to have the batman-adv interface proto named "batadv"
> because this is the rtnl kind string. So you actually create batman-adv
> meshifs using:
>
>    ip link add dev bat0 type batadv
>
> But we can call this proto also "batadv_meshif" if there is a strong
> preference for this name.
>
> Kind regards,
>         Sven
  
Sven Eckelmann Feb. 25, 2019, 8:22 a.m. UTC | #4
On Monday, 25 February 2019 09:03:52 CET Кирилл Луконин wrote:
> But what about ELP interval parameter?
> As I think, it should be covered by UCI config too.

Please first provide a batctl patch to support this setting. Then we can 
discuss the uci integration.

Kind regards,
	Sven
  
Simon Wunderlich March 7, 2019, 3:55 p.m. UTC | #5
On Sunday, February 24, 2019 5:51:13 PM CET Sven Eckelmann wrote:
> batman-adv allows to configure three different objects:
> 
> * batadv hardif
> 
>   - network interface used by batadv meshif to transport the batman-adv
>     packets
>   - its master interface is set to the batadv meshif
> 
> * batadv (meshif/softif)
> 
>   - virtual interface that emulates a normal 802.3 interface on top
>   - encapsulates traffic and forwards it via the batadv hardifs
> 
> * batadv vlan
> 
>   - potential VLAN ID on top of batadv meshif
>   - allows filtering of traffic from specific VIDs
> 
> While batadv vlan objects were already represented as an own proto
> "batadv_vlan", the batadv meshif could never be fully configured using
> /etc/config/network. Instead, parts of its configuration were stored in
> /etc/config/batman_adv and some in the interfaces with the "batadv" proto.
> 
> To increase the confusion, the "batadv" proto wasn't used to define the
> batadv meshif but to identify batadv (slave) hardifs. The batman-adv
> meshifs were also never created directly but only when a hardif was
> configured. The actual modification of the configuration settings was then
> applied using a hotplug script hack. The batadv meshif network interface
> could therefore only be created when an hardif was available and not
> manipulated with ifup/ifdown. Also `/etc/init.d/network reload` didn't
> modify the batadv meshif interface configuration correctly.
> 
> The "batadv" is now renamed to "batadv_hardif" and a new "batadv" proto is
> used to configure the main (meshif) network interface with all its
> configuration.
> 
> A simple network configuration with WiFi & ethernet interfaces and static
> IP on top of bat0 would look like:
> 
>   # batadv meshif bat0
>   config interface 'bat0'
>         option proto 'batadv'
>         option routing_algo 'BATMAN_IV'
>         option aggregated_ogms 1
>         option ap_isolation 0
>         option bonding 0
>         option fragmentation 1
>         #option gw_bandwidth '10000/2000'
>         option gw_mode 'off'
>         #option gw_sel_class 20
>         option log_level 0
>         option orig_interval 1000
>         option bridge_loop_avoidance 1
>         option distributed_arp_table 1
>         option multicast_mode 1
>         option network_coding 0
>         option hop_penalty 30
>         option isolation_mark '0x00000000/0x00000000'
> 
>   # add *single* wifi-iface with network bat0_hardif_wlan as hardif to bat0
>   config interface 'bat0_hardif_wlan'
>         option mtu '1536'
>         option proto 'batadv_hardif'
>         option master 'bat0'
>         # option ifname is filled out by the wifi-iface
> 
>   # add eth0 as hardif to bat0
>   config interface 'bat0_hardif_eth0'
>         option proto 'batadv_hardif'
>         option master 'bat0'
>         option ifname 'eth0'
>         option mtu '1536'
> 
>   # configure IP on bat0
>   config interface 'bat0_lan'
>         option ifname 'bat0'
>         option proto 'static'
>         option ipaddr '192.168.1.1'
>         option netmask '255.255.255.0'
>         option ip6assign '60'

Hey,

thank you very much for proposing that. It looks very good to me. We just 
discussed personally if it were possible to get rid of the bat0_hardif 
sections, but we will need them to configure other things in the future (e.g. 
ELP intervals, throughput override). And doing the "ifname" list in bat0 would 
result in a bad hack as we currently have for bridges, this is not favorable.

So +1 from me for this.

Cheers,
      Simon
  

Patch

diff --git a/batman-adv/Makefile b/batman-adv/Makefile
index 82af6c7..b250888 100644
--- a/batman-adv/Makefile
+++ b/batman-adv/Makefile
@@ -10,7 +10,7 @@  include $(TOPDIR)/rules.mk
 PKG_NAME:=batman-adv
 
 PKG_VERSION:=2019.0
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 PKG_HASH:=3e97d8a771cdbd7b2df42c52b88e071eaa58b5d28eb4e17a4b13b6698debbdc0
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
diff --git a/batman-adv/files/etc/config/batman-adv b/batman-adv/files/etc/config/batman-adv
deleted file mode 100644
index 21138cb..0000000
--- a/batman-adv/files/etc/config/batman-adv
+++ /dev/null
@@ -1,20 +0,0 @@ 
-
-config 'mesh' 'bat0'
-	#option 'aggregated_ogms' 1
-	#option 'ap_isolation' 0
-	#option 'bonding' 0
-	#option 'fragmentation' 1
-	#option 'gw_bandwidth' '10000/2000'
-	#option 'gw_mode' 'off'
-	#option 'gw_sel_class' 20
-	#option 'log_level' 0
-	#option 'orig_interval' 1000
-	#option 'bridge_loop_avoidance' 1
-	#option 'distributed_arp_table' 1
-	#option 'multicast_mode' 1
-	#option 'network_coding' 0
-	#option 'hop_penalty' 30
-	#option 'isolation_mark' '0x00000000/0x00000000'
-
-# yet another batX instance
-# config 'mesh' 'bat5'
diff --git a/batman-adv/files/etc/hotplug.d/net/99-batman-adv b/batman-adv/files/etc/hotplug.d/net/99-batman-adv
deleted file mode 100644
index f0c391f..0000000
--- a/batman-adv/files/etc/hotplug.d/net/99-batman-adv
+++ /dev/null
@@ -1,12 +0,0 @@ 
-#!/bin/sh
-
-. /lib/batman-adv/config.sh
-
-bat_load_module
-config_load batman-adv
-
-case "$ACTION" in
-	add)
-		[ -d /sys/class/net/$INTERFACE/mesh/ ] && bat_config "$INTERFACE"
-		;;
-esac
diff --git a/batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif b/batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif
new file mode 100755
index 0000000..156a33f
--- /dev/null
+++ b/batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif
@@ -0,0 +1,97 @@ 
+#!/bin/sh
+
+# This UCI-Defaults script will split the batadv proto network interfaces
+# in batadv_hardif and batadv proto. The configuration options from
+# /etc/config/batman-adv will be moved to the latter.
+
+. /lib/functions.sh
+
+proto_batadv_to_batadv_hardif() {
+    local section="$1"
+    local proto
+    local mesh
+    local routing_algo
+
+    config_get proto "${section}" proto
+    config_get mesh "${section}" mesh
+    config_get routing_algo "${section}" routing_algo
+
+    if [ -z "$mesh" -o "${proto}" != "batadv" ]; then
+        continue
+    fi
+
+    uci set network."${section}".proto="batadv_hardif"
+    uci rename network."${section}".mesh="master"
+    uci delete network."${section}".routing_algo
+
+    # create new section or adjust existing one
+    uci set network."${mesh}"=interface
+    uci set network."${mesh}".proto=batadv
+    [ -n "${routing_algo}" ]  && uci set network."${mesh}".routing_algo="${routing_algo}"
+}
+
+mv_batadv_config_section() {
+    local section="$1"
+    local aggregated_ogms
+    local ap_isolation
+    local bonding
+    local bridge_loop_avoidance
+    local distributed_arp_table
+    local fragmentation
+    local gw_bandwidth
+    local gw_mode
+    local gw_sel_class
+    local hop_penalty
+    local isolation_mark
+    local log_level
+    local multicast_mode
+    local network_coding
+    local orig_interval
+
+    config_get aggregated_ogms "${section}" aggregated_ogms
+    config_get ap_isolation "${section}" ap_isolation
+    config_get bonding "${section}" bonding
+    config_get bridge_loop_avoidance "${section}" bridge_loop_avoidance
+    config_get distributed_arp_table "${section}" distributed_arp_table
+    config_get fragmentation "${section}" fragmentation
+    config_get gw_bandwidth "${section}" gw_bandwidth
+    config_get gw_mode "${section}" gw_mode
+    config_get gw_sel_class "${section}" gw_sel_class
+    config_get hop_penalty "${section}" hop_penalty
+    config_get isolation_mark "${section}" isolation_mark
+    config_get log_level "${section}" log_level
+    config_get multicast_mode "${section}" multicast_mode
+    config_get network_coding "${section}" network_coding
+    config_get orig_interval "${section}" orig_interval
+
+    # update section in case it exists
+    [ -n "${aggregated_ogms}" ]  && uci set network."${section}".aggregated_ogms="${aggregated_ogms}"
+    [ -n "${ap_isolation}" ]  && uci set network."${section}".ap_isolation="${ap_isolation}"
+    [ -n "${bonding}" ]  && uci set network."${section}".bonding="${bonding}"
+    [ -n "${bridge_loop_avoidance}" ]  && uci set network."${section}".bridge_loop_avoidance="${bridge_loop_avoidance}"
+    [ -n "${distributed_arp_table}" ]  && uci set network."${section}".distributed_arp_table="${distributed_arp_table}"
+    [ -n "${fragmentation}" ]  && uci set network."${section}".fragmentation="${fragmentation}"
+    [ -n "${gw_bandwidth}" ]  && uci set network."${section}".gw_bandwidth="${gw_bandwidth}"
+    [ -n "${gw_mode}" ]  && uci set network."${section}".gw_mode="${gw_mode}"
+    [ -n "${gw_sel_class}" ]  && uci set network."${section}".gw_sel_class="${gw_sel_class}"
+    [ -n "${hop_penalty}" ]  && uci set network."${section}".hop_penalty="${hop_penalty}"
+    [ -n "${isolation_mark}" ]  && uci set network."${section}".isolation_mark="${isolation_mark}"
+    [ -n "${log_level}" ]  && uci set network."${section}".log_level="${log_level}"
+    [ -n "${multicast_mode}" ]  && uci set network."${section}".multicast_mode="${multicast_mode}"
+    [ -n "${network_coding}" ]  && uci set network."${section}".network_coding="${network_coding}"
+    [ -n "${orig_interval}" ]  && uci set network."${section}".orig_interval="${orig_interval}"
+}
+
+if [ -f /etc/config/batman-adv ]; then
+    config_load network
+    config_foreach proto_batadv_to_batadv_hardif 'interface'
+    uci commit network
+
+    config_load batman-adv
+    config_foreach mv_batadv_config_section 'mesh'
+    uci commit batman-adv
+
+    rm -f /etc/config/batman-adv
+fi
+
+exit 0
diff --git a/batman-adv/files/lib/batman-adv/config.sh b/batman-adv/files/lib/batman-adv/config.sh
deleted file mode 100644
index 952f93e..0000000
--- a/batman-adv/files/lib/batman-adv/config.sh
+++ /dev/null
@@ -1,69 +0,0 @@ 
-#!/bin/sh
-
-bat_load_module()
-{
-	[ -d "/sys/module/batman_adv/" ] && return
-
-	. /lib/functions.sh
-	load_modules /etc/modules.d/*-crc16 /etc/modules.d/*-crypto* /etc/modules.d/*-lib-crc* /etc/modules.d/*-batman-adv*
-}
-
-bat_config()
-{
-	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
-
-	config_get aggregated_ogms "$mesh" aggregated_ogms
-	config_get ap_isolation "$mesh" ap_isolation
-	config_get bonding "$mesh" bonding
-	config_get bridge_loop_avoidance "$mesh" bridge_loop_avoidance
-	config_get distributed_arp_table "$mesh" distributed_arp_table
-	config_get fragmentation "$mesh" fragmentation
-	config_get gw_bandwidth "$mesh" gw_bandwidth
-	config_get gw_mode "$mesh" gw_mode
-	config_get gw_sel_class "$mesh" gw_sel_class
-	config_get hop_penalty "$mesh" hop_penalty
-	config_get isolation_mark "$mesh" isolation_mark
-	config_get multicast_mode "$mesh" multicast_mode
-	config_get network_coding "$mesh" network_coding
-	config_get log_level "$mesh" log_level
-	config_get orig_interval "$mesh" orig_interval
-
-	[ ! -f "/sys/class/net/$mesh/mesh/orig_interval" ] && echo "batman-adv mesh $mesh does not exist - check your interface configuration" && return 1
-
-	[ -n "$aggregated_ogms" ] && batctl -m "$mesh" aggregation "$aggregated_ogms"
-	[ -n "$ap_isolation" ] && batctl -m "$mesh" ap_isolation "$ap_isolation"
-	[ -n "$bonding" ] && batctl -m "$mesh" bonding "$bonding"
-	[ -n "$bridge_loop_avoidance" ] &&  batctl -m "$mesh" bridge_loop_avoidance "$bridge_loop_avoidance" 2>&-
-	[ -n "$distributed_arp_table" ] && batctl -m "$mesh" distributed_arp_table "$distributed_arp_table" 2>&-
-	[ -n "$fragmentation" ] && batctl -m "$mesh" fragmentation "$fragmentation"
-
-	case "$gw_mode" in
-	server)
-		if [ -n "$gw_bandwidth" ]; then
-			batctl -m "$mesh" gw_mode "server" "$gw_bandwidth"
-		else
-			batctl -m "$mesh" gw_mode "server"
-		fi
-		;;
-	client)
-		if [ -n "$gw_sel_class" ]; then
-			batctl -m "$mesh" gw_mode "client" "$gw_sel_class"
-		else
-			batctl -m "$mesh" gw_mode "client"
-		fi
-		;;
-	*)
-		batctl -m "$mesh" gw_mode "off"
-		;;
-	esac
-
-	[ -n "$hop_penalty" ] && batctl -m "$mesh" hop_penalty "$hop_penalty"
-	[ -n "$isolation_mark" ] && batctl -m "$mesh" isolation_mark "$isolation_mark"
-	[ -n "$multicast_mode" ] && batctl -m "$mesh" multicast_mode "$multicast_mode" 2>&-
-	[ -n "$network_coding" ] && batctl -m "$mesh" network_coding "$network_coding" 2>&-
-	[ -n "$log_level" ] && batctl -m "$mesh" loglevel "$log_level" 2>&-
-	[ -n "$orig_interval" ] && batctl -m "$mesh" orig_interval "$orig_interval"
-}
diff --git a/batman-adv/files/lib/netifd/proto/batadv.sh b/batman-adv/files/lib/netifd/proto/batadv.sh
index 2233091..eb8153c 100755
--- a/batman-adv/files/lib/netifd/proto/batadv.sh
+++ b/batman-adv/files/lib/netifd/proto/batadv.sh
@@ -1,37 +1,119 @@ 
 #!/bin/sh
 
-. /lib/functions.sh
-. ../netifd-proto.sh
-init_proto "$@"
+[ -n "$INCLUDE_ONLY" ] || {
+	. /lib/functions.sh
+	. ../netifd-proto.sh
+	init_proto "$@"
+}
 
 proto_batadv_init_config() {
-	proto_config_add_string "mesh"
-	proto_config_add_string "routing_algo"
+	no_device=1
+	available=1
+
+	proto_config_add_boolean 'aggregated_ogms:bool'
+	proto_config_add_boolean 'ap_isolation:bool'
+	proto_config_add_boolean 'bonding:bool'
+	proto_config_add_boolean 'bridge_loop_avoidance:bool'
+	proto_config_add_boolean 'distributed_arp_table:bool'
+	proto_config_add_boolean 'fragmentation:bool'
+	proto_config_add_string 'gw_bandwidth'
+	proto_config_add_string 'gw_mode'
+	proto_config_add_int 'gw_sel_class'
+	proto_config_add_int 'hop_penalty'
+	proto_config_add_string 'isolation_mark'
+	proto_config_add_string 'log_level'
+	proto_config_add_boolean 'multicast_mode:bool'
+	proto_config_add_boolean 'network_coding:bool'
+	proto_config_add_int 'orig_interval'
+	proto_config_add_string 'routing_algo'
 }
 
 proto_batadv_setup() {
 	local config="$1"
-	local iface="$2"
+	local iface="$config"
+
+	local aggregated_ogms
+	local ap_isolation
+	local bonding
+	local bridge_loop_avoidance
+	local distributed_arp_table
+	local fragmentation
+	local gw_bandwidth
+	local gw_mode
+	local gw_sel_class
+	local hop_penalty
+	local isolation_mark
+	local log_level
+	local multicast_mode
+	local network_coding
+	local orig_interval
+	local routing_algo
+
+	json_get_vars aggregated_ogms
+	json_get_vars ap_isolation
+	json_get_vars bonding
+	json_get_vars bridge_loop_avoidance
+	json_get_vars distributed_arp_table
+	json_get_vars fragmentation
+	json_get_vars gw_bandwidth
+	json_get_vars gw_mode
+	json_get_vars gw_sel_class
+	json_get_vars hop_penalty
+	json_get_vars isolation_mark
+	json_get_vars log_level
+	json_get_vars multicast_mode
+	json_get_vars network_coding
+	json_get_vars orig_interval
+	json_get_vars routing_algo
 
-	local mesh routing_algo
-	json_get_vars mesh routing_algo
+	set_default routing_algo 'BATMAN_IV'
 
-	[ -n "$routing_algo" ] || routing_algo="BATMAN_IV"
 	batctl routing_algo "$routing_algo"
+	batctl -m "$iface" interface create
+
+	[ -n "$aggregated_ogms" ] && batctl -m "$iface" aggregation "$aggregated_ogms"
+	[ -n "$ap_isolation" ] && batctl -m "$iface" ap_isolation "$ap_isolation"
+	[ -n "$bonding" ] && batctl -m "$iface" bonding "$bonding"
+	[ -n "$bridge_loop_avoidance" ] &&  batctl -m "$iface" bridge_loop_avoidance "$bridge_loop_avoidance" 2>&-
+	[ -n "$distributed_arp_table" ] && batctl -m "$iface" distributed_arp_table "$distributed_arp_table" 2>&-
+	[ -n "$fragmentation" ] && batctl -m "$iface" fragmentation "$fragmentation"
+
+	case "$gw_mode" in
+	server)
+		if [ -n "$gw_bandwidth" ]; then
+			batctl -m "$iface" gw_mode "server" "$gw_bandwidth"
+		else
+			batctl -m "$iface" gw_mode "server"
+		fi
+		;;
+	client)
+		if [ -n "$gw_sel_class" ]; then
+			batctl -m "$iface" gw_mode "client" "$gw_sel_class"
+		else
+			batctl -m "$iface" gw_mode "client"
+		fi
+		;;
+	*)
+		batctl -m "$iface" gw_mode "off"
+		;;
+	esac
+
+	[ -n "$hop_penalty" ] && batctl -m "$iface" hop_penalty "$hop_penalty"
+	[ -n "$isolation_mark" ] && batctl -m "$iface" isolation_mark "$isolation_mark"
+	[ -n "$multicast_mode" ] && batctl -m "$iface" multicast_mode "$multicast_mode" 2>&-
+	[ -n "$network_coding" ] && batctl -m "$iface" network_coding "$network_coding" 2>&-
+	[ -n "$log_level" ] && batctl -m "$iface" loglevel "$log_level" 2>&-
+	[ -n "$orig_interval" ] && batctl -m "$iface" orig_interval "$orig_interval"
 
-	batctl -m "$mesh" interface add "$iface"
 	proto_init_update "$iface" 1
 	proto_send_update "$config"
 }
 
 proto_batadv_teardown() {
 	local config="$1"
-	local iface="$2"
-
-	local mesh
-	json_get_vars mesh
+	local iface="$config"
 
-	batctl -m "$mesh" interface del "$iface" || true
+	batctl -m "$iface" interface destroy
 }
 
 add_protocol batadv
diff --git a/batman-adv/files/lib/netifd/proto/batadv_hardif.sh b/batman-adv/files/lib/netifd/proto/batadv_hardif.sh
new file mode 100755
index 0000000..9283d2b
--- /dev/null
+++ b/batman-adv/files/lib/netifd/proto/batadv_hardif.sh
@@ -0,0 +1,40 @@ 
+#!/bin/sh
+
+[ -n "$INCLUDE_ONLY" ] || {
+	. /lib/functions.sh
+	. ../netifd-proto.sh
+	init_proto "$@"
+}
+
+proto_batadv_hardif_init_config() {
+	proto_config_add_string "master"
+}
+
+proto_batadv_hardif_setup() {
+	local config="$1"
+	local iface="$2"
+
+	local master
+
+	json_get_vars master
+
+	( proto_add_host_dependency "$config" '' "$master" )
+
+	batctl -m "$master" interface -M add "$iface"
+
+	proto_init_update "$iface" 1
+	proto_send_update "$config"
+}
+
+proto_batadv_hardif_teardown() {
+	local config="$1"
+	local iface="$2"
+
+	local master
+
+	json_get_vars master
+
+	batctl -m "$master" interface -M del "$iface" || true
+}
+
+add_protocol batadv_hardif