Add an optional configuration file

A simple convenience configfile can provide a mapping between VPP
interface names, Linux Control Plane interface names, and descriptions.
An example:

```
interfaces:
  "TenGigabitEthernet6/0/0":
    description: "Infra: xsw0.chrma0:2"
    lcp: "xe1-0"
  "TenGigabitEthernet6/0/0.3102":
    description: "Infra: QinQ to Solnet for Daedalean"
    lcp: "xe1-0.3102"
  "TenGigabitEthernet6/0/0.310211":
    description: "Cust: Daedalean IP Transit"
    lcp: "xe1-0.3102.11"
```

This configuration file is completely optional. If the `-c` flag is
empty, or it's set but the file does not exist, the Agent will simply
enumerate all interfaces, and set the `ifAlias` OID to the same value
as the `ifName`. However, if the config file is read, it will change
the behavior as follows:

*  Any `tapNN` interface names from VPP will be matched to their PHY by
   looking up their Linux Control Plane interface. The `ifName` field
   will be rewritten to the _LIP_ `host-if`. For example, `tap3` above
   will become `xe1-0` while `tap3.310211` will become `xe1-0.3102.11`.
*  The `ifAlias` OID for a PHY will be set to the `description` field.
*  The `ifAlias` OID for a TAP will be set to the string `LCP: `
   followed by its PHY `ifName`. For example, `xe1-0.3102.11` will
    become `LCP TenGigabitEthernet6/0/0.310211 (tap9)`
This commit is contained in:
Pim van Pelt
2022-02-27 22:58:03 +00:00
parent 80190bf2d0
commit c319ef576d
6 changed files with 167 additions and 8 deletions

View File

@ -7,6 +7,7 @@ from vpp_papi import VPPApiClient
import os
import fnmatch
import logging
import socket
class NullHandler(logging.Handler):
@ -81,3 +82,45 @@ class VPPApi():
ret[iface.interface_name] = iface
return ret
def get_lcp(self):
ret = {}
if not self.connected:
return ret
try:
lcp_list = self.vpp.api.lcp_itf_pair_get()
except Exception as e:
logger.error("VPP communication error, disconnecting", e)
self.vpp.disconnect()
self.connected = False
return ret
if not lcp_list or not lcp_list[1]:
logger.error("Can't get LCP list")
return ret
## TODO(pim) - fix upstream, the indexes are in network byte order and
## the message is messed up. This hack allows for both little endian and
## big endian responses, and will be removed once VPP's LinuxCP is updated
## and rolled out to AS8298
for lcp in lcp_list[1]:
if lcp.phy_sw_if_index > 65535 or lcp.host_sw_if_index > 65535 or lcp.vif_index > 65535:
i = {
'phy_sw_if_index': socket.ntohl(lcp.phy_sw_if_index),
'host_sw_if_index': socket.ntohl(lcp.host_sw_if_index),
'vif_index': socket.ntohl(lcp.vif_index),
'host_if_name': lcp.host_if_name,
'namespace': lcp.namespace
}
else:
i = {
'phy_sw_if_index': lcp.phy_sw_if_index,
'host_sw_if_index': lcp.host_sw_if_index,
'vif_index': lcp.vif_index,
'host_if_name': lcp.host_if_name,
'namespace': lcp.namespace
}
ret[lcp.host_if_name] = i
return ret