add vti6 support

Signed-off-by: semicomplete <example@example.com>
This commit is contained in:
semicomplete 2018-06-13 20:00:30 +02:00 committed by Flavio Crisciani
parent b1cc70dea2
commit ee06b1df73
3 changed files with 33 additions and 8 deletions

View File

@ -781,7 +781,10 @@ func (vti *Vti) Attrs() *LinkAttrs {
return &vti.LinkAttrs return &vti.LinkAttrs
} }
func (iptun *Vti) Type() string { func (vti *Vti) Type() string {
if vti.Local.To4() == nil {
return "vti6"
}
return "vti" return "vti"
} }
@ -846,7 +849,7 @@ func (gtp *GTP) Type() string {
// 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 |
// gre | gretap | ip6gre | ip6gretap | vti | nlmon | // gre | gretap | ip6gre | ip6gretap | vti | vti6 | nlmon |
// bond_slave | ipvlan // bond_slave | ipvlan
// LinkNotFoundError wraps the various not found errors when // LinkNotFoundError wraps the various not found errors when

View File

@ -1415,7 +1415,7 @@ func LinkDeserialize(hdr *unix.NlMsghdr, m []byte) (Link, error) {
link = &Gretun{} link = &Gretun{}
case "ip6gre": case "ip6gre":
link = &Gretun{} link = &Gretun{}
case "vti": case "vti", "vti6":
link = &Vti{} link = &Vti{}
case "vrf": case "vrf":
link = &Vrf{} link = &Vrf{}
@ -1454,7 +1454,7 @@ func LinkDeserialize(hdr *unix.NlMsghdr, m []byte) (Link, error) {
parseGretunData(link, data) parseGretunData(link, data)
case "ip6gre": case "ip6gre":
parseGretunData(link, data) parseGretunData(link, data)
case "vti": case "vti", "vti6":
parseVtiData(link, data) parseVtiData(link, data)
case "vrf": case "vrf":
parseVrfData(link, data) parseVrfData(link, data)
@ -2304,12 +2304,27 @@ func parseSittunData(link Link, data []syscall.NetlinkRouteAttr) {
func addVtiAttrs(vti *Vti, linkInfo *nl.RtAttr) { func addVtiAttrs(vti *Vti, linkInfo *nl.RtAttr) {
data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil)
ip := vti.Local.To4() family := FAMILY_V4
if vti.Local.To4() == nil {
family = FAMILY_V6
}
var ip net.IP
if family == FAMILY_V4 {
ip = vti.Local.To4()
} else {
ip = vti.Local
}
if ip != nil { if ip != nil {
nl.NewRtAttrChild(data, nl.IFLA_VTI_LOCAL, []byte(ip)) nl.NewRtAttrChild(data, nl.IFLA_VTI_LOCAL, []byte(ip))
} }
ip = vti.Remote.To4() if family == FAMILY_V4 {
ip = vti.Remote.To4()
} else {
ip = vti.Remote
}
if ip != nil { if ip != nil {
nl.NewRtAttrChild(data, nl.IFLA_VTI_REMOTE, []byte(ip)) nl.NewRtAttrChild(data, nl.IFLA_VTI_REMOTE, []byte(ip))
} }
@ -2327,9 +2342,9 @@ func parseVtiData(link Link, data []syscall.NetlinkRouteAttr) {
for _, datum := range data { for _, datum := range data {
switch datum.Attr.Type { switch datum.Attr.Type {
case nl.IFLA_VTI_LOCAL: case nl.IFLA_VTI_LOCAL:
vti.Local = net.IP(datum.Value[0:4]) vti.Local = net.IP(datum.Value)
case nl.IFLA_VTI_REMOTE: case nl.IFLA_VTI_REMOTE:
vti.Remote = net.IP(datum.Value[0:4]) vti.Remote = net.IP(datum.Value)
case nl.IFLA_VTI_IKEY: case nl.IFLA_VTI_IKEY:
vti.IKey = ntohl(datum.Value[0:4]) vti.IKey = ntohl(datum.Value[0:4])
case nl.IFLA_VTI_OKEY: case nl.IFLA_VTI_OKEY:

View File

@ -1482,6 +1482,13 @@ func TestLinkAddDelVti(t *testing.T) {
OKey: 0x101, OKey: 0x101,
Local: net.IPv4(127, 0, 0, 1), Local: net.IPv4(127, 0, 0, 1),
Remote: net.IPv4(127, 0, 0, 1)}) Remote: net.IPv4(127, 0, 0, 1)})
testLinkAddDel(t, &Vti{
LinkAttrs: LinkAttrs{Name: "vtibar"},
IKey: 0x101,
OKey: 0x101,
Local: net.IPv6loopback,
Remote: net.IPv6loopback})
} }
func TestBridgeCreationWithMulticastSnooping(t *testing.T) { func TestBridgeCreationWithMulticastSnooping(t *testing.T) {