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
相关产品推荐
相关产品推荐

