From 28a41e1d1672b618ea5d32fc8a77102ed8dd6d92 Mon Sep 17 00:00:00 2001 From: Jianyong Wu Date: Wed, 30 Aug 2023 09:56:40 +0000 Subject: [PATCH] runtime: add a new API for Network interface Add GetEndpointsNum API for Network Interface to get the number of network endpoints. This is used for caculate the number of pcie root port for QemuVirt. Signed-off-by: Jianyong Wu --- src/runtime/virtcontainers/network.go | 3 +++ src/runtime/virtcontainers/network_darwin.go | 4 ++++ src/runtime/virtcontainers/network_linux.go | 21 ++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/src/runtime/virtcontainers/network.go b/src/runtime/virtcontainers/network.go index cf2c031de..8619389e1 100644 --- a/src/runtime/virtcontainers/network.go +++ b/src/runtime/virtcontainers/network.go @@ -226,6 +226,9 @@ type Network interface { // SetEndpoints sets a sandbox's network endpoints. SetEndpoints([]Endpoint) + + // GetEndpoints number of sandbox's network endpoints. + GetEndpointsNum() (int, error) } func generateVCNetworkStructures(ctx context.Context, network Network) ([]*pbTypes.Interface, []*pbTypes.Route, []*pbTypes.ARPNeighbor, error) { diff --git a/src/runtime/virtcontainers/network_darwin.go b/src/runtime/virtcontainers/network_darwin.go index b86150f24..922da24c6 100644 --- a/src/runtime/virtcontainers/network_darwin.go +++ b/src/runtime/virtcontainers/network_darwin.go @@ -92,6 +92,10 @@ func (n *DarwinNetwork) SetEndpoints(endpoints []Endpoint) { n.eps = endpoints } +func (n *DarwinNetwork) GetEndpointsNum() (int, error) { + return 0, nil +} + func validGuestRoute(route netlink.Route) bool { return true } diff --git a/src/runtime/virtcontainers/network_linux.go b/src/runtime/virtcontainers/network_linux.go index 41dffed8f..d4decdd2d 100644 --- a/src/runtime/virtcontainers/network_linux.go +++ b/src/runtime/virtcontainers/network_linux.go @@ -291,6 +291,27 @@ func (n *LinuxNetwork) endpointAlreadyAdded(netInfo *NetworkInfo) bool { return false } +func (n *LinuxNetwork) GetEndpointsNum() (int, error) { + netnsHandle, err := netns.GetFromPath(n.netNSPath) + if err != nil { + return 0, err + } + defer netnsHandle.Close() + + netlinkHandle, err := netlink.NewHandleAt(netnsHandle) + if err != nil { + return 0, err + } + defer netlinkHandle.Close() + + linkList, err := netlinkHandle.LinkList() + if err != nil { + return 0, err + } + + return len(linkList), nil +} + // Scan the networking namespace through netlink and then: // 1. Create the endpoints for the relevant interfaces found there. // 2. Attach them to the VM.