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 }