<_PROGS=nft_flowtable.sh TEST_GEN_PROGS="" run_tests make: Entering directory '/srv/vmksft/testing/wt-15/tools/testing/selftests' make[1]: Entering directory '/srv/vmksft/testing/wt-15/tools/testing/selftests/net/netfilter' make[1]: Nothing to be done for 'all'. make[1]: Leaving directory '/srv/vmksft/testing/wt-15/tools/testing/selftests/net/netfilter' make[1]: Entering directory '/srv/vmksft/testing/wt-15/tools/testing/selftests/net/netfilter' # timeout set to 1800 # selftests: net/netfilter: nft_flowtable.sh # PASS: flow offloaded for ns1/ns2 # PASS: IPv6 flow offloaded for ns1/ns2 # PASS: dscp_none: dscp packet counters match # PASS: dscp_ingress: dscp packet counters match # PASS: dscp_egress: dscp packet counters match # PASS: dscp_fwd: dscp packet counters match # PASS: flow offload for ns1/ns2 with masquerade (pmtu disabled) # PASS: flow offload for ns1/ns2 with dnat (pmtu disabled) # PASS: dscp_ingress: dscp packet counters match # PASS: dscp_egress: dscp packet counters match # PASS: dscp_fwd: dscp packet counters match # PASS: flow offload for ns1/ns2 with masquerade # PASS: flow offload for ns1/ns2 with dnat # 2026/05/15 14:14:05 socat[16849] W exiting on signal 15 # 2026/05/15 14:14:05 socat[16858] W exiting on signal 15 # FAIL: file mismatch for ns1 -> ns2 # -rw------- 1 root root 2097152 May 15 14:13 /tmp/tmp.KjroxzAEeZ # -rw------- 1 root root 0 May 15 14:13 /tmp/tmp.bLTSrKAoBL # FAIL: file mismatch for ns1 <- ns2 # -rw------- 1 root root 2097152 May 15 14:13 /tmp/tmp.KjroxzAEeZ # -rw------- 1 root root 0 May 15 14:13 /tmp/tmp.zqexD1se72 # FAIL: flow offload for ns1/ns2 with dnat IPIP tunnel # FAIL: flow offload for ns1/ns2 with IPIP tunnel # table inet filter { # counter routed_orig { # packets 0 bytes 0 # } # # counter routed_repl { # packets 0 bytes 0 # } # # flowtable f1 { # hook ingress priority filter # devices = { "veth0", "veth1" } # } # # chain forward { # type filter hook forward priority filter; policy drop; # oif "veth0" tcp sport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_repl" accept # oif "tun6" accept # oif "tun0" accept # ip dscp set cs3 # ip dscp set cs3 # oif "veth1" tcp dport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_orig" accept # ct mark 0x00000001 counter name ct direction map { original : "routed_orig", reply : "routed_repl" } accept # ct state established,related accept # meta l4proto icmp accept # meta l4proto ipv6-icmp accept # } # } # table ip nat { # chain prerouting { # type nat hook prerouting priority filter; policy accept; # iif "veth0" ip daddr 10.6.6.6 tcp dport 1666 counter packets 2 bytes 120 dnat to 10.0.2.99:12345 # } # # chain postrouting { # type nat hook postrouting priority filter; policy accept; # oifname "veth1" counter packets 10 bytes 600 masquerade # } # } # 2026/05/15 14:15:05 socat[16868] W exiting on signal 15 # 2026/05/15 14:15:05 socat[16877] W exiting on signal 15 # FAIL: file mismatch for ns1 -> ns2 # -rw------- 1 root root 2097152 May 15 14:13 /tmp/tmp.KjroxzAEeZ # -rw------- 1 root root 0 May 15 14:14 /tmp/tmp.bLTSrKAoBL # FAIL: file mismatch for ns1 <- ns2 # -rw------- 1 root root 2097152 May 15 14:13 /tmp/tmp.KjroxzAEeZ # -rw------- 1 root root 0 May 15 14:14 /tmp/tmp.zqexD1se72 # FAIL: flow offload for ns1/ns2 with IP6IP6 tunnel # table inet filter { # counter routed_orig { # packets 0 bytes 0 # } # # counter routed_repl { # packets 0 bytes 0 # } # # flowtable f1 { # hook ingress priority filter # devices = { "veth0", "veth1" } # } # # chain forward { # type filter hook forward priority filter; policy drop; # oif "veth0" tcp sport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_repl" accept # oif "tun6" accept # oif "tun0" accept # ip dscp set cs3 # ip dscp set cs3 # oif "veth1" tcp dport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_orig" accept # ct mark 0x00000001 counter name ct direction map { original : "routed_orig", reply : "routed_repl" } accept # ct state established,related accept # meta l4proto icmp accept # meta l4proto ipv6-icmp accept # } # } # table ip nat { # chain prerouting { # type nat hook prerouting priority filter; policy accept; # iif "veth0" ip daddr 10.6.6.6 tcp dport 1666 counter packets 2 bytes 120 dnat to 10.0.2.99:12345 # } # # chain postrouting { # type nat hook postrouting priority filter; policy accept; # oifname "veth1" counter packets 10 bytes 600 masquerade # } # } # 2026/05/15 14:16:05 socat[16922] W exiting on signal 15 # 2026/05/15 14:16:05 socat[16931] W exiting on signal 15 # FAIL: file mismatch for ns1 -> ns2 # -rw------- 1 root root 2097152 May 15 14:13 /tmp/tmp.KjroxzAEeZ # -rw------- 1 root root 0 May 15 14:15 /tmp/tmp.bLTSrKAoBL # FAIL: file mismatch for ns1 <- ns2 # -rw------- 1 root root 2097152 May 15 14:13 /tmp/tmp.KjroxzAEeZ # -rw------- 1 root root 0 May 15 14:15 /tmp/tmp.zqexD1se72 # FAIL: flow offload for ns1/ns2 with dnat IPIP tunnel over vlan # FAIL: flow offload for ns1/ns2 with IPIP tunnel over vlan # table inet filter { # counter routed_orig { # packets 0 bytes 0 # } # # counter routed_repl { # packets 0 bytes 0 # } # # flowtable f1 { # hook ingress priority filter # devices = { "veth0", "veth1" } # } # # chain forward { # type filter hook forward priority filter; policy drop; # oif "tun6.10" accept # oif "tun0.10" accept # oif "veth1.10" accept # oif "veth0" tcp sport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_repl" accept # oif "tun6" accept # oif "tun0" accept # ip dscp set cs3 # ip dscp set cs3 # oif "veth1" tcp dport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_orig" accept # ct mark 0x00000001 counter name ct direction map { original : "routed_orig", reply : "routed_repl" } accept # ct state established,related accept # meta l4proto icmp accept # meta l4proto ipv6-icmp accept # } # } # table ip nat { # chain prerouting { # type nat hook prerouting priority filter; policy accept; # iif "veth0" ip daddr 10.6.6.6 tcp dport 1666 counter packets 2 bytes 120 dnat to 10.0.2.99:12345 # } # # chain postrouting { # type nat hook postrouting priority filter; policy accept; # oifname "veth1" counter packets 10 bytes 600 masquerade # } # } # 2026/05/15 14:17:05 socat[16941] W exiting on signal 15 # 2026/05/15 14:17:05 socat[16950] W exiting on signal 15 # FAIL: file mismatch for ns1 -> ns2 # -rw------- 1 root root 2097152 May 15 14:13 /tmp/tmp.KjroxzAEeZ # -rw------- 1 root root 0 May 15 14:16 /tmp/tmp.bLTSrKAoBL # FAIL: file mismatch for ns1 <- ns2 # -rw------- 1 root root 2097152 May 15 14:13 /tmp/tmp.KjroxzAEeZ # -rw------- 1 root root 0 May 15 14:16 /tmp/tmp.zqexD1se72 # FAIL: flow offload for ns1/ns2 with IP6IP6 tunnel over vlan # table inet filter { # counter routed_orig { # packets 0 bytes 0 # } # # counter routed_repl { # packets 0 bytes 0 # } # # flowtable f1 { # hook ingress priority filter # devices = { "veth0", "veth1" } # } # # chain forward { # type filter hook forward priority filter; policy drop; # oif "tun6.10" accept # oif "tun0.10" accept # oif "veth1.10" accept # oif "veth0" tcp sport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_repl" accept # oif "tun6" accept # oif "tun0" accept # ip dscp set cs3 # ip dscp set cs3 # oif "veth1" tcp dport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_orig" accept # ct mark 0x00000001 counter name ct direction map { original : "routed_orig", reply : "routed_repl" } accept # ct state established,related accept # meta l4proto icmp accept # meta l4proto ipv6-icmp accept # } # } # table ip nat { # chain prerouting { # type nat hook prerouting priority filter; policy accept; # iif "veth0" ip daddr 10.6.6.6 tcp dport 1666 counter packets 2 bytes 120 dnat to 10.0.2.99:12345 # } # # chain postrouting { # type nat hook postrouting priority filter; policy accept; # oifname "veth1" counter packets 10 bytes 600 masquerade # } # } # PASS: flow offload for ns1/ns2 with masquerade on bridge # PASS: flow offload for ns1/ns2 with dnat on bridge # PASS: flow offload for ns1/ns2 with masquerade bridge and VLAN # PASS: flow offload for ns1/ns2 with dnat bridge and VLAN # PASS: ipsec tunnel mode for ns1/ns2 # 2026/05/15 14:18:06 socat[17152] W exiting on signal 15 # 2026/05/15 14:18:06 socat[17161] W exiting on signal 15 # FAIL: file mismatch for ns1 -> ns2 # -rw------- 1 root root 2097152 May 15 14:13 /tmp/tmp.KjroxzAEeZ # -rw------- 1 root root 0 May 15 14:17 /tmp/tmp.bLTSrKAoBL # FAIL: file mismatch for ns1 <- ns2 # -rw------- 1 root root 2097152 May 15 14:13 /tmp/tmp.KjroxzAEeZ # -rw------- 1 root root 0 May 15 14:17 /tmp/tmp.zqexD1se72 # FAIL: IPv6 ipsec tunnel mode for ns1/ns2 # table inet filter { # counter routed_orig { # packets 0 bytes 0 # } # # counter routed_repl { # packets 0 bytes 0 # } # # flowtable f1 { # hook ingress priority filter # devices = { "veth0", "veth1" } # } # # chain forward { # type filter hook forward priority filter; policy drop; # oif "tun6.10" accept # oif "tun0.10" accept # oif "veth1.10" accept # oif "veth0" tcp sport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_repl" accept # oif "tun6" accept # oif "tun0" accept # ip dscp set cs3 # ip dscp set cs3 # oif "veth1" tcp dport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_orig" accept # ct mark 0x00000001 counter name ct direction map { original : "routed_orig", reply : "routed_repl" } accept # ct state established,related accept # meta l4proto icmp accept # meta l4proto ipv6-icmp accept # } # } # XfrmInError 0 # XfrmInBufferError 0 # XfrmInHdrError 0 # XfrmInNoStates 0 # XfrmInStateProtoError 0 # XfrmInStateModeError 0 # XfrmInStateSeqError 0 # XfrmInStateExpired 0 # XfrmInStateMismatch 0 # XfrmInStateInvalid 0 # XfrmInTmplMismatch 0 # XfrmInNoPols 0 # XfrmInPolBlock 0 # XfrmInPolError 0 # XfrmOutError 0 # XfrmOutBundleGenError 0 # XfrmOutBundleCheckError 0 # XfrmOutNoStates 0 # XfrmOutStateProtoError 0 # XfrmOutStateModeError 0 # XfrmOutStateSeqError 0 # XfrmOutStateExpired 0 # XfrmOutPolBlock 0 # XfrmOutPolDead 0 # XfrmOutPolError 0 # XfrmFwdHdrError 0 # XfrmOutStateInvalid 0 # XfrmAcquireError 0 # XfrmOutStateDirError 0 # XfrmInStateDirError 0 # XfrmInIptfsError 0 # XfrmOutNoQueueSpace 0 # re-run with random mtus and file size: -o 5210 -l 29445 -r 7112 -s 7558656 # PASS: flow offloaded for ns1/ns2 # PASS: IPv6 flow offloaded for ns1/ns2 # PASS: dscp_none: dscp packet counters match # PASS: dscp_ingress: dscp packet counters match # PASS: dscp_egress: dscp packet counters match # PASS: dscp_fwd: dscp packet counters match # PASS: flow offload for ns1/ns2 with masquerade (pmtu disabled) # PASS: flow offload for ns1/ns2 with dnat (pmtu disabled) # PASS: dscp_ingress: dscp packet counters match # PASS: dscp_egress: dscp packet counters match # PASS: dscp_fwd: dscp packet counters match # PASS: flow offload for ns1/ns2 with masquerade # PASS: flow offload for ns1/ns2 with dnat # 2026/05/15 14:19:09 socat[17526] W exiting on signal 15 # 2026/05/15 14:19:09 socat[17535] W exiting on signal 15 # FAIL: file mismatch for ns1 -> ns2 # -rw------- 1 root root 7558656 May 15 14:18 /tmp/tmp.vVo0hzkfDl # -rw------- 1 root root 0 May 15 14:18 /tmp/tmp.uYRUfsKX0K # FAIL: file mismatch for ns1 <- ns2 # -rw------- 1 root root 7558656 May 15 14:18 /tmp/tmp.vVo0hzkfDl # -rw------- 1 root root 0 May 15 14:18 /tmp/tmp.qaat7usLK9 # FAIL: flow offload for ns1/ns2 with dnat IPIP tunnel # FAIL: flow offload for ns1/ns2 with IPIP tunnel # table inet filter { # counter routed_orig { # packets 0 bytes 0 # } # # counter routed_repl { # packets 0 bytes 0 # } # # flowtable f1 { # hook ingress priority filter # devices = { "veth0", "veth1" } # } # # chain forward { # type filter hook forward priority filter; policy drop; # oif "veth0" tcp sport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_repl" accept # oif "tun6" accept # oif "tun0" accept # ip dscp set cs3 # ip dscp set cs3 # oif "veth1" tcp dport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_orig" accept # ct mark 0x00000001 counter name ct direction map { original : "routed_orig", reply : "routed_repl" } accept # ct state established,related accept # meta l4proto icmp accept # meta l4proto ipv6-icmp accept # } # } # table ip nat { # chain prerouting { # type nat hook prerouting priority filter; policy accept; # iif "veth0" ip daddr 10.6.6.6 tcp dport 1666 counter packets 2 bytes 120 dnat to 10.0.2.99:12345 # } # # chain postrouting { # type nat hook postrouting priority filter; policy accept; # oifname "veth1" counter packets 10 bytes 600 masquerade # } # } # 2026/05/15 14:20:09 socat[17545] W exiting on signal 15 # 2026/05/15 14:20:09 socat[17554] W exiting on signal 15 # FAIL: file mismatch for ns1 -> ns2 # -rw------- 1 root root 7558656 May 15 14:18 /tmp/tmp.vVo0hzkfDl # -rw------- 1 root root 0 May 15 14:19 /tmp/tmp.uYRUfsKX0K # FAIL: file mismatch for ns1 <- ns2 # -rw------- 1 root root 7558656 May 15 14:18 /tmp/tmp.vVo0hzkfDl # -rw------- 1 root root 0 May 15 14:19 /tmp/tmp.qaat7usLK9 # FAIL: flow offload for ns1/ns2 with IP6IP6 tunnel # table inet filter { # counter routed_orig { # packets 0 bytes 0 # } # # counter routed_repl { # packets 0 bytes 0 # } # # flowtable f1 { # hook ingress priority filter # devices = { "veth0", "veth1" } # } # # chain forward { # type filter hook forward priority filter; policy drop; # oif "veth0" tcp sport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_repl" accept # oif "tun6" accept # oif "tun0" accept # ip dscp set cs3 # ip dscp set cs3 # oif "veth1" tcp dport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_orig" accept # ct mark 0x00000001 counter name ct direction map { original : "routed_orig", reply : "routed_repl" } accept # ct state established,related accept # meta l4proto icmp accept # meta l4proto ipv6-icmp accept # } # } # table ip nat { # chain prerouting { # type nat hook prerouting priority filter; policy accept; # iif "veth0" ip daddr 10.6.6.6 tcp dport 1666 counter packets 2 bytes 120 dnat to 10.0.2.99:12345 # } # # chain postrouting { # type nat hook postrouting priority filter; policy accept; # oifname "veth1" counter packets 10 bytes 600 masquerade # } # } # 2026/05/15 14:21:09 socat[17597] W exiting on signal 15 # 2026/05/15 14:21:09 socat[17606] W exiting on signal 15 # FAIL: file mismatch for ns1 -> ns2 # -rw------- 1 root root 7558656 May 15 14:18 /tmp/tmp.vVo0hzkfDl # -rw------- 1 root root 0 May 15 14:20 /tmp/tmp.uYRUfsKX0K # FAIL: file mismatch for ns1 <- ns2 # -rw------- 1 root root 7558656 May 15 14:18 /tmp/tmp.vVo0hzkfDl # -rw------- 1 root root 0 May 15 14:20 /tmp/tmp.qaat7usLK9 # FAIL: flow offload for ns1/ns2 with dnat IPIP tunnel over vlan # FAIL: flow offload for ns1/ns2 with IPIP tunnel over vlan # table inet filter { # counter routed_orig { # packets 0 bytes 0 # } # # counter routed_repl { # packets 0 bytes 0 # } # # flowtable f1 { # hook ingress priority filter # devices = { "veth0", "veth1" } # } # # chain forward { # type filter hook forward priority filter; policy drop; # oif "tun6.10" accept # oif "tun0.10" accept # oif "veth1.10" accept # oif "veth0" tcp sport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_repl" accept # oif "tun6" accept # oif "tun0" accept # ip dscp set cs3 # ip dscp set cs3 # oif "veth1" tcp dport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_orig" accept # ct mark 0x00000001 counter name ct direction map { original : "routed_orig", reply : "routed_repl" } accept # ct state established,related accept # meta l4proto icmp accept # meta l4proto ipv6-icmp accept # } # } # table ip nat { # chain prerouting { # type nat hook prerouting priority filter; policy accept; # iif "veth0" ip daddr 10.6.6.6 tcp dport 1666 counter packets 2 bytes 120 dnat to 10.0.2.99:12345 # } # # chain postrouting { # type nat hook postrouting priority filter; policy accept; # oifname "veth1" counter packets 10 bytes 600 masquerade # } # } # 2026/05/15 14:22:09 socat[17619] W exiting on signal 15 # 2026/05/15 14:22:09 socat[17625] W exiting on signal 15 # FAIL: file mismatch for ns1 -> ns2 # -rw------- 1 root root 7558656 May 15 14:18 /tmp/tmp.vVo0hzkfDl # -rw------- 1 root root 0 May 15 14:21 /tmp/tmp.uYRUfsKX0K # FAIL: file mismatch for ns1 <- ns2 # -rw------- 1 root root 7558656 May 15 14:18 /tmp/tmp.vVo0hzkfDl # -rw------- 1 root root 0 May 15 14:21 /tmp/tmp.qaat7usLK9 # FAIL: flow offload for ns1/ns2 with IP6IP6 tunnel over vlan # table inet filter { # counter routed_orig { # packets 0 bytes 0 # } # # counter routed_repl { # packets 0 bytes 0 # } # # flowtable f1 { # hook ingress priority filter # devices = { "veth0", "veth1" } # } # # chain forward { # type filter hook forward priority filter; policy drop; # oif "tun6.10" accept # oif "tun0.10" accept # oif "veth1.10" accept # oif "veth0" tcp sport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_repl" accept # oif "tun6" accept # oif "tun0" accept # ip dscp set cs3 # ip dscp set cs3 # oif "veth1" tcp dport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_orig" accept # ct mark 0x00000001 counter name ct direction map { original : "routed_orig", reply : "routed_repl" } accept # ct state established,related accept # meta l4proto icmp accept # meta l4proto ipv6-icmp accept # } # } # table ip nat { # chain prerouting { # type nat hook prerouting priority filter; policy accept; # iif "veth0" ip daddr 10.6.6.6 tcp dport 1666 counter packets 2 bytes 120 dnat to 10.0.2.99:12345 # } # # chain postrouting { # type nat hook postrouting priority filter; policy accept; # oifname "veth1" counter packets 10 bytes 600 masquerade # } # } # PASS: flow offload for ns1/ns2 with masquerade on bridge # PASS: flow offload for ns1/ns2 with dnat on bridge # PASS: flow offload for ns1/ns2 with masquerade bridge and VLAN # PASS: flow offload for ns1/ns2 with dnat bridge and VLAN # PASS: ipsec tunnel mode for ns1/ns2 # 2026/05/15 14:23:10 socat[17811] W exiting on signal 15 # 2026/05/15 14:23:10 socat[17817] W exiting on signal 15 # FAIL: file mismatch for ns1 -> ns2 # -rw------- 1 root root 7558656 May 15 14:18 /tmp/tmp.vVo0hzkfDl # -rw------- 1 root root 0 May 15 14:22 /tmp/tmp.uYRUfsKX0K # FAIL: file mismatch for ns1 <- ns2 # -rw------- 1 root root 7558656 May 15 14:18 /tmp/tmp.vVo0hzkfDl # -rw------- 1 root root 0 May 15 14:22 /tmp/tmp.qaat7usLK9 # FAIL: IPv6 ipsec tunnel mode for ns1/ns2 # table inet filter { # counter routed_orig { # packets 0 bytes 0 # } # # counter routed_repl { # packets 0 bytes 0 # } # # flowtable f1 { # hook ingress priority filter # devices = { "veth0", "veth1" } # } # # chain forward { # type filter hook forward priority filter; policy drop; # oif "tun6.10" accept # oif "tun0.10" accept # oif "veth1.10" accept # oif "veth0" tcp sport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_repl" accept # oif "tun6" accept # oif "tun0" accept # ip dscp set cs3 # ip dscp set cs3 # oif "veth1" tcp dport 12345 ct mark set 0x00000001 flow add @f1 counter name "routed_orig" accept # ct mark 0x00000001 counter name ct direction map { original : "routed_orig", reply : "routed_repl" } accept # ct state established,related accept # meta l4proto icmp accept # meta l4proto ipv6-icmp accept # } # } # XfrmInError 0 # XfrmInBufferError 0 # XfrmInHdrError 0 # XfrmInNoStates 0 # XfrmInStateProtoError 0 # XfrmInStateModeError 0 # XfrmInStateSeqError 0 # XfrmInStateExpired 0 # XfrmInStateMismatch 0 # XfrmInStateInvalid 0 # XfrmInTmplMismatch 0 # XfrmInNoPols 0 # XfrmInPolBlock 0 # XfrmInPolError 0 # XfrmOutError 0 # XfrmOutBundleGenError 0 # XfrmOutBundleCheckError 0 # XfrmOutNoStates 0 # XfrmOutStateProtoError 0 # XfrmOutStateModeError 0 # XfrmOutStateSeqError 0 # XfrmOutStateExpired 0 # XfrmOutPolBlock 0 # XfrmOutPolDead 0 # XfrmOutPolError 0 # XfrmFwdHdrError 0 # XfrmOutStateInvalid 0 # XfrmAcquireError 0 # XfrmOutStateDirError 0 # XfrmInStateDirError 0 # XfrmInIptfsError 0 # XfrmOutNoQueueSpace 0 not ok 1 selftests: net/netfilter: nft_flowtable.sh # exit=1 make[1]: Leaving directory '/srv/vmksft/testing/wt-15/tools/testing/selftests/net/netfilter' make: Leaving directory '/srv/vmksft/testing/wt-15/tools/testing/selftests' xx__-> echo $? 0 xx__->