go.ligato.io/vpp-agent/v3@v3.5.0/plugins/vpp/natplugin/vppcalls/vpp2101/dump_nat_vppcalls_test.go (about)

     1  //  Copyright (c) 2019 Cisco and/or its affiliates.
     2  //
     3  //  Licensed under the Apache License, Version 2.0 (the "License");
     4  //  you may not use this file except in compliance with the License.
     5  //  You may obtain a copy of the License at:
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  //  Unless required by applicable law or agreed to in writing, software
    10  //  distributed under the License is distributed on an "AS IS" BASIS,
    11  //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  //  See the License for the specific language governing permissions and
    13  //  limitations under the License.
    14  
    15  package vpp2101_test
    16  
    17  import (
    18  	"net"
    19  	"testing"
    20  
    21  	. "github.com/onsi/gomega"
    22  
    23  	ifs "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/interfaces"
    24  	nat "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/nat"
    25  
    26  	"go.ligato.io/cn-infra/v2/idxmap"
    27  	idxmap_mem "go.ligato.io/cn-infra/v2/idxmap/mem"
    28  	"go.ligato.io/cn-infra/v2/logging/logrus"
    29  
    30  	"go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2101/ip_types"
    31  	vpp_nat "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2101/nat44"
    32  	"go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2101/nat_types"
    33  	vpp_vpe "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2101/vpe"
    34  	"go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/ifaceidx"
    35  	"go.ligato.io/vpp-agent/v3/plugins/vpp/natplugin/vppcalls"
    36  	"go.ligato.io/vpp-agent/v3/plugins/vpp/natplugin/vppcalls/vpp2101"
    37  	"go.ligato.io/vpp-agent/v3/plugins/vpp/vppmock"
    38  )
    39  
    40  func TestNat44GlobalConfigDump(t *testing.T) {
    41  	ctx, natHandler, swIfIndexes, _ := natTestSetup(t)
    42  	defer ctx.TeardownTestCtx()
    43  
    44  	// forwarding
    45  	ctx.MockVpp.MockReply(&vpp_nat.Nat44ShowRunningConfigReply{
    46  		ForwardingEnabled: true,
    47  	})
    48  
    49  	// virtual reassembly
    50  	/*ctx.MockVpp.MockReply(&vpp_nat.NatGetReassReply{
    51  		// IPv4
    52  		IP4Timeout:  10,
    53  		IP4MaxReass: 5,
    54  		IP4MaxFrag:  7,
    55  		IP4DropFrag: 1,
    56  		// IPv6
    57  		IP6Timeout:  20,
    58  		IP6MaxReass: 8,
    59  		IP6MaxFrag:  13,
    60  		IP6DropFrag: 0,*
    61  	})*/
    62  
    63  	// non-output interfaces
    64  	ctx.MockVpp.MockReply(
    65  		&vpp_nat.Nat44InterfaceDetails{
    66  			SwIfIndex: 1,
    67  		},
    68  		&vpp_nat.Nat44InterfaceDetails{
    69  			SwIfIndex: 2,
    70  			Flags:     nat_types.NAT_IS_INSIDE,
    71  		})
    72  	ctx.MockVpp.MockReply(&vpp_vpe.ControlPingReply{})
    73  
    74  	// output interfaces
    75  	ctx.MockVpp.MockReply(&vpp_nat.Nat44InterfaceOutputFeatureDetails{
    76  		SwIfIndex: 3,
    77  		Flags:     nat_types.NAT_IS_INSIDE,
    78  	})
    79  	ctx.MockVpp.MockReply(&vpp_vpe.ControlPingReply{})
    80  
    81  	// address pool
    82  	ctx.MockVpp.MockReply(
    83  		&vpp_nat.Nat44AddressDetails{
    84  			IPAddress: ipTo4Address("192.168.10.1"),
    85  			Flags:     nat_types.NAT_IS_TWICE_NAT,
    86  			VrfID:     1,
    87  		},
    88  		&vpp_nat.Nat44AddressDetails{
    89  			IPAddress: ipTo4Address("192.168.10.2"),
    90  			VrfID:     2,
    91  		})
    92  	ctx.MockVpp.MockReply(&vpp_vpe.ControlPingReply{})
    93  
    94  	swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1})
    95  	swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2})
    96  	swIfIndexes.Put("if2", &ifaceidx.IfaceMetadata{SwIfIndex: 3})
    97  
    98  	globalCfg, err := natHandler.Nat44GlobalConfigDump(true)
    99  	Expect(err).To(Succeed())
   100  
   101  	Expect(globalCfg.Forwarding).To(BeTrue())
   102  
   103  	Expect(globalCfg.AddressPool).To(HaveLen(2))
   104  	Expect(globalCfg.AddressPool[0].Address).To(Equal("192.168.10.1"))
   105  	Expect(globalCfg.AddressPool[0].TwiceNat).To(BeTrue())
   106  	Expect(globalCfg.AddressPool[0].VrfId).To(BeEquivalentTo(1))
   107  	Expect(globalCfg.AddressPool[1].Address).To(Equal("192.168.10.2"))
   108  	Expect(globalCfg.AddressPool[1].TwiceNat).To(BeFalse())
   109  	Expect(globalCfg.AddressPool[1].VrfId).To(BeEquivalentTo(2))
   110  
   111  	Expect(globalCfg.NatInterfaces).To(HaveLen(3))
   112  	Expect(globalCfg.NatInterfaces[0].Name).To(Equal("if0"))
   113  	Expect(globalCfg.NatInterfaces[0].IsInside).To(BeFalse())
   114  	Expect(globalCfg.NatInterfaces[0].OutputFeature).To(BeFalse())
   115  	Expect(globalCfg.NatInterfaces[1].Name).To(Equal("if1"))
   116  	Expect(globalCfg.NatInterfaces[1].IsInside).To(BeTrue())
   117  	Expect(globalCfg.NatInterfaces[1].OutputFeature).To(BeFalse())
   118  	Expect(globalCfg.NatInterfaces[2].Name).To(Equal("if2"))
   119  	Expect(globalCfg.NatInterfaces[2].IsInside).To(BeTrue())
   120  	Expect(globalCfg.NatInterfaces[2].OutputFeature).To(BeTrue())
   121  
   122  	/*Expect(globalCfg.VirtualReassembly).ToNot(BeNil())
   123  	Expect(globalCfg.VirtualReassembly.Timeout).To(BeEquivalentTo(10))
   124  	Expect(globalCfg.VirtualReassembly.MaxReassemblies).To(BeEquivalentTo(5))
   125  	Expect(globalCfg.VirtualReassembly.MaxFragments).To(BeEquivalentTo(7))
   126  	Expect(globalCfg.VirtualReassembly.DropFragments).To(BeTrue())*/
   127  }
   128  
   129  func TestNat44InterfacesDump(t *testing.T) {
   130  	ctx, natHandler, swIfIndexes, _ := natTestSetup(t)
   131  	defer ctx.TeardownTestCtx()
   132  
   133  	// non-output interfaces
   134  	ctx.MockVpp.MockReply(
   135  		&vpp_nat.Nat44InterfaceDetails{
   136  			SwIfIndex: 1,
   137  			Flags:     nat_types.NAT_IS_OUTSIDE,
   138  		},
   139  		&vpp_nat.Nat44InterfaceDetails{
   140  			SwIfIndex: 2,
   141  			Flags:     nat_types.NAT_IS_INSIDE,
   142  		})
   143  	ctx.MockVpp.MockReply(&vpp_vpe.ControlPingReply{})
   144  
   145  	// output interfaces
   146  	ctx.MockVpp.MockReply(&vpp_nat.Nat44InterfaceOutputFeatureDetails{
   147  		SwIfIndex: 3,
   148  		Flags:     nat_types.NAT_IS_INSIDE | nat_types.NAT_IS_OUTSIDE,
   149  	})
   150  	ctx.MockVpp.MockReply(&vpp_vpe.ControlPingReply{})
   151  
   152  	swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1})
   153  	swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2})
   154  	swIfIndexes.Put("if2", &ifaceidx.IfaceMetadata{SwIfIndex: 3})
   155  
   156  	interfaces, err := natHandler.Nat44InterfacesDump()
   157  	Expect(err).To(Succeed())
   158  
   159  	Expect(interfaces).To(HaveLen(3))
   160  
   161  	Expect(interfaces[0].Name).To(Equal("if0"))
   162  	Expect(interfaces[0].NatInside).To(BeFalse())
   163  	Expect(interfaces[0].NatOutside).To(BeTrue())
   164  	Expect(interfaces[0].OutputFeature).To(BeFalse())
   165  
   166  	Expect(interfaces[1].Name).To(Equal("if1"))
   167  	Expect(interfaces[1].NatInside).To(BeTrue())
   168  	Expect(interfaces[1].NatOutside).To(BeFalse())
   169  	Expect(interfaces[1].OutputFeature).To(BeFalse())
   170  
   171  	Expect(interfaces[2].Name).To(Equal("if2"))
   172  	Expect(interfaces[2].NatInside).To(BeTrue())
   173  	Expect(interfaces[2].NatOutside).To(BeTrue())
   174  	Expect(interfaces[2].OutputFeature).To(BeTrue())
   175  }
   176  
   177  func TestNat44AddressPoolsDump(t *testing.T) {
   178  	ctx, natHandler, _, _ := natTestSetup(t)
   179  	defer ctx.TeardownTestCtx()
   180  
   181  	// address pool
   182  	ctx.MockVpp.MockReply(
   183  		&vpp_nat.Nat44AddressDetails{
   184  			IPAddress: ipTo4Address("192.168.10.1"),
   185  			Flags:     nat_types.NAT_IS_TWICE_NAT,
   186  			VrfID:     1,
   187  		},
   188  		&vpp_nat.Nat44AddressDetails{
   189  			IPAddress: ipTo4Address("192.168.10.2"),
   190  			VrfID:     2,
   191  		},
   192  		&vpp_nat.Nat44AddressDetails{
   193  			IPAddress: ipTo4Address("192.168.10.3"),
   194  			VrfID:     2,
   195  		},
   196  		&vpp_nat.Nat44AddressDetails{
   197  			IPAddress: ipTo4Address("192.168.10.4"),
   198  			VrfID:     2,
   199  		})
   200  	ctx.MockVpp.MockReply(&vpp_vpe.ControlPingReply{})
   201  
   202  	pools, err := natHandler.Nat44AddressPoolsDump()
   203  	Expect(err).To(Succeed())
   204  
   205  	Expect(pools).To(HaveLen(2))
   206  
   207  	Expect(pools[0].FirstIp).To(Equal("192.168.10.1"))
   208  	Expect(pools[0].LastIp).To(Equal(""))
   209  	Expect(pools[0].TwiceNat).To(BeTrue())
   210  	Expect(pools[0].VrfId).To(BeEquivalentTo(1))
   211  
   212  	Expect(pools[1].FirstIp).To(Equal("192.168.10.2"))
   213  	Expect(pools[1].LastIp).To(Equal("192.168.10.4"))
   214  	Expect(pools[1].TwiceNat).To(BeFalse())
   215  	Expect(pools[1].VrfId).To(BeEquivalentTo(2))
   216  }
   217  
   218  func TestDNATDump(t *testing.T) {
   219  	ctx, natHandler, swIfIndexes, dhcpIndexes := natTestSetup(t)
   220  	defer ctx.TeardownTestCtx()
   221  
   222  	// non-LB static mappings
   223  	ctx.MockVpp.MockReply(
   224  		&vpp_nat.Nat44StaticMappingDetails{
   225  			LocalIPAddress:    ipTo4Address("10.10.11.120"),
   226  			ExternalIPAddress: ipTo4Address("10.36.20.20"),
   227  			Protocol:          6,
   228  			LocalPort:         8080,
   229  			ExternalPort:      80,
   230  			ExternalSwIfIndex: vpp2101.NoInterface,
   231  			VrfID:             1,
   232  			Tag:               "DNAT 1",
   233  			Flags:             nat_types.NAT_IS_TWICE_NAT,
   234  		},
   235  		&vpp_nat.Nat44StaticMappingDetails{
   236  			LocalIPAddress:    ipTo4Address("10.10.11.120"),
   237  			Protocol:          6,
   238  			LocalPort:         8080,
   239  			ExternalPort:      80,
   240  			ExternalSwIfIndex: 1,
   241  			VrfID:             1,
   242  			Tag:               "DNAT 1",
   243  			Flags:             nat_types.NAT_IS_TWICE_NAT,
   244  		},
   245  		&vpp_nat.Nat44StaticMappingDetails{
   246  			LocalIPAddress:    ipTo4Address("10.10.11.140"),
   247  			Protocol:          6,
   248  			LocalPort:         8081,
   249  			ExternalPort:      80,
   250  			ExternalSwIfIndex: 2,
   251  			VrfID:             1,
   252  			Tag:               "DNAT 2",
   253  			Flags:             nat_types.NAT_IS_SELF_TWICE_NAT,
   254  		},
   255  		// auto-generated mappings with interface replaced by all assigned IP addresses
   256  		&vpp_nat.Nat44StaticMappingDetails{
   257  			LocalIPAddress:    ipTo4Address("10.10.11.120"),
   258  			ExternalIPAddress: ipTo4Address("10.36.20.30"),
   259  			Protocol:          6,
   260  			LocalPort:         8080,
   261  			ExternalPort:      80,
   262  			ExternalSwIfIndex: vpp2101.NoInterface,
   263  			VrfID:             1,
   264  			Tag:               "DNAT 1",
   265  			Flags:             nat_types.NAT_IS_TWICE_NAT,
   266  		},
   267  		&vpp_nat.Nat44StaticMappingDetails{
   268  			LocalIPAddress:    ipTo4Address("10.10.11.120"),
   269  			ExternalIPAddress: ipTo4Address("10.36.20.31"),
   270  			Protocol:          6,
   271  			LocalPort:         8080,
   272  			ExternalPort:      80,
   273  			ExternalSwIfIndex: vpp2101.NoInterface,
   274  			VrfID:             1,
   275  			Tag:               "DNAT 1",
   276  			Flags:             nat_types.NAT_IS_TWICE_NAT,
   277  		},
   278  		&vpp_nat.Nat44StaticMappingDetails{
   279  			LocalIPAddress:    ipTo4Address("10.10.11.140"),
   280  			ExternalIPAddress: ipTo4Address("10.36.40.10"),
   281  			Protocol:          6,
   282  			LocalPort:         8081,
   283  			ExternalPort:      80,
   284  			ExternalSwIfIndex: vpp2101.NoInterface,
   285  			VrfID:             1,
   286  			Tag:               "DNAT 2",
   287  			Flags:             nat_types.NAT_IS_SELF_TWICE_NAT,
   288  		},
   289  		&vpp_nat.Nat44StaticMappingDetails{
   290  			LocalIPAddress:    ipTo4Address("10.10.11.140"),
   291  			ExternalIPAddress: ipTo4Address("10.36.40.20"),
   292  			Protocol:          6,
   293  			LocalPort:         8081,
   294  			ExternalPort:      80,
   295  			ExternalSwIfIndex: vpp2101.NoInterface,
   296  			VrfID:             1,
   297  			Tag:               "DNAT 2",
   298  			Flags:             nat_types.NAT_IS_SELF_TWICE_NAT,
   299  		},
   300  	)
   301  
   302  	ctx.MockVpp.MockReply(&vpp_vpe.ControlPingReply{})
   303  
   304  	// LB static mappings
   305  	ctx.MockVpp.MockReply(&vpp_nat.Nat44LbStaticMappingDetails{
   306  		ExternalAddr: ipTo4Address("10.36.20.60"),
   307  		ExternalPort: 53,
   308  		Protocol:     17,
   309  		Flags:        nat_types.NAT_IS_OUT2IN_ONLY,
   310  		Tag:          "DNAT 2",
   311  		LocalNum:     2,
   312  		Locals: []vpp_nat.Nat44LbAddrPort{
   313  			{
   314  				Addr:        ipTo4Address("10.10.11.161"),
   315  				Port:        53,
   316  				Probability: 1,
   317  				VrfID:       0,
   318  			},
   319  			{
   320  				Addr:        ipTo4Address("10.10.11.162"),
   321  				Port:        153,
   322  				Probability: 2,
   323  				VrfID:       0,
   324  			},
   325  		},
   326  	})
   327  
   328  	ctx.MockVpp.MockReply(&vpp_vpe.ControlPingReply{})
   329  
   330  	// identity mappings
   331  	ctx.MockVpp.MockReply(
   332  		&vpp_nat.Nat44IdentityMappingDetails{
   333  			Flags:     nat_types.NAT_IS_ADDR_ONLY,
   334  			Protocol:  17,
   335  			IPAddress: ipTo4Address("10.10.11.200"),
   336  			SwIfIndex: vpp2101.NoInterface,
   337  			VrfID:     1,
   338  			Tag:       "DNAT 3",
   339  		},
   340  		&vpp_nat.Nat44IdentityMappingDetails{
   341  			Flags:     nat_types.NAT_IS_ADDR_ONLY,
   342  			Protocol:  17,
   343  			SwIfIndex: 2,
   344  			VrfID:     1,
   345  			Tag:       "DNAT 3",
   346  		},
   347  		// auto-generated mappings with interface replaced by all assigned IP addresses
   348  		&vpp_nat.Nat44IdentityMappingDetails{
   349  			Flags:     nat_types.NAT_IS_ADDR_ONLY,
   350  			Protocol:  17,
   351  			IPAddress: ipTo4Address("10.36.40.10"),
   352  			SwIfIndex: vpp2101.NoInterface,
   353  			VrfID:     1,
   354  			Tag:       "DNAT 3",
   355  		},
   356  		&vpp_nat.Nat44IdentityMappingDetails{
   357  			Flags:     nat_types.NAT_IS_ADDR_ONLY,
   358  			Protocol:  17,
   359  			IPAddress: ipTo4Address("10.36.40.20"),
   360  			SwIfIndex: vpp2101.NoInterface,
   361  			VrfID:     1,
   362  			Tag:       "DNAT 3",
   363  		},
   364  	)
   365  
   366  	ctx.MockVpp.MockReply(&vpp_vpe.ControlPingReply{})
   367  
   368  	// interfaces and their IP addresses
   369  	swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1, IPAddresses: []string{"10.36.20.30", "10.36.20.31"}})
   370  	swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2, IPAddresses: []string{"10.36.40.10"}})
   371  	dhcpIndexes.Put("if1", &ifs.DHCPLease{InterfaceName: "if0", HostIpAddress: "10.36.40.20"})
   372  
   373  	dnats, err := natHandler.DNat44Dump()
   374  	Expect(err).To(Succeed())
   375  
   376  	Expect(dnats).To(HaveLen(3))
   377  
   378  	dnat := dnats[0]
   379  	Expect(dnat.Label).To(Equal("DNAT 1"))
   380  	Expect(dnat.IdMappings).To(HaveLen(0))
   381  	Expect(dnat.StMappings).To(HaveLen(2))
   382  	// 1st mapping
   383  	Expect(dnat.StMappings[0].TwiceNat).To(Equal(nat.DNat44_StaticMapping_ENABLED))
   384  	Expect(dnat.StMappings[0].Protocol).To(Equal(nat.DNat44_TCP))
   385  	Expect(dnat.StMappings[0].ExternalInterface).To(BeEmpty())
   386  	Expect(dnat.StMappings[0].ExternalIp).To(Equal("10.36.20.20"))
   387  	Expect(dnat.StMappings[0].ExternalPort).To(BeEquivalentTo(80))
   388  	Expect(dnat.StMappings[0].LocalIps).To(HaveLen(1))
   389  	Expect(dnat.StMappings[0].LocalIps[0].VrfId).To(BeEquivalentTo(1))
   390  	Expect(dnat.StMappings[0].LocalIps[0].LocalIp).To(Equal("10.10.11.120"))
   391  	Expect(dnat.StMappings[0].LocalIps[0].LocalPort).To(BeEquivalentTo(8080))
   392  	Expect(dnat.StMappings[0].LocalIps[0].Probability).To(BeEquivalentTo(0))
   393  	// 2nd mapping
   394  	Expect(dnat.StMappings[1].TwiceNat).To(Equal(nat.DNat44_StaticMapping_ENABLED))
   395  	Expect(dnat.StMappings[1].Protocol).To(Equal(nat.DNat44_TCP))
   396  	Expect(dnat.StMappings[1].ExternalInterface).To(BeEquivalentTo("if0"))
   397  	Expect(dnat.StMappings[1].ExternalIp).To(BeEquivalentTo("0.0.0.0"))
   398  	Expect(dnat.StMappings[1].ExternalPort).To(BeEquivalentTo(80))
   399  	Expect(dnat.StMappings[1].LocalIps).To(HaveLen(1))
   400  	Expect(dnat.StMappings[1].LocalIps[0].VrfId).To(BeEquivalentTo(1))
   401  	Expect(dnat.StMappings[1].LocalIps[0].LocalIp).To(Equal("10.10.11.120"))
   402  	Expect(dnat.StMappings[1].LocalIps[0].LocalPort).To(BeEquivalentTo(8080))
   403  	Expect(dnat.StMappings[1].LocalIps[0].Probability).To(BeEquivalentTo(0))
   404  
   405  	dnat = dnats[1]
   406  	// -> non-LB mapping
   407  	Expect(dnat.Label).To(Equal("DNAT 2"))
   408  	Expect(dnat.IdMappings).To(HaveLen(0))
   409  	Expect(dnat.StMappings).To(HaveLen(2))
   410  	Expect(dnat.StMappings[0].TwiceNat).To(Equal(nat.DNat44_StaticMapping_SELF))
   411  	Expect(dnat.StMappings[0].Protocol).To(Equal(nat.DNat44_TCP))
   412  	Expect(dnat.StMappings[0].ExternalInterface).To(Equal("if1"))
   413  	Expect(dnat.StMappings[0].ExternalIp).To(BeEquivalentTo("0.0.0.0"))
   414  	Expect(dnat.StMappings[0].ExternalPort).To(BeEquivalentTo(80))
   415  	Expect(dnat.StMappings[0].LocalIps).To(HaveLen(1))
   416  	Expect(dnat.StMappings[0].LocalIps[0].VrfId).To(BeEquivalentTo(1))
   417  	Expect(dnat.StMappings[0].LocalIps[0].LocalIp).To(Equal("10.10.11.140"))
   418  	Expect(dnat.StMappings[0].LocalIps[0].LocalPort).To(BeEquivalentTo(8081))
   419  	Expect(dnat.StMappings[0].LocalIps[0].Probability).To(BeEquivalentTo(0))
   420  	// -> LB mapping
   421  	Expect(dnat.StMappings[1].TwiceNat).To(Equal(nat.DNat44_StaticMapping_DISABLED))
   422  	Expect(dnat.StMappings[1].Protocol).To(Equal(nat.DNat44_UDP))
   423  	Expect(dnat.StMappings[1].ExternalInterface).To(BeEmpty())
   424  	Expect(dnat.StMappings[1].ExternalIp).To(Equal("10.36.20.60"))
   425  	Expect(dnat.StMappings[1].ExternalPort).To(BeEquivalentTo(53))
   426  	Expect(dnat.StMappings[1].LocalIps).To(HaveLen(2))
   427  	Expect(dnat.StMappings[1].LocalIps[0].VrfId).To(BeEquivalentTo(0))
   428  	Expect(dnat.StMappings[1].LocalIps[0].LocalIp).To(Equal("10.10.11.161"))
   429  	Expect(dnat.StMappings[1].LocalIps[0].LocalPort).To(BeEquivalentTo(53))
   430  	Expect(dnat.StMappings[1].LocalIps[0].Probability).To(BeEquivalentTo(1))
   431  	Expect(dnat.StMappings[1].LocalIps[1].VrfId).To(BeEquivalentTo(0))
   432  	Expect(dnat.StMappings[1].LocalIps[1].LocalIp).To(Equal("10.10.11.162"))
   433  	Expect(dnat.StMappings[1].LocalIps[1].LocalPort).To(BeEquivalentTo(153))
   434  	Expect(dnat.StMappings[1].LocalIps[1].Probability).To(BeEquivalentTo(2))
   435  
   436  	dnat = dnats[2]
   437  	Expect(dnat.Label).To(Equal("DNAT 3"))
   438  	Expect(dnat.StMappings).To(HaveLen(0))
   439  	Expect(dnat.IdMappings).To(HaveLen(2))
   440  	// 1st mapping
   441  	Expect(dnat.IdMappings[0].VrfId).To(BeEquivalentTo(1))
   442  	Expect(dnat.IdMappings[0].Protocol).To(Equal(nat.DNat44_UDP))
   443  	Expect(dnat.IdMappings[0].Port).To(BeEquivalentTo(0))
   444  	Expect(dnat.IdMappings[0].IpAddress).To(Equal("10.10.11.200"))
   445  	Expect(dnat.IdMappings[0].Interface).To(BeEmpty())
   446  	// 2nd mapping
   447  	Expect(dnat.IdMappings[1].VrfId).To(BeEquivalentTo(1))
   448  	Expect(dnat.IdMappings[1].Protocol).To(Equal(nat.DNat44_UDP))
   449  	Expect(dnat.IdMappings[1].Port).To(BeEquivalentTo(0))
   450  	Expect(dnat.IdMappings[1].IpAddress).To(BeEquivalentTo("0.0.0.0"))
   451  	Expect(dnat.IdMappings[1].Interface).To(BeEquivalentTo("if1"))
   452  }
   453  
   454  func natTestSetup(t *testing.T) (*vppmock.TestCtx, vppcalls.NatVppAPI, ifaceidx.IfaceMetadataIndexRW, idxmap.NamedMappingRW) {
   455  	ctx := vppmock.SetupTestCtx(t)
   456  	log := logrus.NewLogger("test-log")
   457  	swIfIndexes := ifaceidx.NewIfaceIndex(logrus.DefaultLogger(), "test-sw_if_indexes")
   458  	dhcpIndexes := idxmap_mem.NewNamedMapping(logrus.DefaultLogger(), "test-dhcp_indexes", nil)
   459  	natHandler := vpp2101.NewNatVppHandler(ctx.MockVPPClient, swIfIndexes, dhcpIndexes, log)
   460  	return ctx, natHandler, swIfIndexes, dhcpIndexes
   461  }
   462  
   463  func ipTo4Address(ipStr string) (addr ip_types.IP4Address) {
   464  	netIP := net.ParseIP(ipStr)
   465  	if ip4 := netIP.To4(); ip4 != nil {
   466  		copy(addr[:], ip4)
   467  	}
   468  	return
   469  }