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 }