| #!/bin/sh | |
| # Copyright 2019 The ChromiumOS Authors | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| # Virtual ethernet interface control script | |
| # Sometimes, we need a virtual interface of arbitrary name and configuration | |
| # that we can do dhcp on. This script is for those times. | |
| # Basically, | |
| # $ veth setup foo 127.0.1 | |
| # $ dhclient foo | |
| # ... | |
| # $ veth teardown foo | |
| # Would set up an ethernet interface called 'foo' whose dhcpd is at 127.0.1.1 | |
| # and which will allocate addresses from 127.0.1.0/24. Note that using anything | |
| # inside 127.0.0.0/8 is a bad idea here, since lo already handles those. | |
| usage () { | |
| echo "Usage: $0 <command> [args...]" | |
| echo " setup <iface> <base> Sets up <iface> for <base>.0/24" | |
| echo " teardown <iface> Tears down <iface>" | |
| } | |
| setup () { | |
| iface="$1" | |
| base="$2" | |
| peer_iface="${iface}p" | |
| lease_file="/tmp/dnsmasq.${iface}.leases" | |
| pid_file="/tmp/dnsmasq.${iface}.pid" | |
| ip link add name "$iface" type veth peer name "$peer_iface" | |
| ifconfig "$peer_iface" "${base}.0/32" | |
| ifconfig "$peer_iface" up | |
| ifconfig "$iface" up | |
| route add -host 255.255.255.255 dev "$peer_iface" | |
| truncate -s 0 "$lease_file" | |
| dnsmasq --pid-file="$pid_file" \ | |
| --dhcp-leasefile="$lease_file" \ | |
| --dhcp-range="${base}.2,${base}.254" \ | |
| --port=0 \ | |
| --interface="$peer_iface" \ | |
| --bind-interfaces | |
| } | |
| teardown () { | |
| iface="$1" | |
| pid_file="/tmp/dnsmasq.${iface}.pid" | |
| [ -f "$pid_file" ] && kill -TERM $(cat "$pid_file") | |
| route del -host 255.255.255.255 | |
| ip link del "$iface" | |
| } | |
| if [ -z "$1" ]; then | |
| usage | |
| exit 1 | |
| fi | |
| command="$1" ; shift | |
| case "$command" in | |
| setup) | |
| setup "$@" | |
| ;; | |
| teardown) | |
| teardown "$@" | |
| ;; | |
| *) | |
| usage | |
| ;; | |
| esac |