#!/bin/bash

# support for strings and integers in named maps.
# without typeof, this is 'type string' and 'type integer',
# but neither could be used because it lacks size information.

set -e

die() {
	printf '%s\n' "$*"
	exit 1
}

INPUT_OSF_CT="
		ct mark set osf name map @m1"
if [ "$NFT_TEST_HAVE_osf" = n ] ; then
	INPUT_OSF_CT=
fi

INPUT="table inet t {
	map m1 {
		typeof osf name : ct mark
		elements = { Linux : 0x00000001 }
	}

	map m2 {
		typeof vlan id : mark
		elements = { 1 : 0x1,
			     4095 : 0x4095 }
	}

	map m3 {
		typeof ip saddr . ip daddr : meta mark
		elements = { 1.2.3.4 . 5.6.7.8 : 0x00000001,
			     2.3.4.5 . 6.7.8.9 : 0x00000002 }
	}

	map m4 {
		typeof        iifname . ip protocol . th dport : verdict
		elements = { eth0 . tcp . 22 : accept }
	}

	map m5 {
		typeof ipsec in reqid . meta iifname : verdict
		elements = { 23 . eth0 : accept }
	}

	chain c {$INPUT_OSF_CT
		ether type vlan meta mark set vlan id map @m2
		meta mark set ip saddr . ip daddr map @m3
		iifname . ip protocol . th dport vmap @m4
		iifname . ip protocol . th dport vmap { \"eth0\" . tcp . 22 : accept, \"eth1\" . udp . 67 : drop }
		ipsec in reqid . meta iifname vmap @m5
	}
}"

EXPECTED="table inet t {
	map m1 {
		typeof osf name : ct mark
		elements = { \"Linux\" : 0x00000001 }
	}

	map m2 {
		typeof vlan id : meta mark
		elements = { 1 : 0x00000001, 4095 : 0x00004095 }
	}

	map m3 {
		typeof ip saddr . ip daddr : meta mark
		elements = { 1.2.3.4 . 5.6.7.8 : 0x00000001,
			     2.3.4.5 . 6.7.8.9 : 0x00000002 }
	}

	map m4 {
		typeof iifname . ip protocol . th dport : verdict
		elements = { \"eth0\" . tcp . 22 : accept }
	}

	map m5 {
		typeof ipsec in reqid . iifname : verdict
		elements = { 23 . \"eth0\" : accept }
	}

	chain c {$INPUT_OSF_CT
		meta mark set vlan id map @m2
		meta mark set ip saddr . ip daddr map @m3
		iifname . ip protocol . th dport vmap @m4
		iifname . ip protocol . th dport vmap { \"eth0\" . tcp . 22 : accept, \"eth1\" . udp . 67 : drop }
		ipsec in reqid . iifname vmap @m5
	}
}"

$NFT -f - <<< "$INPUT" || die $'nft command failed to process input:\n'">$INPUT<"

$DIFF -u <($NFT list ruleset) - <<<"$EXPECTED" || die $'diff failed between ruleset and expected data.\nExpected:\n'">$EXPECTED<"


if [ "$NFT_TEST_HAVE_osf" = n ] ; then
    echo "Partial test due to NFT_TEST_HAVE_osf=n. Skip"
    exit 77
fi
