mirror of https://github.com/vishvananda/netlink
Add support for VRF. With this change we can create VRF interface.
$ sudo ip link add vrf1 type vrf table 1
This commit is contained in:
parent
9f67bd458b
commit
ade05d5c8f
13
link.go
13
link.go
|
@ -659,6 +659,19 @@ func (iptun *Vti) Type() string {
|
||||||
return "vti"
|
return "vti"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Vrf struct {
|
||||||
|
LinkAttrs
|
||||||
|
Table uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
func (vrf *Vrf) Attrs() *LinkAttrs {
|
||||||
|
return &vrf.LinkAttrs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (vrf *Vrf) Type() string {
|
||||||
|
return "vrf"
|
||||||
|
}
|
||||||
|
|
||||||
// iproute2 supported devices;
|
// iproute2 supported devices;
|
||||||
// vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
|
// vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
|
||||||
// bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan |
|
// bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan |
|
||||||
|
|
|
@ -787,6 +787,8 @@ func (h *Handle) LinkAdd(link Link) error {
|
||||||
addIptunAttrs(iptun, linkInfo)
|
addIptunAttrs(iptun, linkInfo)
|
||||||
} else if vti, ok := link.(*Vti); ok {
|
} else if vti, ok := link.(*Vti); ok {
|
||||||
addVtiAttrs(vti, linkInfo)
|
addVtiAttrs(vti, linkInfo)
|
||||||
|
} else if vrf, ok := link.(*Vrf); ok {
|
||||||
|
addVrfAttrs(vrf, linkInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
req.AddData(linkInfo)
|
req.AddData(linkInfo)
|
||||||
|
@ -1014,6 +1016,8 @@ func LinkDeserialize(hdr *syscall.NlMsghdr, m []byte) (Link, error) {
|
||||||
link = &Iptun{}
|
link = &Iptun{}
|
||||||
case "vti":
|
case "vti":
|
||||||
link = &Vti{}
|
link = &Vti{}
|
||||||
|
case "vrf":
|
||||||
|
link = &Vrf{}
|
||||||
default:
|
default:
|
||||||
link = &GenericLink{LinkType: linkType}
|
link = &GenericLink{LinkType: linkType}
|
||||||
}
|
}
|
||||||
|
@ -1041,6 +1045,8 @@ func LinkDeserialize(hdr *syscall.NlMsghdr, m []byte) (Link, error) {
|
||||||
parseIptunData(link, data)
|
parseIptunData(link, data)
|
||||||
case "vti":
|
case "vti":
|
||||||
parseVtiData(link, data)
|
parseVtiData(link, data)
|
||||||
|
case "vrf":
|
||||||
|
parseVrfData(link, data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1617,3 +1623,20 @@ func parseVtiData(link Link, data []syscall.NetlinkRouteAttr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func addVrfAttrs(vrf *Vrf, linkInfo *nl.RtAttr) {
|
||||||
|
data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil)
|
||||||
|
b := make([]byte, 4)
|
||||||
|
native.PutUint32(b, uint32(vrf.Table))
|
||||||
|
nl.NewRtAttrChild(data, nl.IFLA_VRF_TABLE, b)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseVrfData(link Link, data []syscall.NetlinkRouteAttr) {
|
||||||
|
vrf := link.(*Vrf)
|
||||||
|
for _, datum := range data {
|
||||||
|
switch datum.Attr.Type {
|
||||||
|
case nl.IFLA_VRF_TABLE:
|
||||||
|
vrf.Table = native.Uint32(datum.Value[0:4])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -447,3 +447,8 @@ const (
|
||||||
IFLA_VTI_REMOTE
|
IFLA_VTI_REMOTE
|
||||||
IFLA_VTI_MAX = IFLA_VTI_REMOTE
|
IFLA_VTI_MAX = IFLA_VTI_REMOTE
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
IFLA_VRF_UNSPEC = iota
|
||||||
|
IFLA_VRF_TABLE
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue