go.ligato.io/vpp-agent/v3@v3.5.0/plugins/vpp/natplugin/vppcalls/vpp2106/nat_vppcalls_test.go (about) 1 // Copyright (c) 2021 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 vpp2106_test 16 17 import ( 18 "bytes" 19 "net" 20 "testing" 21 22 "go.ligato.io/vpp-agent/v3/plugins/vpp/natplugin/vppcalls" 23 "go.ligato.io/vpp-agent/v3/plugins/vpp/natplugin/vppcalls/vpp2106" 24 25 . "github.com/onsi/gomega" 26 27 "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2106/ip_types" 28 vpp_nat_ed "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2106/nat44_ed" 29 vpp_nat_ei "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2106/nat44_ei" 30 "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2106/nat_types" 31 "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/ifaceidx" 32 nat "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/nat" 33 ) 34 35 func TestSetNat44EdForwarding(t *testing.T) { 36 ctx, natHandler, _, _ := natTestSetup(t) 37 defer ctx.TeardownTestCtx() 38 39 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 40 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 41 Expect(err).ShouldNot(HaveOccurred()) 42 43 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44ForwardingEnableDisableReply{}) 44 err = natHandler.SetNat44Forwarding(true) 45 46 Expect(err).ShouldNot(HaveOccurred()) 47 48 t.Logf("Msg: %+v (%#v)", ctx.MockChannel.Msg, ctx.MockChannel.Msg) 49 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44ForwardingEnableDisable) 50 Expect(ok).To(BeTrue()) 51 Expect(msg).ToNot(BeNil()) 52 Expect(msg.Enable).To(BeTrue()) 53 } 54 55 func TestSetNat44EiForwarding(t *testing.T) { 56 ctx, natHandler, _, _ := natTestSetup(t) 57 defer ctx.TeardownTestCtx() 58 59 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 60 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 61 Expect(err).ShouldNot(HaveOccurred()) 62 63 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiForwardingEnableDisableReply{}) 64 err = natHandler.SetNat44Forwarding(true) 65 66 Expect(err).ShouldNot(HaveOccurred()) 67 68 t.Logf("Msg: %+v (%#v)", ctx.MockChannel.Msg, ctx.MockChannel.Msg) 69 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiForwardingEnableDisable) 70 Expect(ok).To(BeTrue()) 71 Expect(msg).ToNot(BeNil()) 72 Expect(msg.Enable).To(BeTrue()) 73 } 74 75 func TestUnsetNat44EdForwarding(t *testing.T) { 76 ctx, natHandler, _, _ := natTestSetup(t) 77 defer ctx.TeardownTestCtx() 78 79 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 80 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 81 Expect(err).ShouldNot(HaveOccurred()) 82 83 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44ForwardingEnableDisableReply{}) 84 err = natHandler.SetNat44Forwarding(false) 85 86 Expect(err).ShouldNot(HaveOccurred()) 87 88 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44ForwardingEnableDisable) 89 Expect(ok).To(BeTrue()) 90 Expect(msg).ToNot(BeNil()) 91 Expect(msg.Enable).To(BeFalse()) 92 } 93 94 func TestUnsetNat44EiForwarding(t *testing.T) { 95 ctx, natHandler, _, _ := natTestSetup(t) 96 defer ctx.TeardownTestCtx() 97 98 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 99 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 100 Expect(err).ShouldNot(HaveOccurred()) 101 102 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiForwardingEnableDisableReply{}) 103 err = natHandler.SetNat44Forwarding(false) 104 105 Expect(err).ShouldNot(HaveOccurred()) 106 107 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiForwardingEnableDisable) 108 Expect(ok).To(BeTrue()) 109 Expect(msg).ToNot(BeNil()) 110 Expect(msg.Enable).To(BeFalse()) 111 } 112 113 func TestSetNat44EdForwardingError(t *testing.T) { 114 ctx, natHandler, _, _ := natTestSetup(t) 115 defer ctx.TeardownTestCtx() 116 117 // Incorrect reply object 118 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelStaticMappingV2Reply{}) 119 err := natHandler.SetNat44Forwarding(true) 120 121 Expect(err).Should(HaveOccurred()) 122 } 123 124 func TestSetNat44EiForwardingError(t *testing.T) { 125 ctx, natHandler, _, _ := natTestSetup(t) 126 defer ctx.TeardownTestCtx() 127 128 // Incorrect reply object 129 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelStaticMappingReply{}) 130 err := natHandler.SetNat44Forwarding(true) 131 132 Expect(err).Should(HaveOccurred()) 133 } 134 135 func TestSetNat44EdForwardingRetval(t *testing.T) { 136 ctx, natHandler, _, _ := natTestSetup(t) 137 defer ctx.TeardownTestCtx() 138 139 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 140 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 141 Expect(err).ShouldNot(HaveOccurred()) 142 143 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44ForwardingEnableDisableReply{ 144 Retval: 1, 145 }) 146 err = natHandler.SetNat44Forwarding(true) 147 148 Expect(err).Should(HaveOccurred()) 149 } 150 151 func TestSetNat44EiForwardingRetval(t *testing.T) { 152 ctx, natHandler, _, _ := natTestSetup(t) 153 defer ctx.TeardownTestCtx() 154 155 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 156 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 157 Expect(err).ShouldNot(HaveOccurred()) 158 159 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiForwardingEnableDisableReply{ 160 Retval: 1, 161 }) 162 err = natHandler.SetNat44Forwarding(true) 163 164 Expect(err).Should(HaveOccurred()) 165 } 166 167 func TestEnableNat44EdInterfaceAsInside(t *testing.T) { 168 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 169 defer ctx.TeardownTestCtx() 170 171 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 172 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 173 Expect(err).ShouldNot(HaveOccurred()) 174 175 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 176 177 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44InterfaceAddDelFeatureReply{}) 178 err = natHandler.EnableNat44Interface("if0", true, false) 179 180 Expect(err).ShouldNot(HaveOccurred()) 181 182 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44InterfaceAddDelFeature) 183 Expect(ok).To(BeTrue()) 184 Expect(msg).ToNot(BeNil()) 185 Expect(msg.IsAdd).To(BeTrue()) 186 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_INSIDE)) 187 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 188 } 189 190 func TestEnableNat44EiInterfaceAsInside(t *testing.T) { 191 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 192 defer ctx.TeardownTestCtx() 193 194 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 195 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 196 Expect(err).ShouldNot(HaveOccurred()) 197 198 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 199 200 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiInterfaceAddDelFeatureReply{}) 201 err = natHandler.EnableNat44Interface("if0", true, false) 202 203 Expect(err).ShouldNot(HaveOccurred()) 204 205 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiInterfaceAddDelFeature) 206 Expect(ok).To(BeTrue()) 207 Expect(msg).ToNot(BeNil()) 208 Expect(msg.IsAdd).To(BeTrue()) 209 Expect(msg.Flags).To(BeEquivalentTo(vpp_nat_ei.NAT44_EI_IF_INSIDE)) 210 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 211 } 212 213 func TestEnableNat44EdInterfaceAsOutside(t *testing.T) { 214 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 215 defer ctx.TeardownTestCtx() 216 217 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 218 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 219 Expect(err).ShouldNot(HaveOccurred()) 220 221 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 222 223 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44InterfaceAddDelFeatureReply{}) 224 err = natHandler.EnableNat44Interface("if1", false, false) 225 226 Expect(err).ShouldNot(HaveOccurred()) 227 228 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44InterfaceAddDelFeature) 229 Expect(ok).To(BeTrue()) 230 Expect(msg).ToNot(BeNil()) 231 Expect(msg.IsAdd).To(BeTrue()) 232 Expect(msg.Flags).To(BeEquivalentTo(0)) 233 Expect(msg.SwIfIndex).To(BeEquivalentTo(2)) 234 } 235 236 func TestEnableNat44EiInterfaceAsOutside(t *testing.T) { 237 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 238 defer ctx.TeardownTestCtx() 239 240 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 241 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 242 Expect(err).ShouldNot(HaveOccurred()) 243 244 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 245 246 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiInterfaceAddDelFeatureReply{}) 247 err = natHandler.EnableNat44Interface("if1", false, false) 248 249 Expect(err).ShouldNot(HaveOccurred()) 250 251 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiInterfaceAddDelFeature) 252 Expect(ok).To(BeTrue()) 253 Expect(msg).ToNot(BeNil()) 254 Expect(msg.IsAdd).To(BeTrue()) 255 Expect(msg.Flags).To(BeEquivalentTo(0)) 256 Expect(msg.SwIfIndex).To(BeEquivalentTo(2)) 257 } 258 259 func TestEnableNat44EdInterfaceError(t *testing.T) { 260 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 261 defer ctx.TeardownTestCtx() 262 263 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 264 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 265 Expect(err).ShouldNot(HaveOccurred()) 266 267 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 268 269 // Incorrect reply object 270 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelAddressRangeReply{}) 271 err = natHandler.EnableNat44Interface("if1", false, false) 272 273 Expect(err).Should(HaveOccurred()) 274 } 275 276 func TestEnableNat44EiInterfaceError(t *testing.T) { 277 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 278 defer ctx.TeardownTestCtx() 279 280 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 281 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 282 Expect(err).ShouldNot(HaveOccurred()) 283 284 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 285 286 // Incorrect reply object 287 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelAddressRangeReply{}) 288 err = natHandler.EnableNat44Interface("if1", false, false) 289 290 Expect(err).Should(HaveOccurred()) 291 } 292 293 func TestEnableNat44EdInterfaceRetval(t *testing.T) { 294 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 295 defer ctx.TeardownTestCtx() 296 297 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 298 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 299 Expect(err).ShouldNot(HaveOccurred()) 300 301 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 302 303 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44InterfaceAddDelFeatureReply{ 304 Retval: 1, 305 }) 306 err = natHandler.EnableNat44Interface("if1", false, false) 307 308 Expect(err).Should(HaveOccurred()) 309 } 310 311 func TestEnableNat44EiInterfaceRetval(t *testing.T) { 312 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 313 defer ctx.TeardownTestCtx() 314 315 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 316 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 317 Expect(err).ShouldNot(HaveOccurred()) 318 319 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 320 321 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiInterfaceAddDelFeatureReply{ 322 Retval: 1, 323 }) 324 err = natHandler.EnableNat44Interface("if1", false, false) 325 326 Expect(err).Should(HaveOccurred()) 327 } 328 329 func TestDisableNat44EdInterfaceAsInside(t *testing.T) { 330 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 331 defer ctx.TeardownTestCtx() 332 333 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 334 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 335 Expect(err).ShouldNot(HaveOccurred()) 336 337 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 338 339 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44InterfaceAddDelFeatureReply{}) 340 err = natHandler.DisableNat44Interface("if0", true, false) 341 342 Expect(err).ShouldNot(HaveOccurred()) 343 344 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44InterfaceAddDelFeature) 345 Expect(ok).To(BeTrue()) 346 Expect(msg).ToNot(BeNil()) 347 Expect(msg.IsAdd).To(BeFalse()) 348 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_INSIDE)) 349 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 350 } 351 352 func TestDisableNat44EiInterfaceAsInside(t *testing.T) { 353 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 354 defer ctx.TeardownTestCtx() 355 356 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 357 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 358 Expect(err).ShouldNot(HaveOccurred()) 359 360 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 361 362 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiInterfaceAddDelFeatureReply{}) 363 err = natHandler.DisableNat44Interface("if0", true, false) 364 365 Expect(err).ShouldNot(HaveOccurred()) 366 367 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiInterfaceAddDelFeature) 368 Expect(ok).To(BeTrue()) 369 Expect(msg).ToNot(BeNil()) 370 Expect(msg.IsAdd).To(BeFalse()) 371 Expect(msg.Flags).To(BeEquivalentTo(vpp_nat_ei.NAT44_EI_IF_INSIDE)) 372 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 373 } 374 375 func TestDisableNat44EdInterfaceAsOutside(t *testing.T) { 376 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 377 defer ctx.TeardownTestCtx() 378 379 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 380 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 381 Expect(err).ShouldNot(HaveOccurred()) 382 383 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 384 385 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44InterfaceAddDelFeatureReply{}) 386 err = natHandler.DisableNat44Interface("if1", false, false) 387 388 Expect(err).ShouldNot(HaveOccurred()) 389 390 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44InterfaceAddDelFeature) 391 Expect(ok).To(BeTrue()) 392 Expect(msg).ToNot(BeNil()) 393 Expect(msg.IsAdd).To(BeFalse()) 394 Expect(msg.Flags).To(BeEquivalentTo(0)) 395 Expect(msg.SwIfIndex).To(BeEquivalentTo(2)) 396 } 397 398 func TestDisableNat44EiInterfaceAsOutside(t *testing.T) { 399 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 400 defer ctx.TeardownTestCtx() 401 402 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 403 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 404 Expect(err).ShouldNot(HaveOccurred()) 405 406 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 407 408 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiInterfaceAddDelFeatureReply{}) 409 err = natHandler.DisableNat44Interface("if1", false, false) 410 411 Expect(err).ShouldNot(HaveOccurred()) 412 413 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiInterfaceAddDelFeature) 414 Expect(ok).To(BeTrue()) 415 Expect(msg).ToNot(BeNil()) 416 Expect(msg.IsAdd).To(BeFalse()) 417 Expect(msg.Flags).To(BeEquivalentTo(0)) 418 Expect(msg.SwIfIndex).To(BeEquivalentTo(2)) 419 } 420 421 func TestEnableNat44EdInterfaceOutputAsInside(t *testing.T) { 422 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 423 defer ctx.TeardownTestCtx() 424 425 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 426 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 427 Expect(err).ShouldNot(HaveOccurred()) 428 429 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 430 431 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44InterfaceAddDelOutputFeatureReply{}) 432 err = natHandler.EnableNat44Interface("if0", true, true) 433 434 Expect(err).ShouldNot(HaveOccurred()) 435 436 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44InterfaceAddDelOutputFeature) 437 Expect(ok).To(BeTrue()) 438 Expect(msg).ToNot(BeNil()) 439 Expect(msg.IsAdd).To(BeTrue()) 440 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_INSIDE)) 441 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 442 } 443 444 func TestEnableNat44EiInterfaceOutputAsInside(t *testing.T) { 445 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 446 defer ctx.TeardownTestCtx() 447 448 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 449 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 450 Expect(err).ShouldNot(HaveOccurred()) 451 452 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 453 454 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiInterfaceAddDelFeatureReply{}) 455 err = natHandler.EnableNat44Interface("if0", true, true) 456 457 Expect(err).ShouldNot(HaveOccurred()) 458 459 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiInterfaceAddDelFeature) 460 Expect(ok).To(BeTrue()) 461 Expect(msg).ToNot(BeNil()) 462 Expect(msg.IsAdd).To(BeTrue()) 463 Expect(msg.Flags).To(BeEquivalentTo(vpp_nat_ei.NAT44_EI_IF_INSIDE)) 464 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 465 } 466 467 func TestEnableNat44EdInterfaceOutputAsOutside(t *testing.T) { 468 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 469 defer ctx.TeardownTestCtx() 470 471 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 472 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 473 Expect(err).ShouldNot(HaveOccurred()) 474 475 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 476 477 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44InterfaceAddDelOutputFeatureReply{}) 478 err = natHandler.EnableNat44Interface("if1", false, true) 479 480 Expect(err).ShouldNot(HaveOccurred()) 481 482 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44InterfaceAddDelOutputFeature) 483 Expect(ok).To(BeTrue()) 484 Expect(msg).ToNot(BeNil()) 485 Expect(msg.IsAdd).To(BeTrue()) 486 Expect(msg.Flags).To(BeEquivalentTo(0)) 487 Expect(msg.SwIfIndex).To(BeEquivalentTo(2)) 488 } 489 490 func TestEnableNat44EiInterfaceOutputAsOutside(t *testing.T) { 491 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 492 defer ctx.TeardownTestCtx() 493 494 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 495 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 496 Expect(err).ShouldNot(HaveOccurred()) 497 498 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 499 500 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiInterfaceAddDelFeatureReply{}) 501 err = natHandler.EnableNat44Interface("if1", false, true) 502 503 Expect(err).ShouldNot(HaveOccurred()) 504 505 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiInterfaceAddDelFeature) 506 Expect(ok).To(BeTrue()) 507 Expect(msg).ToNot(BeNil()) 508 Expect(msg.IsAdd).To(BeTrue()) 509 Expect(msg.Flags).To(BeEquivalentTo(0)) 510 Expect(msg.SwIfIndex).To(BeEquivalentTo(2)) 511 } 512 513 func TestEnableNat44EdInterfaceOutputError(t *testing.T) { 514 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 515 defer ctx.TeardownTestCtx() 516 517 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 518 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 519 Expect(err).ShouldNot(HaveOccurred()) 520 521 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 522 523 // Incorrect reply object 524 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelStaticMappingV2Reply{}) 525 err = natHandler.EnableNat44Interface("if1", false, true) 526 527 Expect(err).Should(HaveOccurred()) 528 } 529 530 func TestEnableNat44InterfaceOutputError(t *testing.T) { 531 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 532 defer ctx.TeardownTestCtx() 533 534 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 535 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 536 Expect(err).ShouldNot(HaveOccurred()) 537 538 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 539 540 // Incorrect reply object 541 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelStaticMappingReply{}) 542 err = natHandler.EnableNat44Interface("if1", false, true) 543 544 Expect(err).Should(HaveOccurred()) 545 } 546 547 func TestEnableNat44EdInterfaceOutputRetval(t *testing.T) { 548 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 549 defer ctx.TeardownTestCtx() 550 551 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 552 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 553 Expect(err).ShouldNot(HaveOccurred()) 554 555 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 556 557 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44InterfaceAddDelOutputFeatureReply{ 558 Retval: 1, 559 }) 560 err = natHandler.EnableNat44Interface("if1", false, true) 561 562 Expect(err).Should(HaveOccurred()) 563 } 564 565 func TestEnableNat44EiInterfaceOutputRetval(t *testing.T) { 566 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 567 defer ctx.TeardownTestCtx() 568 569 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 570 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 571 Expect(err).ShouldNot(HaveOccurred()) 572 573 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 574 575 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiInterfaceAddDelOutputFeatureReply{ 576 Retval: 1, 577 }) 578 err = natHandler.EnableNat44Interface("if1", false, true) 579 580 Expect(err).Should(HaveOccurred()) 581 } 582 583 func TestDisableNat44EdInterfaceOutputAsInside(t *testing.T) { 584 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 585 defer ctx.TeardownTestCtx() 586 587 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 588 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 589 Expect(err).ShouldNot(HaveOccurred()) 590 591 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 592 593 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44InterfaceAddDelOutputFeatureReply{}) 594 err = natHandler.DisableNat44Interface("if0", true, true) 595 596 Expect(err).ShouldNot(HaveOccurred()) 597 598 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44InterfaceAddDelOutputFeature) 599 Expect(ok).To(BeTrue()) 600 Expect(msg).ToNot(BeNil()) 601 Expect(msg.IsAdd).To(BeFalse()) 602 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_INSIDE)) 603 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 604 } 605 606 func TestDisableNat44EiInterfaceOutputAsInside(t *testing.T) { 607 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 608 defer ctx.TeardownTestCtx() 609 610 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 611 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 612 Expect(err).ShouldNot(HaveOccurred()) 613 614 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 615 616 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiInterfaceAddDelFeatureReply{}) 617 err = natHandler.DisableNat44Interface("if0", true, true) 618 619 Expect(err).ShouldNot(HaveOccurred()) 620 621 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiInterfaceAddDelFeature) 622 Expect(ok).To(BeTrue()) 623 Expect(msg).ToNot(BeNil()) 624 Expect(msg.IsAdd).To(BeFalse()) 625 Expect(msg.Flags).To(BeEquivalentTo(vpp_nat_ei.NAT44_EI_IF_INSIDE)) 626 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 627 } 628 629 func TestDisableNat44EdInterfaceOutputAsOutside(t *testing.T) { 630 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 631 defer ctx.TeardownTestCtx() 632 633 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 634 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 635 Expect(err).ShouldNot(HaveOccurred()) 636 637 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 638 639 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44InterfaceAddDelOutputFeatureReply{}) 640 err = natHandler.DisableNat44Interface("if1", false, true) 641 642 Expect(err).ShouldNot(HaveOccurred()) 643 644 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44InterfaceAddDelOutputFeature) 645 Expect(ok).To(BeTrue()) 646 Expect(msg).ToNot(BeNil()) 647 Expect(msg.IsAdd).To(BeFalse()) 648 Expect(msg.Flags).To(BeEquivalentTo(0)) 649 Expect(msg.SwIfIndex).To(BeEquivalentTo(2)) 650 } 651 652 func TestDisableNat44EiInterfaceOutputAsOutside(t *testing.T) { 653 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 654 defer ctx.TeardownTestCtx() 655 656 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 657 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 658 Expect(err).ShouldNot(HaveOccurred()) 659 660 swIfIndexes.Put("if1", &ifaceidx.IfaceMetadata{SwIfIndex: 2}) 661 662 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiInterfaceAddDelFeatureReply{}) 663 err = natHandler.DisableNat44Interface("if1", false, true) 664 665 Expect(err).ShouldNot(HaveOccurred()) 666 667 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiInterfaceAddDelFeature) 668 Expect(ok).To(BeTrue()) 669 Expect(msg).ToNot(BeNil()) 670 Expect(msg.IsAdd).To(BeFalse()) 671 Expect(msg.Flags).To(BeEquivalentTo(0)) 672 Expect(msg.SwIfIndex).To(BeEquivalentTo(2)) 673 } 674 675 func TestAddNat44EdAddressPool(t *testing.T) { 676 ctx, natHandler, _, _ := natTestSetup(t) 677 defer ctx.TeardownTestCtx() 678 679 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 680 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 681 Expect(err).ShouldNot(HaveOccurred()) 682 683 addr1 := net.ParseIP("10.0.0.1").To4() 684 addr2 := net.ParseIP("10.0.0.10").To4() 685 686 // first IP only 687 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelAddressRangeReply{}) 688 err = natHandler.AddNat44AddressPool(0, addr1.String(), "", false) 689 Expect(err).ShouldNot(HaveOccurred()) 690 691 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelAddressRange) 692 Expect(ok).To(BeTrue()) 693 Expect(msg.IsAdd).To(BeTrue()) 694 Expect(addressTo4IP(msg.FirstIPAddress)).To(BeEquivalentTo(addr1.String())) 695 Expect(addressTo4IP(msg.LastIPAddress)).To(BeEquivalentTo(addr1.String())) 696 Expect(msg.VrfID).To(BeEquivalentTo(0)) 697 Expect(msg.Flags).To(BeEquivalentTo(0)) 698 699 // first IP + last IP 700 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelAddressRangeReply{}) 701 err = natHandler.AddNat44AddressPool(0, addr1.String(), addr2.String(), false) 702 Expect(err).ShouldNot(HaveOccurred()) 703 704 msg, ok = ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelAddressRange) 705 Expect(ok).To(BeTrue()) 706 Expect(msg.IsAdd).To(BeTrue()) 707 Expect(addressTo4IP(msg.FirstIPAddress)).To(BeEquivalentTo(addr1.String())) 708 Expect(addressTo4IP(msg.LastIPAddress)).To(BeEquivalentTo(addr2.String())) 709 Expect(msg.VrfID).To(BeEquivalentTo(0)) 710 Expect(msg.Flags).To(BeEquivalentTo(0)) 711 } 712 713 func TestAddNat44EiAddressPool(t *testing.T) { 714 ctx, natHandler, _, _ := natTestSetup(t) 715 defer ctx.TeardownTestCtx() 716 717 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 718 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 719 Expect(err).ShouldNot(HaveOccurred()) 720 721 addr1 := net.ParseIP("10.0.0.1").To4() 722 addr2 := net.ParseIP("10.0.0.10").To4() 723 724 // first IP only 725 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelAddressRangeReply{}) 726 err = natHandler.AddNat44AddressPool(0, addr1.String(), "", false) 727 Expect(err).ShouldNot(HaveOccurred()) 728 729 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiAddDelAddressRange) 730 Expect(ok).To(BeTrue()) 731 Expect(msg.IsAdd).To(BeTrue()) 732 Expect(addressTo4IP(msg.FirstIPAddress)).To(BeEquivalentTo(addr1.String())) 733 Expect(addressTo4IP(msg.LastIPAddress)).To(BeEquivalentTo(addr1.String())) 734 Expect(msg.VrfID).To(BeEquivalentTo(0)) 735 //Expect(msg.Flags).To(BeEquivalentTo(0)) 736 737 // first IP + last IP 738 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelAddressRangeReply{}) 739 err = natHandler.AddNat44AddressPool(0, addr1.String(), addr2.String(), false) 740 Expect(err).ShouldNot(HaveOccurred()) 741 742 msg, ok = ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiAddDelAddressRange) 743 Expect(ok).To(BeTrue()) 744 Expect(msg.IsAdd).To(BeTrue()) 745 Expect(addressTo4IP(msg.FirstIPAddress)).To(BeEquivalentTo(addr1.String())) 746 Expect(addressTo4IP(msg.LastIPAddress)).To(BeEquivalentTo(addr2.String())) 747 Expect(msg.VrfID).To(BeEquivalentTo(0)) 748 //Expect(msg.Flags).To(BeEquivalentTo(0)) 749 } 750 751 func TestAddNat44EdAddressPoolError(t *testing.T) { 752 ctx, natHandler, _, _ := natTestSetup(t) 753 defer ctx.TeardownTestCtx() 754 755 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 756 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 757 Expect(err).ShouldNot(HaveOccurred()) 758 759 addr := net.ParseIP("10.0.0.1").To4() 760 761 // Incorrect reply object 762 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelIdentityMappingReply{}) 763 err = natHandler.AddNat44AddressPool(0, addr.String(), "", false) 764 765 Expect(err).Should(HaveOccurred()) 766 } 767 768 func TestAddNat44EiAddressPoolError(t *testing.T) { 769 ctx, natHandler, _, _ := natTestSetup(t) 770 defer ctx.TeardownTestCtx() 771 772 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 773 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 774 Expect(err).ShouldNot(HaveOccurred()) 775 776 addr := net.ParseIP("10.0.0.1").To4() 777 778 // Incorrect reply object 779 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelIdentityMappingReply{}) 780 err = natHandler.AddNat44AddressPool(0, addr.String(), "", false) 781 782 Expect(err).Should(HaveOccurred()) 783 } 784 785 func TestAddNat44EdAddressPoolRetval(t *testing.T) { 786 ctx, natHandler, _, _ := natTestSetup(t) 787 defer ctx.TeardownTestCtx() 788 789 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 790 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 791 Expect(err).ShouldNot(HaveOccurred()) 792 793 addr := net.ParseIP("10.0.0.1").To4() 794 795 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelAddressRangeReply{ 796 Retval: 1, 797 }) 798 err = natHandler.AddNat44AddressPool(0, addr.String(), "", false) 799 800 Expect(err).Should(HaveOccurred()) 801 } 802 803 func TestAddNat44EiAddressPoolRetval(t *testing.T) { 804 ctx, natHandler, _, _ := natTestSetup(t) 805 defer ctx.TeardownTestCtx() 806 807 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 808 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 809 Expect(err).ShouldNot(HaveOccurred()) 810 811 addr := net.ParseIP("10.0.0.1").To4() 812 813 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelAddressRangeReply{ 814 Retval: 1, 815 }) 816 err = natHandler.AddNat44AddressPool(0, addr.String(), "", false) 817 818 Expect(err).Should(HaveOccurred()) 819 } 820 821 func TestDelNat44EdAddressPool(t *testing.T) { 822 ctx, natHandler, _, _ := natTestSetup(t) 823 defer ctx.TeardownTestCtx() 824 825 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 826 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 827 Expect(err).ShouldNot(HaveOccurred()) 828 829 addr := net.ParseIP("10.0.0.1").To4() 830 831 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelAddressRangeReply{}) 832 err = natHandler.DelNat44AddressPool(0, addr.String(), "", false) 833 834 Expect(err).ShouldNot(HaveOccurred()) 835 836 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelAddressRange) 837 Expect(ok).To(BeTrue()) 838 Expect(msg.IsAdd).To(BeFalse()) 839 Expect(addressTo4IP(msg.FirstIPAddress)).To(BeEquivalentTo(addr.String())) 840 Expect(addressTo4IP(msg.LastIPAddress)).To(BeEquivalentTo(addr.String())) 841 Expect(msg.VrfID).To(BeEquivalentTo(0)) 842 Expect(msg.Flags).To(BeEquivalentTo(0)) 843 } 844 845 func TestDelNat44EiAddressPool(t *testing.T) { 846 ctx, natHandler, _, _ := natTestSetup(t) 847 defer ctx.TeardownTestCtx() 848 849 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 850 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 851 Expect(err).ShouldNot(HaveOccurred()) 852 853 addr := net.ParseIP("10.0.0.1").To4() 854 855 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelAddressRangeReply{}) 856 err = natHandler.DelNat44AddressPool(0, addr.String(), "", false) 857 858 Expect(err).ShouldNot(HaveOccurred()) 859 860 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiAddDelAddressRange) 861 Expect(ok).To(BeTrue()) 862 Expect(msg.IsAdd).To(BeFalse()) 863 Expect(addressTo4IP(msg.FirstIPAddress)).To(BeEquivalentTo(addr.String())) 864 Expect(addressTo4IP(msg.LastIPAddress)).To(BeEquivalentTo(addr.String())) 865 Expect(msg.VrfID).To(BeEquivalentTo(0)) 866 } 867 868 /* DEPRECATED 869 870 func TestSetNat44VirtualReassemblyIPv4(t *testing.T) { 871 ctx, natHandler, _, _ := natTestSetup(t) 872 defer ctx.TeardownTestCtx() 873 874 ctx.MockVpp.MockReply(&vpp_nat_ed.NatSetReassReply{}) 875 err := natHandler.SetVirtualReassemblyIPv4(&nat.VirtualReassembly{ 876 Timeout: 10, 877 MaxFragments: 20, 878 MaxReassemblies: 30, 879 DropFragments: true, 880 }) 881 882 Expect(err).ShouldNot(HaveOccurred()) 883 884 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.NatSetReass) 885 Expect(ok).To(BeTrue()) 886 Expect(msg.Timeout).To(BeEquivalentTo(10)) 887 Expect(msg.MaxFrag).To(BeEquivalentTo(20)) 888 Expect(msg.MaxReass).To(BeEquivalentTo(30)) 889 Expect(msg.DropFrag).To(BeEquivalentTo(1)) 890 } 891 892 func TestSetNat44VirtualReassemblyIPv6(t *testing.T) { 893 ctx, natHandler, _, _ := natTestSetup(t) 894 defer ctx.TeardownTestCtx() 895 896 ctx.MockVpp.MockReply(&vpp_nat_ed.NatSetReassReply{}) 897 err := natHandler.SetVirtualReassemblyIPv6(&nat.VirtualReassembly{ 898 Timeout: 5, 899 MaxFragments: 10, 900 MaxReassemblies: 15, 901 DropFragments: true, 902 }) 903 904 Expect(err).ShouldNot(HaveOccurred()) 905 906 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.NatSetReass) 907 Expect(ok).To(BeTrue()) 908 Expect(msg.Timeout).To(BeEquivalentTo(5)) 909 Expect(msg.MaxFrag).To(BeEquivalentTo(10)) 910 Expect(msg.MaxReass).To(BeEquivalentTo(15)) 911 Expect(msg.DropFrag).To(BeEquivalentTo(1)) 912 }*/ 913 914 func TestAddNat44EdStaticMapping(t *testing.T) { 915 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 916 defer ctx.TeardownTestCtx() 917 918 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 919 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 920 Expect(err).ShouldNot(HaveOccurred()) 921 922 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 923 924 localIP := net.ParseIP("10.0.0.1").To4() 925 externalIP := net.ParseIP("10.0.0.2").To4() 926 927 // DataContext 928 mapping := &nat.DNat44_StaticMapping{ 929 ExternalIp: externalIP.String(), 930 ExternalPort: 8080, 931 ExternalInterface: "if0", // overrides external IP 932 Protocol: nat.DNat44_TCP, 933 TwiceNat: nat.DNat44_StaticMapping_ENABLED, 934 LocalIps: []*nat.DNat44_StaticMapping_LocalIP{ 935 { 936 LocalIp: localIP.String(), 937 VrfId: 1, 938 LocalPort: 24, 939 }, 940 }, 941 } 942 943 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelStaticMappingV2Reply{}) 944 err = natHandler.AddNat44StaticMapping(mapping, "DNAT 1") 945 946 Expect(err).ShouldNot(HaveOccurred()) 947 948 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelStaticMappingV2) 949 Expect(ok).To(BeTrue()) 950 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 951 Expect(msg.VrfID).To(BeEquivalentTo(1)) 952 Expect(msg.IsAdd).To(BeTrue()) 953 Expect(msg.LocalPort).To(BeEquivalentTo(24)) 954 Expect(msg.ExternalPort).To(BeEquivalentTo(8080)) 955 Expect(msg.Protocol).To(BeEquivalentTo(6)) 956 Expect(addressTo4IP(msg.ExternalIPAddress)).To(BeEquivalentTo("0.0.0.0")) 957 Expect(msg.ExternalSwIfIndex).To(BeEquivalentTo(1)) 958 Expect(addressTo4IP(msg.LocalIPAddress)).To(BeEquivalentTo(localIP.String())) 959 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_TWICE_NAT + nat_types.NAT_IS_OUT2IN_ONLY)) 960 } 961 962 func TestAddNat44EiStaticMapping(t *testing.T) { 963 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 964 defer ctx.TeardownTestCtx() 965 966 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 967 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 968 Expect(err).ShouldNot(HaveOccurred()) 969 970 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 971 972 localIP := net.ParseIP("10.0.0.1").To4() 973 externalIP := net.ParseIP("10.0.0.2").To4() 974 975 // DataContext 976 mapping := &nat.DNat44_StaticMapping{ 977 ExternalIp: externalIP.String(), 978 ExternalPort: 8080, 979 ExternalInterface: "if0", // overrides external IP 980 Protocol: nat.DNat44_TCP, 981 //TwiceNat: nat.DNat44_StaticMapping_ENABLED, 982 LocalIps: []*nat.DNat44_StaticMapping_LocalIP{ 983 { 984 LocalIp: localIP.String(), 985 VrfId: 1, 986 LocalPort: 24, 987 }, 988 }, 989 } 990 991 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelStaticMappingReply{}) 992 err = natHandler.AddNat44StaticMapping(mapping, "DNAT 1") 993 994 Expect(err).ShouldNot(HaveOccurred()) 995 996 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiAddDelStaticMapping) 997 Expect(ok).To(BeTrue()) 998 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 999 Expect(msg.VrfID).To(BeEquivalentTo(1)) 1000 Expect(msg.IsAdd).To(BeTrue()) 1001 Expect(msg.LocalPort).To(BeEquivalentTo(24)) 1002 Expect(msg.ExternalPort).To(BeEquivalentTo(8080)) 1003 Expect(msg.Protocol).To(BeEquivalentTo(6)) 1004 Expect(addressTo4IP(msg.ExternalIPAddress)).To(BeEquivalentTo("0.0.0.0")) 1005 Expect(msg.ExternalSwIfIndex).To(BeEquivalentTo(1)) 1006 Expect(addressTo4IP(msg.LocalIPAddress)).To(BeEquivalentTo(localIP.String())) 1007 } 1008 1009 func TestAddNat44EdIdentityMappingWithInterface(t *testing.T) { 1010 ctx, natHandler, _, _ := natTestSetup(t) 1011 defer ctx.TeardownTestCtx() 1012 1013 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1014 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1015 Expect(err).ShouldNot(HaveOccurred()) 1016 1017 localIP := net.ParseIP("10.0.0.1").To4() 1018 externalIP := net.ParseIP("10.0.0.2").To4() 1019 1020 // DataContext 1021 mapping := &nat.DNat44_StaticMapping{ 1022 ExternalIp: externalIP.String(), 1023 Protocol: nat.DNat44_TCP, 1024 LocalIps: []*nat.DNat44_StaticMapping_LocalIP{ 1025 { 1026 LocalIp: localIP.String(), 1027 }, 1028 }, 1029 } 1030 1031 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelStaticMappingV2Reply{}) 1032 err = natHandler.AddNat44StaticMapping(mapping, "DNAT 1") 1033 1034 Expect(err).ShouldNot(HaveOccurred()) 1035 1036 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelStaticMappingV2) 1037 Expect(ok).To(BeTrue()) 1038 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 1039 Expect(msg.IsAdd).To(BeTrue()) 1040 Expect(addressTo4IP(msg.ExternalIPAddress)).To(BeEquivalentTo(externalIP.String())) 1041 Expect(addressTo4IP(msg.LocalIPAddress)).To(BeEquivalentTo(localIP.String())) 1042 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_OUT2IN_ONLY + nat_types.NAT_IS_ADDR_ONLY)) 1043 } 1044 1045 func TestAddNat44EiIdentityMappingWithInterface(t *testing.T) { 1046 ctx, natHandler, _, _ := natTestSetup(t) 1047 defer ctx.TeardownTestCtx() 1048 1049 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 1050 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 1051 Expect(err).ShouldNot(HaveOccurred()) 1052 1053 localIP := net.ParseIP("10.0.0.1").To4() 1054 externalIP := net.ParseIP("10.0.0.2").To4() 1055 1056 // DataContext 1057 mapping := &nat.DNat44_StaticMapping{ 1058 ExternalIp: externalIP.String(), 1059 Protocol: nat.DNat44_TCP, 1060 LocalIps: []*nat.DNat44_StaticMapping_LocalIP{ 1061 { 1062 LocalIp: localIP.String(), 1063 }, 1064 }, 1065 } 1066 1067 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelStaticMappingReply{}) 1068 err = natHandler.AddNat44StaticMapping(mapping, "DNAT 1") 1069 1070 Expect(err).ShouldNot(HaveOccurred()) 1071 1072 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiAddDelStaticMapping) 1073 Expect(ok).To(BeTrue()) 1074 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 1075 Expect(msg.IsAdd).To(BeTrue()) 1076 Expect(addressTo4IP(msg.ExternalIPAddress)).To(BeEquivalentTo(externalIP.String())) 1077 Expect(addressTo4IP(msg.LocalIPAddress)).To(BeEquivalentTo(localIP.String())) 1078 //Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_OUT2IN_ONLY + nat_types.NAT_IS_ADDR_ONLY)) 1079 Expect(msg.Flags).To(BeEquivalentTo(vpp_nat_ei.NAT44_EI_ADDR_ONLY_MAPPING)) 1080 } 1081 1082 func TestAddNat44EdStaticMappingError(t *testing.T) { 1083 ctx, natHandler, _, _ := natTestSetup(t) 1084 defer ctx.TeardownTestCtx() 1085 1086 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1087 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1088 Expect(err).ShouldNot(HaveOccurred()) 1089 1090 // Incorrect reply object 1091 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelLbStaticMappingReply{}) 1092 err = natHandler.AddNat44StaticMapping(&nat.DNat44_StaticMapping{}, "") 1093 1094 Expect(err).Should(HaveOccurred()) 1095 } 1096 1097 func TestAddNat44EiStaticMappingError(t *testing.T) { 1098 ctx, natHandler, _, _ := natTestSetup(t) 1099 defer ctx.TeardownTestCtx() 1100 1101 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 1102 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 1103 Expect(err).ShouldNot(HaveOccurred()) 1104 1105 // Incorrect reply object 1106 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiInterfaceAddDelOutputFeatureReply{}) 1107 err = natHandler.AddNat44StaticMapping(&nat.DNat44_StaticMapping{}, "") 1108 1109 Expect(err).Should(HaveOccurred()) 1110 } 1111 1112 func TestAddNat44EdStaticMappingRetval(t *testing.T) { 1113 ctx, natHandler, _, _ := natTestSetup(t) 1114 defer ctx.TeardownTestCtx() 1115 1116 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1117 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1118 Expect(err).ShouldNot(HaveOccurred()) 1119 1120 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelStaticMappingV2Reply{ 1121 Retval: 1, 1122 }) 1123 err = natHandler.AddNat44StaticMapping(&nat.DNat44_StaticMapping{}, "") 1124 1125 Expect(err).Should(HaveOccurred()) 1126 } 1127 1128 func TestAddNat44EiStaticMappingRetval(t *testing.T) { 1129 ctx, natHandler, _, _ := natTestSetup(t) 1130 defer ctx.TeardownTestCtx() 1131 1132 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 1133 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 1134 Expect(err).ShouldNot(HaveOccurred()) 1135 1136 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelStaticMappingReply{ 1137 Retval: 1, 1138 }) 1139 err = natHandler.AddNat44StaticMapping(&nat.DNat44_StaticMapping{}, "") 1140 1141 Expect(err).Should(HaveOccurred()) 1142 } 1143 1144 func TestDelNat44EdStaticMapping(t *testing.T) { 1145 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 1146 defer ctx.TeardownTestCtx() 1147 1148 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1149 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1150 Expect(err).ShouldNot(HaveOccurred()) 1151 1152 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 1153 1154 localIP := net.ParseIP("10.0.0.1").To4() 1155 externalIP := net.ParseIP("10.0.0.2").To4() 1156 1157 mapping := &nat.DNat44_StaticMapping{ 1158 ExternalIp: externalIP.String(), 1159 ExternalPort: 8080, 1160 ExternalInterface: "if0", // overrides external IP 1161 Protocol: nat.DNat44_TCP, 1162 TwiceNat: nat.DNat44_StaticMapping_ENABLED, 1163 LocalIps: []*nat.DNat44_StaticMapping_LocalIP{ 1164 { 1165 LocalIp: localIP.String(), 1166 VrfId: 1, 1167 LocalPort: 24, 1168 }, 1169 }, 1170 } 1171 1172 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelStaticMappingV2Reply{}) 1173 err = natHandler.DelNat44StaticMapping(mapping, "DNAT 1") 1174 1175 Expect(err).ShouldNot(HaveOccurred()) 1176 1177 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelStaticMappingV2) 1178 Expect(ok).To(BeTrue()) 1179 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 1180 Expect(msg.VrfID).To(BeEquivalentTo(1)) 1181 Expect(msg.IsAdd).To(BeFalse()) 1182 Expect(msg.LocalPort).To(BeEquivalentTo(24)) 1183 Expect(msg.ExternalPort).To(BeEquivalentTo(8080)) 1184 Expect(msg.Protocol).To(BeEquivalentTo(6)) 1185 Expect(addressTo4IP(msg.ExternalIPAddress)).To(BeEquivalentTo("0.0.0.0")) 1186 Expect(msg.ExternalSwIfIndex).To(BeEquivalentTo(1)) 1187 Expect(addressTo4IP(msg.LocalIPAddress)).To(BeEquivalentTo(localIP.String())) 1188 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_TWICE_NAT + nat_types.NAT_IS_OUT2IN_ONLY)) 1189 } 1190 1191 func TestDelNat44EiStaticMapping(t *testing.T) { 1192 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 1193 defer ctx.TeardownTestCtx() 1194 1195 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 1196 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 1197 Expect(err).ShouldNot(HaveOccurred()) 1198 1199 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 1200 1201 localIP := net.ParseIP("10.0.0.1").To4() 1202 externalIP := net.ParseIP("10.0.0.2").To4() 1203 1204 mapping := &nat.DNat44_StaticMapping{ 1205 ExternalIp: externalIP.String(), 1206 ExternalPort: 8080, 1207 ExternalInterface: "if0", // overrides external IP 1208 Protocol: nat.DNat44_TCP, 1209 LocalIps: []*nat.DNat44_StaticMapping_LocalIP{ 1210 { 1211 LocalIp: localIP.String(), 1212 VrfId: 1, 1213 LocalPort: 24, 1214 }, 1215 }, 1216 } 1217 1218 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelStaticMappingReply{}) 1219 err = natHandler.DelNat44StaticMapping(mapping, "DNAT 1") 1220 1221 Expect(err).ShouldNot(HaveOccurred()) 1222 1223 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiAddDelStaticMapping) 1224 Expect(ok).To(BeTrue()) 1225 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 1226 Expect(msg.VrfID).To(BeEquivalentTo(1)) 1227 Expect(msg.IsAdd).To(BeFalse()) 1228 Expect(msg.LocalPort).To(BeEquivalentTo(24)) 1229 Expect(msg.ExternalPort).To(BeEquivalentTo(8080)) 1230 Expect(msg.Protocol).To(BeEquivalentTo(6)) 1231 Expect(addressTo4IP(msg.ExternalIPAddress)).To(BeEquivalentTo("0.0.0.0")) 1232 Expect(msg.ExternalSwIfIndex).To(BeEquivalentTo(1)) 1233 Expect(addressTo4IP(msg.LocalIPAddress)).To(BeEquivalentTo(localIP.String())) 1234 } 1235 func TestDelNat44EdStaticMappingAddrOnly(t *testing.T) { 1236 ctx, natHandler, _, _ := natTestSetup(t) 1237 defer ctx.TeardownTestCtx() 1238 1239 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1240 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1241 Expect(err).ShouldNot(HaveOccurred()) 1242 1243 localIP := net.ParseIP("10.0.0.1").To4() 1244 externalIP := net.ParseIP("10.0.0.2").To4() 1245 1246 mapping := &nat.DNat44_StaticMapping{ 1247 ExternalIp: externalIP.String(), 1248 Protocol: nat.DNat44_TCP, 1249 LocalIps: []*nat.DNat44_StaticMapping_LocalIP{ 1250 { 1251 LocalIp: localIP.String(), 1252 }, 1253 }, 1254 } 1255 1256 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelStaticMappingV2Reply{}) 1257 err = natHandler.DelNat44StaticMapping(mapping, "DNAT 1") 1258 1259 Expect(err).ShouldNot(HaveOccurred()) 1260 1261 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelStaticMappingV2) 1262 Expect(ok).To(BeTrue()) 1263 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 1264 Expect(msg.IsAdd).To(BeFalse()) 1265 Expect(addressTo4IP(msg.ExternalIPAddress)).To(BeEquivalentTo(externalIP.String())) 1266 Expect(addressTo4IP(msg.LocalIPAddress)).To(BeEquivalentTo(localIP.String())) 1267 } 1268 1269 func TestDelNat44EiStaticMappingAddrOnly(t *testing.T) { 1270 ctx, natHandler, _, _ := natTestSetup(t) 1271 defer ctx.TeardownTestCtx() 1272 1273 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 1274 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 1275 Expect(err).ShouldNot(HaveOccurred()) 1276 1277 localIP := net.ParseIP("10.0.0.1").To4() 1278 externalIP := net.ParseIP("10.0.0.2").To4() 1279 1280 mapping := &nat.DNat44_StaticMapping{ 1281 ExternalIp: externalIP.String(), 1282 Protocol: nat.DNat44_TCP, 1283 LocalIps: []*nat.DNat44_StaticMapping_LocalIP{ 1284 { 1285 LocalIp: localIP.String(), 1286 }, 1287 }, 1288 } 1289 1290 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelStaticMappingReply{}) 1291 err = natHandler.DelNat44StaticMapping(mapping, "DNAT 1") 1292 1293 Expect(err).ShouldNot(HaveOccurred()) 1294 1295 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiAddDelStaticMapping) 1296 Expect(ok).To(BeTrue()) 1297 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 1298 Expect(msg.IsAdd).To(BeFalse()) 1299 Expect(addressTo4IP(msg.ExternalIPAddress)).To(BeEquivalentTo(externalIP.String())) 1300 Expect(addressTo4IP(msg.LocalIPAddress)).To(BeEquivalentTo(localIP.String())) 1301 } 1302 1303 func TestAddNat44EdStaticMappingLb(t *testing.T) { 1304 ctx, natHandler, _, _ := natTestSetup(t) 1305 defer ctx.TeardownTestCtx() 1306 1307 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1308 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1309 Expect(err).ShouldNot(HaveOccurred()) 1310 1311 externalIP := net.ParseIP("10.0.0.1").To4() 1312 localIP1 := net.ParseIP("10.0.0.2").To4() 1313 localIP2 := net.ParseIP("10.0.0.3").To4() 1314 1315 mapping := &nat.DNat44_StaticMapping{ 1316 ExternalIp: externalIP.String(), 1317 ExternalPort: 8080, 1318 ExternalInterface: "if0", 1319 Protocol: nat.DNat44_TCP, 1320 TwiceNat: nat.DNat44_StaticMapping_ENABLED, 1321 LocalIps: localIPs(localIP1, localIP2), 1322 } 1323 1324 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelLbStaticMappingReply{}) 1325 err = natHandler.AddNat44StaticMapping(mapping, "DNAT 1") 1326 1327 Expect(err).ShouldNot(HaveOccurred()) 1328 1329 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelLbStaticMapping) 1330 Expect(ok).To(BeTrue()) 1331 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 1332 Expect(msg.IsAdd).To(BeTrue()) 1333 Expect(addressTo4IP(msg.ExternalAddr)).To(BeEquivalentTo(externalIP.String())) 1334 Expect(msg.ExternalPort).To(BeEquivalentTo(8080)) 1335 Expect(msg.Protocol).To(BeEquivalentTo(6)) 1336 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_TWICE_NAT + nat_types.NAT_IS_OUT2IN_ONLY)) 1337 1338 // Local IPs 1339 Expect(msg.Locals).To(HaveLen(2)) 1340 expectedCount := 0 1341 for _, local := range msg.Locals { 1342 localAddr := make(net.IP, net.IPv4len) 1343 copy(localAddr, local.Addr[:]) 1344 if bytes.Equal(localAddr, localIP1) && local.Port == 8080 && local.Probability == 35 { 1345 expectedCount++ 1346 } 1347 copy(localAddr, local.Addr[:]) 1348 if bytes.Equal(localAddr, localIP2) && local.Port == 8181 && local.Probability == 65 { 1349 expectedCount++ 1350 } 1351 } 1352 Expect(expectedCount).To(BeEquivalentTo(2)) 1353 } 1354 1355 func TestDelNat44EdStaticMappingLb(t *testing.T) { 1356 ctx, natHandler, _, _ := natTestSetup(t) 1357 defer ctx.TeardownTestCtx() 1358 1359 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1360 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1361 Expect(err).ShouldNot(HaveOccurred()) 1362 1363 externalIP := net.ParseIP("10.0.0.1").To4() 1364 localIP1 := net.ParseIP("10.0.0.2").To4() 1365 localIP2 := net.ParseIP("10.0.0.3").To4() 1366 1367 mapping := &nat.DNat44_StaticMapping{ 1368 ExternalIp: externalIP.String(), 1369 ExternalPort: 8080, 1370 ExternalInterface: "if0", 1371 Protocol: nat.DNat44_TCP, 1372 TwiceNat: nat.DNat44_StaticMapping_ENABLED, 1373 LocalIps: localIPs(localIP1, localIP2), 1374 } 1375 1376 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelLbStaticMappingReply{}) 1377 err = natHandler.DelNat44StaticMapping(mapping, "DNAT 1") 1378 1379 Expect(err).ShouldNot(HaveOccurred()) 1380 1381 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelLbStaticMapping) 1382 Expect(ok).To(BeTrue()) 1383 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 1384 Expect(msg.IsAdd).To(BeFalse()) 1385 Expect(addressTo4IP(msg.ExternalAddr)).To(BeEquivalentTo(externalIP.String())) 1386 Expect(msg.ExternalPort).To(BeEquivalentTo(8080)) 1387 Expect(msg.Protocol).To(BeEquivalentTo(6)) 1388 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_TWICE_NAT + nat_types.NAT_IS_OUT2IN_ONLY)) 1389 1390 // Local IPs 1391 Expect(msg.Locals).To(HaveLen(2)) 1392 expectedCount := 0 1393 for _, local := range msg.Locals { 1394 localAddr := make(net.IP, net.IPv4len) 1395 copy(localAddr, local.Addr[:]) 1396 if bytes.Equal(localAddr, localIP1) && local.Port == 8080 && local.Probability == 35 { 1397 expectedCount++ 1398 } 1399 copy(localAddr, local.Addr[:]) 1400 if bytes.Equal(localAddr, localIP2) && local.Port == 8181 && local.Probability == 65 { 1401 expectedCount++ 1402 } 1403 } 1404 Expect(expectedCount).To(BeEquivalentTo(2)) 1405 } 1406 1407 func TestAddNat44EdIdentityMapping(t *testing.T) { 1408 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 1409 defer ctx.TeardownTestCtx() 1410 1411 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1412 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1413 Expect(err).ShouldNot(HaveOccurred()) 1414 1415 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 1416 1417 address := net.ParseIP("10.0.0.1").To4() 1418 1419 mapping := &nat.DNat44_IdentityMapping{ 1420 VrfId: 1, 1421 Interface: "if0", // overrides IP address 1422 IpAddress: address.String(), 1423 Port: 9000, 1424 Protocol: nat.DNat44_UDP, 1425 } 1426 1427 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelIdentityMappingReply{}) 1428 err = natHandler.AddNat44IdentityMapping(mapping, "DNAT 1") 1429 1430 Expect(err).ShouldNot(HaveOccurred()) 1431 1432 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelIdentityMapping) 1433 Expect(ok).To(BeTrue()) 1434 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 1435 Expect(msg.VrfID).To(BeEquivalentTo(1)) 1436 Expect(addressTo4IP(msg.IPAddress)).To(BeEquivalentTo("0.0.0.0")) 1437 Expect(msg.IsAdd).To(BeTrue()) 1438 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 1439 Expect(msg.Protocol).To(BeEquivalentTo(17)) 1440 Expect(msg.Port).To(BeEquivalentTo(9000)) 1441 Expect(msg.Flags).To(BeEquivalentTo(0)) 1442 } 1443 1444 func TestAddNat44EiIdentityMapping(t *testing.T) { 1445 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 1446 defer ctx.TeardownTestCtx() 1447 1448 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 1449 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 1450 Expect(err).ShouldNot(HaveOccurred()) 1451 1452 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 1453 1454 address := net.ParseIP("10.0.0.1").To4() 1455 1456 mapping := &nat.DNat44_IdentityMapping{ 1457 VrfId: 1, 1458 Interface: "if0", // overrides IP address 1459 IpAddress: address.String(), 1460 Port: 9000, 1461 Protocol: nat.DNat44_UDP, 1462 } 1463 1464 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelIdentityMappingReply{}) 1465 err = natHandler.AddNat44IdentityMapping(mapping, "DNAT 1") 1466 1467 Expect(err).ShouldNot(HaveOccurred()) 1468 1469 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiAddDelIdentityMapping) 1470 Expect(ok).To(BeTrue()) 1471 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 1472 Expect(msg.VrfID).To(BeEquivalentTo(1)) 1473 Expect(addressTo4IP(msg.IPAddress)).To(BeEquivalentTo("0.0.0.0")) 1474 Expect(msg.IsAdd).To(BeTrue()) 1475 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 1476 Expect(msg.Protocol).To(BeEquivalentTo(17)) 1477 Expect(msg.Port).To(BeEquivalentTo(9000)) 1478 Expect(msg.Flags).To(BeEquivalentTo(0)) 1479 } 1480 func TestAddNat44EdIdentityMappingAddrOnly(t *testing.T) { 1481 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 1482 defer ctx.TeardownTestCtx() 1483 1484 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1485 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1486 Expect(err).ShouldNot(HaveOccurred()) 1487 1488 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 1489 1490 // IPAddress == nil and Port == 0 means it's address only 1491 mapping := &nat.DNat44_IdentityMapping{ 1492 VrfId: 1, 1493 Interface: "if0", // overrides IP address 1494 Protocol: nat.DNat44_UDP, 1495 } 1496 1497 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelIdentityMappingReply{}) 1498 err = natHandler.AddNat44IdentityMapping(mapping, "DNAT 1") 1499 1500 Expect(err).ShouldNot(HaveOccurred()) 1501 1502 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelIdentityMapping) 1503 Expect(ok).To(BeTrue()) 1504 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 1505 Expect(addressTo4IP(msg.IPAddress)).To(BeEquivalentTo("0.0.0.0")) 1506 Expect(msg.IsAdd).To(BeTrue()) 1507 Expect(msg.Protocol).To(BeEquivalentTo(17)) 1508 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 1509 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_ADDR_ONLY)) 1510 } 1511 1512 func TestAddNat44EiIdentityMappingAddrOnly(t *testing.T) { 1513 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 1514 defer ctx.TeardownTestCtx() 1515 1516 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 1517 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 1518 Expect(err).ShouldNot(HaveOccurred()) 1519 1520 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 1521 1522 // IPAddress == nil and Port == 0 means it's address only 1523 mapping := &nat.DNat44_IdentityMapping{ 1524 VrfId: 1, 1525 Interface: "if0", // overrides IP address 1526 Protocol: nat.DNat44_UDP, 1527 } 1528 1529 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelIdentityMappingReply{}) 1530 err = natHandler.AddNat44IdentityMapping(mapping, "DNAT 1") 1531 1532 Expect(err).ShouldNot(HaveOccurred()) 1533 1534 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiAddDelIdentityMapping) 1535 Expect(ok).To(BeTrue()) 1536 Expect(msg.Tag).To(BeEquivalentTo("DNAT 1")) 1537 Expect(addressTo4IP(msg.IPAddress)).To(BeEquivalentTo("0.0.0.0")) 1538 Expect(msg.IsAdd).To(BeTrue()) 1539 Expect(msg.Protocol).To(BeEquivalentTo(17)) 1540 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 1541 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_ADDR_ONLY)) 1542 } 1543 1544 func TestAddNat44EdIdentityMappingNoInterface(t *testing.T) { 1545 ctx, natHandler, _, _ := natTestSetup(t) 1546 defer ctx.TeardownTestCtx() 1547 1548 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1549 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1550 Expect(err).ShouldNot(HaveOccurred()) 1551 1552 address := net.ParseIP("10.0.0.1").To4() 1553 1554 mapping := &nat.DNat44_IdentityMapping{ 1555 VrfId: 1, 1556 Protocol: nat.DNat44_UDP, 1557 IpAddress: address.String(), 1558 Port: 8989, 1559 } 1560 1561 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelIdentityMappingReply{}) 1562 err = natHandler.AddNat44IdentityMapping(mapping, "DNAT 2") 1563 1564 Expect(err).ShouldNot(HaveOccurred()) 1565 1566 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelIdentityMapping) 1567 Expect(ok).To(BeTrue()) 1568 Expect(msg.Tag).To(BeEquivalentTo("DNAT 2")) 1569 Expect(addressTo4IP(msg.IPAddress)).To(BeEquivalentTo(address.String())) 1570 Expect(msg.Port).To(BeEquivalentTo(8989)) 1571 Expect(msg.SwIfIndex).To(BeEquivalentTo(vpp2106.NoInterface)) 1572 Expect(msg.Flags).To(BeEquivalentTo(0)) 1573 } 1574 1575 func TestAddNat44EiIdentityMappingNoInterface(t *testing.T) { 1576 ctx, natHandler, _, _ := natTestSetup(t) 1577 defer ctx.TeardownTestCtx() 1578 1579 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 1580 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 1581 Expect(err).ShouldNot(HaveOccurred()) 1582 1583 address := net.ParseIP("10.0.0.1").To4() 1584 1585 mapping := &nat.DNat44_IdentityMapping{ 1586 VrfId: 1, 1587 Protocol: nat.DNat44_UDP, 1588 IpAddress: address.String(), 1589 Port: 8989, 1590 } 1591 1592 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelIdentityMappingReply{}) 1593 err = natHandler.AddNat44IdentityMapping(mapping, "DNAT 2") 1594 1595 Expect(err).ShouldNot(HaveOccurred()) 1596 1597 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiAddDelIdentityMapping) 1598 Expect(ok).To(BeTrue()) 1599 Expect(msg.Tag).To(BeEquivalentTo("DNAT 2")) 1600 Expect(addressTo4IP(msg.IPAddress)).To(BeEquivalentTo(address.String())) 1601 Expect(msg.Port).To(BeEquivalentTo(8989)) 1602 Expect(msg.SwIfIndex).To(BeEquivalentTo(vpp2106.NoInterface)) 1603 Expect(msg.Flags).To(BeEquivalentTo(0)) 1604 } 1605 1606 func TestAddNat44EdIdentityMappingError(t *testing.T) { 1607 ctx, natHandler, _, _ := natTestSetup(t) 1608 defer ctx.TeardownTestCtx() 1609 1610 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1611 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1612 Expect(err).ShouldNot(HaveOccurred()) 1613 1614 // Incorrect reply object 1615 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelStaticMappingV2Reply{}) 1616 err = natHandler.AddNat44IdentityMapping(&nat.DNat44_IdentityMapping{}, "") 1617 1618 Expect(err).Should(HaveOccurred()) 1619 } 1620 1621 func TestAddNat44EiIdentityMappingError(t *testing.T) { 1622 ctx, natHandler, _, _ := natTestSetup(t) 1623 defer ctx.TeardownTestCtx() 1624 1625 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 1626 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 1627 Expect(err).ShouldNot(HaveOccurred()) 1628 1629 // Incorrect reply object 1630 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelStaticMappingReply{}) 1631 err = natHandler.AddNat44IdentityMapping(&nat.DNat44_IdentityMapping{}, "") 1632 1633 Expect(err).Should(HaveOccurred()) 1634 } 1635 1636 func TestAddNat44EdIdentityMappingRetval(t *testing.T) { 1637 ctx, natHandler, _, _ := natTestSetup(t) 1638 defer ctx.TeardownTestCtx() 1639 1640 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1641 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1642 Expect(err).ShouldNot(HaveOccurred()) 1643 1644 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelIdentityMappingReply{ 1645 Retval: 1, 1646 }) 1647 err = natHandler.AddNat44IdentityMapping(&nat.DNat44_IdentityMapping{}, "") 1648 1649 Expect(err).Should(HaveOccurred()) 1650 } 1651 1652 func TestAddNat44IdentityMappingRetval(t *testing.T) { 1653 ctx, natHandler, _, _ := natTestSetup(t) 1654 defer ctx.TeardownTestCtx() 1655 1656 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 1657 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 1658 Expect(err).ShouldNot(HaveOccurred()) 1659 1660 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelIdentityMappingReply{ 1661 Retval: 1, 1662 }) 1663 err = natHandler.AddNat44IdentityMapping(&nat.DNat44_IdentityMapping{}, "") 1664 1665 Expect(err).Should(HaveOccurred()) 1666 } 1667 1668 func TestDelNat44EdIdentityMapping(t *testing.T) { 1669 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 1670 defer ctx.TeardownTestCtx() 1671 1672 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1673 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1674 Expect(err).ShouldNot(HaveOccurred()) 1675 1676 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 1677 1678 address := net.ParseIP("10.0.0.1").To4() 1679 1680 mapping := &nat.DNat44_IdentityMapping{ 1681 Interface: "if0", 1682 IpAddress: address.String(), 1683 Protocol: nat.DNat44_TCP, 1684 VrfId: 1, 1685 } 1686 1687 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelIdentityMappingReply{}) 1688 err = natHandler.DelNat44IdentityMapping(mapping, "DNAT 2") 1689 1690 Expect(err).ShouldNot(HaveOccurred()) 1691 1692 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ed.Nat44AddDelIdentityMapping) 1693 Expect(ok).To(BeTrue()) 1694 Expect(msg.Tag).To(BeEquivalentTo("DNAT 2")) 1695 Expect(msg.VrfID).To(BeEquivalentTo(1)) 1696 Expect(addressTo4IP(msg.IPAddress)).To(BeEquivalentTo("0.0.0.0")) 1697 Expect(msg.IsAdd).To(BeFalse()) 1698 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 1699 Expect(msg.Protocol).To(BeEquivalentTo(6)) 1700 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_ADDR_ONLY)) 1701 } 1702 1703 func TestDelNat44EiIdentityMapping(t *testing.T) { 1704 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 1705 defer ctx.TeardownTestCtx() 1706 1707 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 1708 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 1709 Expect(err).ShouldNot(HaveOccurred()) 1710 1711 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 1712 1713 address := net.ParseIP("10.0.0.1").To4() 1714 1715 mapping := &nat.DNat44_IdentityMapping{ 1716 Interface: "if0", 1717 IpAddress: address.String(), 1718 Protocol: nat.DNat44_TCP, 1719 VrfId: 1, 1720 } 1721 1722 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelIdentityMappingReply{}) 1723 err = natHandler.DelNat44IdentityMapping(mapping, "DNAT 2") 1724 1725 Expect(err).ShouldNot(HaveOccurred()) 1726 1727 msg, ok := ctx.MockChannel.Msg.(*vpp_nat_ei.Nat44EiAddDelIdentityMapping) 1728 Expect(ok).To(BeTrue()) 1729 Expect(msg.Tag).To(BeEquivalentTo("DNAT 2")) 1730 Expect(msg.VrfID).To(BeEquivalentTo(1)) 1731 Expect(addressTo4IP(msg.IPAddress)).To(BeEquivalentTo("0.0.0.0")) 1732 Expect(msg.IsAdd).To(BeFalse()) 1733 Expect(msg.SwIfIndex).To(BeEquivalentTo(1)) 1734 Expect(msg.Protocol).To(BeEquivalentTo(6)) 1735 Expect(msg.Flags).To(BeEquivalentTo(nat_types.NAT_IS_ADDR_ONLY)) 1736 } 1737 1738 func TestNat44EdMappingLongTag(t *testing.T) { 1739 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 1740 defer ctx.TeardownTestCtx() 1741 1742 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44EdPluginEnableDisableReply{}) 1743 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: true}) 1744 Expect(err).ShouldNot(HaveOccurred()) 1745 1746 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 1747 1748 normalTag := "normalTag" 1749 longTag := "some-weird-tag-which-is-much-longer-than-allowed-sixty-four-bytes" 1750 1751 localIP1 := net.ParseIP("10.0.0.1").To4() 1752 localIP2 := net.ParseIP("20.0.0.1").To4() 1753 externalIP := net.ParseIP("10.0.0.2").To4() 1754 1755 mapping := &nat.DNat44_StaticMapping{ 1756 LocalIps: []*nat.DNat44_StaticMapping_LocalIP{ 1757 { 1758 LocalIp: localIP1.String(), 1759 }, 1760 }, 1761 ExternalIp: externalIP.String(), 1762 } 1763 lbMapping := &nat.DNat44_StaticMapping{ 1764 LocalIps: localIPs(localIP1, localIP2), 1765 ExternalIp: externalIP.String(), 1766 ExternalPort: 8080, 1767 Protocol: nat.DNat44_TCP, 1768 TwiceNat: nat.DNat44_StaticMapping_ENABLED, 1769 } 1770 idMapping := &nat.DNat44_IdentityMapping{ 1771 IpAddress: localIP1.String(), 1772 Protocol: nat.DNat44_UDP, 1773 VrfId: 1, 1774 Interface: "if0", 1775 } 1776 1777 // 1. test 1778 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelStaticMappingV2Reply{}) 1779 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelLbStaticMappingReply{}) 1780 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelIdentityMappingReply{}) 1781 // 2. test 1782 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelStaticMappingV2Reply{}) 1783 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelLbStaticMappingReply{}) 1784 ctx.MockVpp.MockReply(&vpp_nat_ed.Nat44AddDelIdentityMappingReply{}) 1785 1786 // Successful scenario (to ensure there is no other error) 1787 err = natHandler.AddNat44StaticMapping(mapping, normalTag) 1788 Expect(err).To(BeNil()) 1789 err = natHandler.AddNat44StaticMapping(lbMapping, normalTag) 1790 Expect(err).To(BeNil()) 1791 err = natHandler.AddNat44IdentityMapping(idMapping, normalTag) 1792 Expect(err).To(BeNil()) 1793 1794 // Replace tags and test again 1795 err = natHandler.AddNat44StaticMapping(mapping, longTag) 1796 Expect(err).ToNot(BeNil()) 1797 err = natHandler.AddNat44StaticMapping(lbMapping, longTag) 1798 Expect(err).ToNot(BeNil()) 1799 err = natHandler.AddNat44IdentityMapping(idMapping, longTag) 1800 Expect(err).ToNot(BeNil()) 1801 } 1802 1803 func TestNat44EiMappingLongTag(t *testing.T) { 1804 ctx, natHandler, swIfIndexes, _ := natTestSetup(t) 1805 defer ctx.TeardownTestCtx() 1806 1807 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiPluginEnableDisableReply{}) 1808 err := natHandler.EnableNAT44Plugin(vppcalls.Nat44InitOpts{EndpointDependent: false}) 1809 Expect(err).ShouldNot(HaveOccurred()) 1810 1811 swIfIndexes.Put("if0", &ifaceidx.IfaceMetadata{SwIfIndex: 1}) 1812 1813 normalTag := "normalTag" 1814 longTag := "some-weird-tag-which-is-much-longer-than-allowed-sixty-four-bytes" 1815 1816 localIP1 := net.ParseIP("10.0.0.1").To4() 1817 externalIP := net.ParseIP("10.0.0.2").To4() 1818 1819 mapping := &nat.DNat44_StaticMapping{ 1820 LocalIps: []*nat.DNat44_StaticMapping_LocalIP{ 1821 { 1822 LocalIp: localIP1.String(), 1823 }, 1824 }, 1825 ExternalIp: externalIP.String(), 1826 } 1827 idMapping := &nat.DNat44_IdentityMapping{ 1828 IpAddress: localIP1.String(), 1829 Protocol: nat.DNat44_UDP, 1830 VrfId: 1, 1831 Interface: "if0", 1832 } 1833 1834 // 1. test 1835 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelStaticMappingReply{}) 1836 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelIdentityMappingReply{}) 1837 // 2. test 1838 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelStaticMappingReply{}) 1839 ctx.MockVpp.MockReply(&vpp_nat_ei.Nat44EiAddDelIdentityMappingReply{}) 1840 1841 // Successful scenario (to ensure there is no other error) 1842 err = natHandler.AddNat44StaticMapping(mapping, normalTag) 1843 Expect(err).To(BeNil()) 1844 err = natHandler.AddNat44IdentityMapping(idMapping, normalTag) 1845 Expect(err).To(BeNil()) 1846 1847 // Replace tags and test again 1848 err = natHandler.AddNat44StaticMapping(mapping, longTag) 1849 Expect(err).ToNot(BeNil()) 1850 err = natHandler.AddNat44IdentityMapping(idMapping, longTag) 1851 Expect(err).ToNot(BeNil()) 1852 } 1853 1854 func localIPs(addr1, addr2 net.IP) []*nat.DNat44_StaticMapping_LocalIP { 1855 return []*nat.DNat44_StaticMapping_LocalIP{ 1856 { 1857 LocalIp: addr1.String(), 1858 LocalPort: 8080, 1859 Probability: 35, 1860 }, 1861 { 1862 LocalIp: addr2.String(), 1863 LocalPort: 8181, 1864 Probability: 65, 1865 }, 1866 } 1867 } 1868 1869 func addressTo4IP(address ip_types.IP4Address) string { 1870 ipAddr := make(net.IP, net.IPv4len) 1871 copy(ipAddr[:], address[:]) 1872 if ipAddr.To4() == nil { 1873 return "" 1874 } 1875 return ipAddr.To4().String() 1876 }