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  }*/