go.ligato.io/vpp-agent/v3@v3.5.0/plugins/vpp/ifplugin/descriptor/ip6nd.go (about) 1 // Copyright (c) 2020 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 descriptor 16 17 import ( 18 "context" 19 20 "github.com/go-errors/errors" 21 "go.ligato.io/cn-infra/v2/logging" 22 23 kvs "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" 24 "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/descriptor/adapter" 25 "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/ifaceidx" 26 "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/vppcalls" 27 interfaces "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/interfaces" 28 ) 29 30 const ( 31 // IP6ndDescriptorName is the name of the descriptor. 32 IP6ndDescriptorName = "vpp-ip6nd" 33 ) 34 35 // IP6ndDescriptor instructs KVScheduler how to configure VPP IP6ND entries. 36 type IP6ndDescriptor struct { 37 log logging.Logger 38 handler vppcalls.IP6ndVppAPI 39 scheduler kvs.KVScheduler 40 ifIndex ifaceidx.IfaceMetadataIndex 41 } 42 43 // NewIP6ndDescriptor creates a new instance of the IP6ndDescriptor. 44 func NewIP6ndDescriptor(scheduler kvs.KVScheduler, handler vppcalls.IP6ndVppAPI, 45 ifIndex ifaceidx.IfaceMetadataIndex, log logging.PluginLogger) *kvs.KVDescriptor { 46 47 ctx := &IP6ndDescriptor{ 48 scheduler: scheduler, 49 handler: handler, 50 ifIndex: ifIndex, 51 log: log.NewLogger("ip6nd-descriptor"), 52 } 53 54 typedDescr := &adapter.IP6NDDescriptor{ 55 Name: IP6ndDescriptorName, 56 KeySelector: ctx.IsIP6NDRelatedKey, 57 KeyLabel: ctx.InterfaceNameFromKey, 58 Create: ctx.Create, 59 Delete: ctx.Delete, 60 //Retrieve: ctx.Retrieve, 61 RetrieveDependencies: []string{InterfaceDescriptorName}, 62 } 63 return adapter.NewIP6NDDescriptor(typedDescr) 64 } 65 66 // IsIP6NDRelatedKey returns true if the key is identifying IP6ND config (derived value) 67 func (d *IP6ndDescriptor) IsIP6NDRelatedKey(key string) bool { 68 if _, isValid := interfaces.ParseNameFromIP6NDKey(key); isValid { 69 return true 70 } 71 return false 72 } 73 74 // InterfaceNameFromKey returns interface name from IP6ND-related key. 75 func (d *IP6ndDescriptor) InterfaceNameFromKey(key string) string { 76 if iface, isValid := interfaces.ParseNameFromIP6NDKey(key); isValid { 77 return iface 78 } 79 return key 80 } 81 82 // Create adds a VPP IP6ND entry. 83 func (d *IP6ndDescriptor) Create(key string, entry *interfaces.Interface_IP6ND) (metadata interface{}, err error) { 84 ifName, _ := interfaces.ParseNameFromIP6NDKey(key) 85 ifMeta, found := d.ifIndex.LookupByName(ifName) 86 if !found { 87 err = errors.Errorf("failed to find IP6ND-enabled interface %s", ifName) 88 d.log.Error(err) 89 return nil, err 90 } 91 92 if err := d.handler.SetIP6ndAutoconfig(context.Background(), ifMeta.SwIfIndex, entry.AddressAutoconfig, entry.InstallDefaultRoutes); err != nil { 93 err = errors.Errorf("failed to enable IP6ND for interface %s", ifName) 94 d.log.Error(err) 95 return nil, err 96 } 97 98 return nil, err 99 } 100 101 // Delete removes a VPP IP6ND entry. 102 func (d *IP6ndDescriptor) Delete(key string, entry *interfaces.Interface_IP6ND, metadata interface{}) (err error) { 103 ifName, _ := interfaces.ParseNameFromIP6NDKey(key) 104 ifMeta, found := d.ifIndex.LookupByName(ifName) 105 if !found { 106 err = errors.Errorf("failed to find IP6ND-enabled interface %s", ifName) 107 d.log.Error(err) 108 return err 109 } 110 111 if err := d.handler.SetIP6ndAutoconfig(context.Background(), ifMeta.SwIfIndex, false, false); err != nil { 112 err = errors.Errorf("failed to disable IP6ND for interface %s", ifName) 113 d.log.Error(err) 114 return err 115 } 116 117 return nil 118 } 119 120 // Retrieve returns all IP6ND entries. 121 // TODO: implement retrieve 122 /*func (d *IP6ndDescriptor) Retrieve(correlate []adapter.IP6NDKVWithMetadata) ( 123 retrieved []adapter.IP6NDKVWithMetadata, err error, 124 ) { 125 entries, err := d.handler.DumpIP6ND() 126 if err != nil { 127 return nil, err 128 } 129 for _, entry := range entries { 130 retrieved = append(retrieved, adapter.IP6NDKVWithMetadata{ 131 Key: models.Key(entry), 132 Value: entry, 133 Origin: kvs.UnknownOrigin, 134 }) 135 } 136 return 137 }*/