#!/bin/sh /etc/rc.common
START=90

is_module_loaded() {

	if [ ! -d "/sys/module/batman_adv" ]; then
		echo "batman-adv module directory not found - was the kernel module loaded ?" >&2
		return 0
	fi

	return 1
}

start_mesh () {
	local meshif="$1"
	local interfaces orig_interval log_level aggregated_ogms bonding fragmentation vis_mode

	is_module_loaded
	[ $? -ne 1 ] && return

	config_get interfaces "$meshif" interfaces
	config_get orig_interval "$meshif" orig_interval
	config_get log_level "$meshif" log_level
	config_get aggregated_ogms "$meshif" aggregated_ogms
	config_get bonding "$meshif" bonding
	config_get fragmentation "$meshif" fragmentation
	config_get vis_mode "$meshif" vis_mode

	if [ "$interfaces" = "" ]; then
		echo Error, you must specify at least a network interface
		return
	fi

	for interface in $interfaces
	   do
		[ ! -f "/sys/class/net/$interface/batman_adv/mesh_iface" ] && echo "Can't add interface $interface - ignoring" && continue
		echo $meshif > /sys/class/net/$interface/batman_adv/mesh_iface
	   done

	if [ $orig_interval ]; then
		echo $orig_interval > /sys/class/net/$meshif/mesh/orig_interval
	fi

	if [ $log_level ]; then
		echo $log_level > /sys/class/net/$meshif/mesh/log_level 2>&-
	fi

	if [ $aggregated_ogms ]; then
		echo $aggregated_ogms > /sys/class/net/$meshif/mesh/aggregated_ogms
	fi
	
	if [ $bonding ]; then
		echo $bonding > /sys/class/net/$meshif/mesh/bonding
	fi
	
	if [ $fragmentation ]; then
		echo $fragmentation > /sys/class/net/$meshif/mesh/fragmentation
	fi

	if [ $vis_mode ]; then
		echo $vis_mode > /sys/class/net/$meshif/mesh/vis_mode
	fi
}

stop_mesh() {
	local meshif="$1"

	is_module_loaded
	[ $? -ne 1 ] && return

	for iface in $(ls /sys/class/net/*)
	   do
		 [ ! -f "$iface/batman_adv/mesh_iface" ] && continue
		 [ "$(head -1 $iface/batman_adv/mesh_iface)" != "status: $meshif" ] && continue

		 echo "none" > $iface/batman_adv/mesh_iface
	   done
}

# can also be used with "batman-adv start bat0"
start() {
	config_load batman-adv

	if [ -n "$1" ]; then
		start_mesh $1
	else
		config_foreach start_mesh mesh
	fi
}

# can also be used with "batman-adv stop bat0"
stop () {
	config_load batman-adv

	if [ -n "$1" ]; then
		stop_mesh $1
	else
		config_foreach stop_mesh mesh
	fi
}