#!/bin/sh

set -e

. ./helpers

ME=$(basename $0)

setup_sandbox

run_net start
assert_eq "ikvswitch-host-networking start rc" "${NET_RC}" "0"

# Creation inventory with NUM_U=23: 142 bridges (1 host bridge, 2
# internet/spine bridges, 12 spine/leaf bridges, 6*21 leaf/VM bridges,
# 1 IPMI bridge), 282 TAPs, 1 dummy NIC, 283 bridge port enslavements.
assert_eq "bridge count" "$(mock_count 'addbr ')" "142"
assert_eq "TAP count" "$(mock_count 'tuntap add dev ')" "282"
assert_eq "dummy count" "$(mock_count 'link add ')" "1"
assert_eq "enslavement count" "$(mock_count 'addif ')" "283"
assert_eq "MAC assignment count" "$(mock_count 'hw ether ')" "283"

for BRIDGE in ikhb ikib1 ikib2 iksb12 iksb27 ikeb1-3 ikeb6-23 bripmi ; do
	mock_has "bridge ${BRIDGE}" "addbr ${BRIDGE}"
done
for TAP in ikht ikin1 ikin2 ikit1 ikit2 ikst17 iklt11 ikls1-3 ikvm1-3-1 ikvm3-23-2 ikipmi ; do
	mock_has "TAP ${TAP}" "tuntap add dev ${TAP} "
done
mock_has "dummynet NIC" "link add ikhn type dummy"

# MAC allocation: the first NIC gets MAC_PREFIX:10, then the
# allocation goes up in hex, without any gap.
mock_has "first MAC" "ikhn hw ether 00:22:22:dd:ee:10"
mock_has "second MAC" "ikht hw ether 00:22:22:dd:ee:11"

# Forwarding and NAT, wired to the configuration file.
mock_has "forward accept" "-A FORWARD -j ACCEPT"
mock_has "SNAT rule" "-t nat -A POSTROUTING -s 192.168.96.0/19 ! -d 192.168.96.0/19 -j SNAT --to-source 10.2.34.71"
mock_has "host route" "route replace 192.168.96/19 via 192.168.96.2"
mock_has "host bridge address" "ikhb 192.168.96.1 netmask 255.255.255.0 up"

# sysctls and LLDP forwarding through bridges.
assert_eq "ip_forward" "$(cat "${SANDBOX}/proc/sys/net/ipv4/ip_forward")" "1"
assert_eq "ipv6 forwarding" "$(cat "${SANDBOX}/proc/sys/net/ipv6/conf/all/forwarding")" "1"
assert_eq "group_fwd_mask ikhb" "$(cat "${SANDBOX}/sys/devices/virtual/net/ikhb/bridge/group_fwd_mask")" "0x4000"
assert_eq "group_fwd_mask ikeb1-3" "$(cat "${SANDBOX}/sys/devices/virtual/net/ikeb1-3/bridge/group_fwd_mask")" "0x4000"

exit 0
