README
¶
L2 Plugin
The l2plugin
is a Core Agent Plugin designed to configure Bridge Domains and L2 FIB in the VPP.
Configuration managed by this plugin is modelled by l2 proto file. The
configuration must be stored in etcd using following keys:
/vnf-agent/<agent-label>/vpp/config/v1/bd/<bridge-domain-name>
/vnf-agent/<agent-label>/vpp/config/v1/bd/<bridge-domain-name>/fib/<mac-address>
/vnf-agent/<agent-label>/vpp/config/v1/xconnect/<rx-interface-name>
JSON configuration example with vpp-agent-ctl
An example of basic bridge domain configuration in JSON format can be found here. A bit more advanced example which includes ARP termination entries can be found here. Example of FIB tables is available here
To insert config into etcd in JSON format vpp-agent-ctl can be used.
Let's assume that we want to configure vpp with the label vpp1
and config for bridge domain bd1
is stored
in the bridge-domain.json
file. Furthermore, we assume that the bridge domain bd1
contains tap interface tap1
with configuration stored in tap.json
. To convey this configuration to the agent through northbound API,
you would execute:
vpp-agent-ctl -put "/vnf-agent/vpp1/vpp/config/v1/interface/tap1" tap.json
vpp-agent-ctl -put "/vnf-agent/vpp1/vpp/config/v1/bd/bd1" bridge-domain.json
Agent operating with the microservice label vpp1
will then create bridge domain,
assign every interface which belongs to it (tap1
in the example above), and set BVI (if there is such an interface).
If one or more ARP entries are available, all of them are written to ARP Termination table.
Every L2 FIB entry is configured for specific bridge domain and interface, both of them have to be configured (in any order) to be written to FIB table.
Inbuilt configuration example with vpp-agent-ctl
The vpp-agent-ctl
binary also ships with some simple predefined bridge domain configurations.
It is meant to be used solely for testing purposes.
First create a new tap interface tap1
:
vpp-agent-ctl /opt/vpp-agent/dev/etcd.conf -ct
To configure a new bridge domain bd1
containing the previously created tap interface tap1
, use:
vpp-agent-ctl /opt/vpp-agent/dev/etcd.conf -cbd
Alternatively, the bridge domain bd1
can be created to include few ARP termination entries with:
vpp-agent-ctl /opt/vpp-agent/dev/etcd.conf -aat
To create a new tap interface tap2
and to L2-xConnect it with tap1
, use:
vpp-agent-ctl /opt/vpp-agent/dev/etcd.conf -cxc
To create L2 FIB table, run:
vpp-agent-ctl /opt/vpp-agent/dev/etcd.conf -aft
Documentation
¶
Overview ¶
Package l2plugin implements the L2 plugin that handles Bridge Domains and L2 FIBs.
Index ¶
- type BDConfigurator
- func (plugin *BDConfigurator) Close() error
- func (plugin *BDConfigurator) ConfigureBridgeDomain(bridgeDomainInput *l2.BridgeDomains_BridgeDomain) error
- func (plugin *BDConfigurator) DeleteBridgeDomain(bridgeDomain *l2.BridgeDomains_BridgeDomain) error
- func (plugin *BDConfigurator) Init(notificationChannel chan BridgeDomainStateMessage) (err error)
- func (plugin *BDConfigurator) LookupBridgeDomainDetails(bdID uint32, bdName string) error
- func (plugin *BDConfigurator) ModifyBridgeDomain(newConfig *l2.BridgeDomains_BridgeDomain, ...) error
- func (plugin *BDConfigurator) ResolveCreatedInterface(interfaceName string, interfaceIndex uint32) error
- func (plugin *BDConfigurator) ResolveDeletedInterface(interfaceName string)
- func (plugin *BDConfigurator) Resync(nbBDs []*l2.BridgeDomains_BridgeDomain) error
- type BridgeDomainMeta
- type BridgeDomainStateMessage
- type BridgeDomainStateNotification
- type BridgeDomainStateUpdater
- type FIBConfigurator
- func (plugin *FIBConfigurator) Add(fib *l2.FibTableEntries_FibTableEntry, callback func(error)) error
- func (plugin *FIBConfigurator) Close() error
- func (plugin *FIBConfigurator) Delete(fib *l2.FibTableEntries_FibTableEntry, callback func(error)) error
- func (plugin *FIBConfigurator) Diff(oldFib *l2.FibTableEntries_FibTableEntry, ...) error
- func (plugin *FIBConfigurator) Init() (err error)
- func (plugin *FIBConfigurator) LookupFIBEntries(bridgeDomain uint32) error
- func (plugin *FIBConfigurator) ResolveCreatedBridgeDomain(domainName string, domainID uint32, callback func(error)) error
- func (plugin *FIBConfigurator) ResolveCreatedInterface(interfaceName string, interfaceIndex uint32, callback func(error)) error
- func (plugin *FIBConfigurator) ResolveDeletedBridgeDomain(domainName string, domainID uint32, callback func(error)) error
- func (plugin *FIBConfigurator) ResolveDeletedInterface(interfaceName string, interfaceIndex uint32, callback func(error)) error
- func (plugin *FIBConfigurator) Resync(fibConfig []*l2.FibTableEntries_FibTableEntry) error
- type FIBMeta
- type XConnectConfigurator
- func (plugin *XConnectConfigurator) Close() error
- func (plugin *XConnectConfigurator) ConfigureXConnectPair(xConnectPairInput *l2.XConnectPairs_XConnectPair) error
- func (plugin *XConnectConfigurator) DeleteXConnectPair(xConnectPairInput *l2.XConnectPairs_XConnectPair) error
- func (plugin *XConnectConfigurator) Init() (err error)
- func (plugin *XConnectConfigurator) LookupXConnectPairs() error
- func (plugin *XConnectConfigurator) ModifyXConnectPair(newConfig *l2.XConnectPairs_XConnectPair, ...) error
- func (plugin *XConnectConfigurator) ResolveCreatedInterface(interfaceName string, interfaceIndex uint32) error
- func (plugin *XConnectConfigurator) ResolveDeletedInterface(interfaceName string) error
- func (plugin *XConnectConfigurator) Resync(xcConfig []*l2.XConnectPairs_XConnectPair) error
- type XConnectMeta
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type BDConfigurator ¶
type BDConfigurator struct { GoVppmux govppmux.API BdIndexes bdidx.BDIndexRW // bridge domains IfToBdIndexes idxvpp.NameToIdxRW // interface to bridge domain mapping - desired state. Metadata is boolean flag whether interface is bvi or not //TODO use rather BdIndexes.LookupNameByIfaceName IfToBdRealStateIdx idxvpp.NameToIdxRW // interface to bridge domain mapping - current state. Metadata is boolean flag whether interface is bvi or not BridgeDomainIDSeq uint32 RegisteredIfaceCounter uint32 SwIfIndexes ifaceidx.SwIfIndex // contains filtered or unexported fields }
BDConfigurator runs in the background in its own goroutine where it watches for any changes in the configuration of bridge domains as modelled by the proto file "../model/l2/l2.proto" and stored in ETCD under the key "/vnf-agent/{vnf-agent}/vpp/config/v1bd". Updates received from the northbound API are compared with the VPP run-time configuration and differences are applied through the VPP binary API.
func (*BDConfigurator) ConfigureBridgeDomain ¶
func (plugin *BDConfigurator) ConfigureBridgeDomain(bridgeDomainInput *l2.BridgeDomains_BridgeDomain) error
ConfigureBridgeDomain for newly created bridge domain
func (*BDConfigurator) DeleteBridgeDomain ¶
func (plugin *BDConfigurator) DeleteBridgeDomain(bridgeDomain *l2.BridgeDomains_BridgeDomain) error
DeleteBridgeDomain process the NB config and propagates it to bin api calls
func (*BDConfigurator) Init ¶
func (plugin *BDConfigurator) Init(notificationChannel chan BridgeDomainStateMessage) (err error)
Init members (channels...) and start go routines.
func (*BDConfigurator) LookupBridgeDomainDetails ¶
func (plugin *BDConfigurator) LookupBridgeDomainDetails(bdID uint32, bdName string) error
LookupBridgeDomainDetails looks up all VPP BDs and saves their name-to-index mapping
func (*BDConfigurator) ModifyBridgeDomain ¶
func (plugin *BDConfigurator) ModifyBridgeDomain(newConfig *l2.BridgeDomains_BridgeDomain, oldConfig *l2.BridgeDomains_BridgeDomain) error
ModifyBridgeDomain process the NB config and propagates it to bin api calls
func (*BDConfigurator) ResolveCreatedInterface ¶
func (plugin *BDConfigurator) ResolveCreatedInterface(interfaceName string, interfaceIndex uint32) error
ResolveCreatedInterface looks for bridge domain this interface is assigned to and sets it up
func (*BDConfigurator) ResolveDeletedInterface ¶
func (plugin *BDConfigurator) ResolveDeletedInterface(interfaceName string)
ResolveDeletedInterface does nothing
func (*BDConfigurator) Resync ¶
func (plugin *BDConfigurator) Resync(nbBDs []*l2.BridgeDomains_BridgeDomain) error
Resync writes BDs to the empty VPP
type BridgeDomainMeta ¶
BridgeDomainMeta holds info about interfaces's bridge domain index and BVI
type BridgeDomainStateMessage ¶
BridgeDomainStateMessage is message with bridge domain state + bridge domain name (because state message does not contain it). This state is sent to the bd_state.go to further processing after every change
type BridgeDomainStateNotification ¶
type BridgeDomainStateNotification struct {
State *l2.BridgeDomainState_BridgeDomain
}
BridgeDomainStateNotification contains bridge domain state object with all data published to ETCD
type BridgeDomainStateUpdater ¶
type BridgeDomainStateUpdater struct { GoVppmux govppmux.API // contains filtered or unexported fields }
BridgeDomainStateUpdater holds all data required to handle bridge domain state
func (*BridgeDomainStateUpdater) Init ¶
func (plugin *BridgeDomainStateUpdater) Init(ctx context.Context, bdIndexes bdidx.BDIndex, swIfIndexes ifaceidx.SwIfIndex, notificationChan chan BridgeDomainStateMessage, publishBdState func(notification *BridgeDomainStateNotification)) (err error)
Init bridge domain state updater
type FIBConfigurator ¶
type FIBConfigurator struct { GoVppmux govppmux.API SwIfIndexes ifaceidx.SwIfIndex BdIndexes bdidx.BDIndex IfToBdIndexes idxvpp.NameToIdxRW //TODO use rather BdIndexes.LookupNameByIfaceName FibIndexes idxvpp.NameToIdxRW FibIndexSeq uint32 FibDesIndexes idxvpp.NameToIdxRW // Serves as a cache for FIBs which cannot be configured immediately // contains filtered or unexported fields }
FIBConfigurator runs in the background in its own goroutine where it watches for any changes in the configuration of fib table entries as modelled by the proto file "../model/l2/l2.proto" and stored in ETCD under the key "/vnf-agent/{vnf-agent}/vpp/config/v1/bd/<bd-label>/fib". Updates received from the northbound API are compared with the VPP run-time configuration and differences are applied through the VPP binary API.
func (*FIBConfigurator) Add ¶
func (plugin *FIBConfigurator) Add(fib *l2.FibTableEntries_FibTableEntry, callback func(error)) error
Add configures provided FIB input. Every entry has to contain info about MAC address, interface and bridge domain. If interface or bridge domain is missing, FIB data is cached and recalled if particular entity is registered
func (*FIBConfigurator) Delete ¶
func (plugin *FIBConfigurator) Delete(fib *l2.FibTableEntries_FibTableEntry, callback func(error)) error
Delete removes FIB table entry. To have request successful, both interface and bridge domain indexes have to be available. Request does nothing without this info. If interface (or bridge domain) was removed before, provided FIB data is just unregistered and agent assumes, that VPP removed FIB entry itself
func (*FIBConfigurator) Diff ¶
func (plugin *FIBConfigurator) Diff(oldFib *l2.FibTableEntries_FibTableEntry, newFib *l2.FibTableEntries_FibTableEntry, callback func(error)) error
Diff provides changes for FIB entry. Old fib entry is removed (if possible) and new one is registered if all conditions are fulfilled (interface and bridge domain presence), otherwise new configuration is cached
func (*FIBConfigurator) Init ¶
func (plugin *FIBConfigurator) Init() (err error)
Init goroutines, mappings, channels, ...
func (*FIBConfigurator) LookupFIBEntries ¶
func (plugin *FIBConfigurator) LookupFIBEntries(bridgeDomain uint32) error
LookupFIBEntries iterates over all FIBs belonging to provided bridge domain ID and registers any missing configuration for them
func (*FIBConfigurator) ResolveCreatedBridgeDomain ¶
func (plugin *FIBConfigurator) ResolveCreatedBridgeDomain(domainName string, domainID uint32, callback func(error)) error
ResolveCreatedBridgeDomain uses FIB cache to additionally configure any FIB entries for this bridge domain. Required interface is checked for existence. If resolution is successful, new FIB entry is configured, registered and removed from cache
func (*FIBConfigurator) ResolveCreatedInterface ¶
func (plugin *FIBConfigurator) ResolveCreatedInterface(interfaceName string, interfaceIndex uint32, callback func(error)) error
ResolveCreatedInterface uses FIB cache to additionally configure any FIB entries for this interface. Bridge domain is checked for existence. If resolution is successful, new FIB entry is configured, registered and removed from cache
func (*FIBConfigurator) ResolveDeletedBridgeDomain ¶
func (plugin *FIBConfigurator) ResolveDeletedBridgeDomain(domainName string, domainID uint32, callback func(error)) error
ResolveDeletedBridgeDomain if BD was deleted. All FIB entries belonging to this bridge domain are removed from configuration and added to FIB cache (from Agent perspective, FIB entry is not removed when bridge domain vanishes)
func (*FIBConfigurator) ResolveDeletedInterface ¶
func (plugin *FIBConfigurator) ResolveDeletedInterface(interfaceName string, interfaceIndex uint32, callback func(error)) error
ResolveDeletedInterface if interface was deleted. All FIB entries belonging to this interface are removed from configuration and added to FIB cache (from Agent perspective, FIB entry is not removed when interface is removed)
func (*FIBConfigurator) Resync ¶
func (plugin *FIBConfigurator) Resync(fibConfig []*l2.FibTableEntries_FibTableEntry) error
Resync writes FIBs to the empty VPP
type XConnectConfigurator ¶
type XConnectConfigurator struct { GoVppmux govppmux.API SwIfIndexes ifaceidx.SwIfIndex XcIndexes idxvpp.NameToIdxRW XcIndexSeq uint32 // contains filtered or unexported fields }
XConnectConfigurator implements PluginHandlerVPP
func (*XConnectConfigurator) Close ¶
func (plugin *XConnectConfigurator) Close() error
Close GOVPP channel
func (*XConnectConfigurator) ConfigureXConnectPair ¶
func (plugin *XConnectConfigurator) ConfigureXConnectPair(xConnectPairInput *l2.XConnectPairs_XConnectPair) error
ConfigureXConnectPair process the NB config and propagates it to bin api calls
func (*XConnectConfigurator) DeleteXConnectPair ¶
func (plugin *XConnectConfigurator) DeleteXConnectPair(xConnectPairInput *l2.XConnectPairs_XConnectPair) error
DeleteXConnectPair process the NB config and propagates it to bin api calls
func (*XConnectConfigurator) Init ¶
func (plugin *XConnectConfigurator) Init() (err error)
Init members (channels...) and start go routines
func (*XConnectConfigurator) LookupXConnectPairs ¶
func (plugin *XConnectConfigurator) LookupXConnectPairs() error
LookupXConnectPairs registers missing l2 xConnect pairs
func (*XConnectConfigurator) ModifyXConnectPair ¶
func (plugin *XConnectConfigurator) ModifyXConnectPair(newConfig *l2.XConnectPairs_XConnectPair, oldConfig *l2.XConnectPairs_XConnectPair) error
ModifyXConnectPair processes the NB config and propagates it to bin api calls
func (*XConnectConfigurator) ResolveCreatedInterface ¶ added in v1.0.3
func (plugin *XConnectConfigurator) ResolveCreatedInterface(interfaceName string, interfaceIndex uint32) error
ResolveCreatedInterface configures xconnect pairs that use the interface as rx or tx and have not been configured yet
func (*XConnectConfigurator) ResolveDeletedInterface ¶ added in v1.0.3
func (plugin *XConnectConfigurator) ResolveDeletedInterface(interfaceName string) error
ResolveDeletedInterface deltes xconnect pairs that have not been deleted yet and use the interface as rx or tx
func (*XConnectConfigurator) Resync ¶
func (plugin *XConnectConfigurator) Resync(xcConfig []*l2.XConnectPairs_XConnectPair) error
Resync writes XCons to the empty VPP
type XConnectMeta ¶
type XConnectMeta struct { TransmitInterface string // contains filtered or unexported fields }
XConnectMeta meta hold info about transmit interface
Source Files
¶
Directories
¶
Path | Synopsis |
---|---|
Package bdidx implements name-to-index mapping registry and cache for bridge-domains.
|
Package bdidx implements name-to-index mapping registry and cache for bridge-domains. |
Package binapi is the parent for packages that define various l2plugin southbound APIs.
|
Package binapi is the parent for packages that define various l2plugin southbound APIs. |
l2
Code generated by govpp binapi-generator DO NOT EDIT.
|
Code generated by govpp binapi-generator DO NOT EDIT. |
vpe
Code generated by govpp binapi-generator DO NOT EDIT.
|
Code generated by govpp binapi-generator DO NOT EDIT. |
Package model defines the l2lugin's northbound API.
|
Package model defines the l2lugin's northbound API. |
l2
Package l2 is a generated protocol buffer package.
|
Package l2 is a generated protocol buffer package. |
Package vppcalls contains wrappers over VPP binary APIs for bridge-domains, L2 FIBs and XConnect pairs.
|
Package vppcalls contains wrappers over VPP binary APIs for bridge-domains, L2 FIBs and XConnect pairs. |
Package vppdump provides helpers to dump all bridge-domains, L2 FIBs and XConnect pairs configured in VPP.
|
Package vppdump provides helpers to dump all bridge-domains, L2 FIBs and XConnect pairs configured in VPP. |