You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中如何获取VRF从链路的Table ID

如何访问VRF从设备链路的Table ID(基于vishvananda/netlink库)

我正在使用vishvananda/netlink库,尝试获取被设置为VRF从设备的链路的Table ID。添加链路后查询,能看到netlink.LinkAttrs的Slave字段已被设置,用%+v打印显示为{Table:2},这是正确的,但我无法访问其中的Table字段。

相关类型定义

LinkAttrs中的Slave字段类型为SlaveType接口:

type LinkAttrs struct {
    ...
    Slave SlaveType
}

SlaveType接口定义如下:

type LinkSlave interface {
    SlaveType() string
}

调用link.Attrs().Slave.SlaveType()返回值为"vrf",说明赋值给Slave的结构体应该是netlink.Vrf类型,但该类型并未实现SlaveType接口,因此类型断言:

vrf, ok := link.Slave.(netlink.Vrf) // 或 .*(netlink.Vrf)

会提示“impossible assertion”,这符合预期。

我只找到BondSlave类型实现了该接口,但它没有Table字段;唯一带有Table字段的是Vrf结构体:

type Vrf struct {
    LinkAttrs
    Table uint32
}

因此我不知该如何访问Table字段。

测试代码与运行方式

运行命令

sudo -E --preserve-env=PATH bash -c "go test"

测试代码

package main

import (
    "fmt"
    "testing"

    "github.com/vishvananda/netlink"
    "github.com/stretchr/testify/require"
)

var vrfConfig = &netlink.Vrf{
    LinkAttrs: netlink.LinkAttrs{
        Name:  "vrf1"},
    Table: 2,
}

var link1Config = &netlink.Gretap{
    LinkAttrs: netlink.LinkAttrs{
        Name:      "link1"},
    Remote: []byte{1, 1, 1, 1},
}

func TestSlave(t *testing.T) {
    err := netlink.LinkAdd(vrfConfig)
    require.NoError(t, err)

    err = netlink.LinkAdd(link1Config)
    require.NoError(t, err)

    err = netlink.LinkSetMaster(link1Config, vrfConfig)
    require.NoError(t, err)

    links, err := netlink.LinkList()
    require.NoError(t, err)

    for _, link := range links {
        if link.Attrs().Name == "link1" {
            fmt.Printf("Slave: %+v\n", link.Attrs().Slave)
        }
    }
}

清理命令

sudo ip link delete vrf1; sudo ip link delete link1

内容的提问来源于stack exchange,提问作者Jeff Learman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:30:42