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  }