#!/bin/bash
#
# QEMU network configuration script to bring down tap devices. This
# utility needs to be run as root, and will use the ip utility
#
# If you find yourself calling this script a lot, you can add the
# the following to your /etc/sudoers file to be able to run this
# command without entering your password each time:
#
# <my-username> ALL=NOPASSWD: /path/to/runqemu-ifup
# <my-username> ALL=NOPASSWD: /path/to/runqemu-ifdown
#
# Copyright (c) 2006-2011 Linux Foundation
#
# SPDX-License-Identifier: GPL-2.0-only
#

usage() {
	echo "sudo $(basename $0) <tap-dev>"
}

if [ $EUID -ne 0 ]; then
	echo "Error: This script (runqemu-ifdown) must be run with root privileges"
	exit 1
fi

if [ $# -gt 2 ] || [ $# -lt 1 ]; then
	usage
	exit 1
fi

# backward compatibility
if [ $# -eq 2 ] ; then
	echo "Warning: native-sysroot-basedir parameter is ignored. It is no longer needed." >&2
fi

TAP=$1

if ! ip tuntap del $TAP mode tap 2>/dev/null; then
	echo "Error: Unable to run up tuntap del"
	exit 1
fi

IPTOOL=`which ip 2> /dev/null`
if [ "x$IPTOOL" = "x" ]; then
	# better than nothing...
	IPTOOL=/sbin/ip
fi
if [ -x "$IPTOOL" ]; then
	if `$IPTOOL link show $TAP > /dev/null 2>&1`; then
		$IPTOOL link del $TAP
	fi
fi
# cleanup the remaining iptables rules
IPTABLES=`which iptables 2> /dev/null`
if [ "x$IPTABLES" = "x" ]; then
	IPTABLES=/sbin/iptables
fi
if [ ! -x "$IPTABLES" ]; then
	echo "$IPTABLES cannot be executed"
	exit 1
fi

if [ -z "$OE_TAP_NAME" ]; then
	OE_TAP_NAME=tap
fi

n=$[ (`echo $TAP | sed "s/$OE_TAP_NAME//"` * 2) + 1 ]
dest=$[ (`echo $TAP | sed "s/$OE_TAP_NAME//"` * 2) + 2 ]
$IPTABLES -D POSTROUTING -t nat -j MASQUERADE -s 192.168.7.$n/32
$IPTABLES -D POSTROUTING -t nat -j MASQUERADE -s 192.168.7.$dest/32
true
