go.ligato.io/vpp-agent/v3@v3.5.0/plugins/vpp/natplugin/natplugin.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  //go:generate descriptor-adapter --descriptor-name NAT44Global --value-type *vpp_nat.Nat44Global --import "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/nat" --output-dir "descriptor"
    16  //go:generate descriptor-adapter --descriptor-name NAT44GlobalInterface --value-type *vpp_nat.Nat44Global_Interface --import "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/nat" --output-dir "descriptor"
    17  //go:generate descriptor-adapter --descriptor-name NAT44GlobalAddress --value-type *vpp_nat.Nat44Global_Address --import "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/nat" --output-dir "descriptor"
    18  //go:generate descriptor-adapter --descriptor-name DNAT44 --value-type *vpp_nat.DNat44 --import "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/nat" --output-dir "descriptor"
    19  //go:generate descriptor-adapter --descriptor-name NAT44Interface --value-type *vpp_nat.Nat44Interface --import "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/nat" --output-dir "descriptor"
    20  //go:generate descriptor-adapter --descriptor-name NAT44AddressPool --value-type *vpp_nat.Nat44AddressPool --import "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/nat" --output-dir "descriptor"
    21  
    22  package natplugin
    23  
    24  import (
    25  	"github.com/pkg/errors"
    26  
    27  	"go.ligato.io/cn-infra/v2/health/statuscheck"
    28  	"go.ligato.io/cn-infra/v2/infra"
    29  
    30  	"go.ligato.io/vpp-agent/v3/plugins/govppmux"
    31  	kvs "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api"
    32  	"go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin"
    33  	"go.ligato.io/vpp-agent/v3/plugins/vpp/natplugin/descriptor"
    34  	"go.ligato.io/vpp-agent/v3/plugins/vpp/natplugin/vppcalls"
    35  
    36  	_ "go.ligato.io/vpp-agent/v3/plugins/vpp/natplugin/vppcalls/vpp2101"
    37  	_ "go.ligato.io/vpp-agent/v3/plugins/vpp/natplugin/vppcalls/vpp2106"
    38  	_ "go.ligato.io/vpp-agent/v3/plugins/vpp/natplugin/vppcalls/vpp2202"
    39  	_ "go.ligato.io/vpp-agent/v3/plugins/vpp/natplugin/vppcalls/vpp2210"
    40  )
    41  
    42  // NATPlugin configures VPP NAT.
    43  type NATPlugin struct {
    44  	Deps
    45  
    46  	// handlers
    47  	natHandler vppcalls.NatVppAPI
    48  }
    49  
    50  // Deps lists dependencies of the NAT plugin.
    51  type Deps struct {
    52  	infra.PluginDeps
    53  	KVScheduler kvs.KVScheduler
    54  	VPP         govppmux.API
    55  	IfPlugin    ifplugin.API
    56  	StatusCheck statuscheck.PluginStatusWriter // optional
    57  }
    58  
    59  // Init registers NAT-related descriptors.
    60  func (p *NATPlugin) Init() (err error) {
    61  	if !p.VPP.IsPluginLoaded("nat") {
    62  		p.Log.Warnf("VPP plugin NAT was disabled by VPP")
    63  		return nil
    64  	}
    65  
    66  	// init handlers
    67  	p.natHandler = vppcalls.CompatibleNatVppHandler(p.VPP, p.IfPlugin.GetInterfaceIndex(), p.IfPlugin.GetDHCPIndex(), p.Log)
    68  	if p.natHandler == nil {
    69  		return errors.New("natHandler is not available")
    70  	}
    71  
    72  	// init and register descriptors
    73  	nat44GlobalCtx, nat44GlobalDescriptor := descriptor.NewNAT44GlobalDescriptor(p.natHandler, p.Log)
    74  	nat44GlobalIfaceDescriptor := descriptor.NewNAT44GlobalInterfaceDescriptor(p.natHandler, p.Log)
    75  	nat44GlobalAddrDescriptor := descriptor.NewNAT44GlobalAddressDescriptor(p.natHandler, p.Log)
    76  	dnat44Descriptor := descriptor.NewDNAT44Descriptor(p.natHandler, p.Log)
    77  	nat44IfaceDescriptor := descriptor.NewNAT44InterfaceDescriptor(nat44GlobalCtx, p.natHandler, p.Log)
    78  	nat44AddrPoolDescriptor := descriptor.NewNAT44AddressPoolDescriptor(nat44GlobalCtx, p.natHandler, p.Log)
    79  
    80  	err = p.KVScheduler.RegisterKVDescriptor(
    81  		nat44GlobalDescriptor,
    82  		nat44GlobalIfaceDescriptor, // deprecated, kept for backward compatibility
    83  		nat44GlobalAddrDescriptor,  // deprecated, kept for backward compatibility
    84  		dnat44Descriptor,
    85  		nat44IfaceDescriptor,
    86  		nat44AddrPoolDescriptor,
    87  	)
    88  	if err != nil {
    89  		return err
    90  	}
    91  
    92  	return nil
    93  }
    94  
    95  // AfterInit registers plugin with StatusCheck.
    96  func (p *NATPlugin) AfterInit() error {
    97  	if p.StatusCheck != nil {
    98  		p.StatusCheck.Register(p.PluginName, nil)
    99  	}
   100  	return nil
   101  }