added encapsulation attributes to Iptun

added encapsulation attributes to Gretun
implemented Sittun struct for supporting SIT tunnels
This commit is contained in:
Reinier Schoof
2017-09-27 09:40:44 +02:00
committed by Vish (Ishaya) Abrams
parent 12728257a9
commit c29ba20204
4 changed files with 161 additions and 17 deletions

63
link.go
View File

@@ -700,12 +700,17 @@ func (gretap *Gretap) Type() string {
type Iptun struct { type Iptun struct {
LinkAttrs LinkAttrs
Ttl uint8 Ttl uint8
Tos uint8 Tos uint8
PMtuDisc uint8 PMtuDisc uint8
Link uint32 Link uint32
Local net.IP Local net.IP
Remote net.IP Remote net.IP
EncapSport uint16
EncapDport uint16
EncapType uint16
EncapFlags uint16
FlowBased bool
} }
func (iptun *Iptun) Attrs() *LinkAttrs { func (iptun *Iptun) Attrs() *LinkAttrs {
@@ -716,6 +721,28 @@ func (iptun *Iptun) Type() string {
return "ipip" return "ipip"
} }
type Sittun struct {
LinkAttrs
Link uint32
Local net.IP
Remote net.IP
Ttl uint8
Tos uint8
PMtuDisc uint8
EncapType uint16
EncapFlags uint16
EncapSport uint16
EncapDport uint16
}
func (sittun *Sittun) Attrs() *LinkAttrs {
return &sittun.LinkAttrs
}
func (sittun *Sittun) Type() string {
return "sit"
}
type Vti struct { type Vti struct {
LinkAttrs LinkAttrs
IKey uint32 IKey uint32
@@ -735,16 +762,20 @@ func (iptun *Vti) Type() string {
type Gretun struct { type Gretun struct {
LinkAttrs LinkAttrs
Link uint32 Link uint32
IFlags uint16 IFlags uint16
OFlags uint16 OFlags uint16
IKey uint32 IKey uint32
OKey uint32 OKey uint32
Local net.IP Local net.IP
Remote net.IP Remote net.IP
Ttl uint8 Ttl uint8
Tos uint8 Tos uint8
PMtuDisc uint8 PMtuDisc uint8
EncapType uint16
EncapFlags uint16
EncapSport uint16
EncapDport uint16
} }
func (gretun *Gretun) Attrs() *LinkAttrs { func (gretun *Gretun) Attrs() *LinkAttrs {

View File

@@ -945,6 +945,8 @@ func (h *Handle) linkModify(link Link, flags int) error {
addGretapAttrs(link, linkInfo) addGretapAttrs(link, linkInfo)
case *Iptun: case *Iptun:
addIptunAttrs(link, linkInfo) addIptunAttrs(link, linkInfo)
case *Sittun:
addSittunAttrs(link, linkInfo)
case *Gretun: case *Gretun:
addGretunAttrs(link, linkInfo) addGretunAttrs(link, linkInfo)
case *Vti: case *Vti:
@@ -1184,6 +1186,8 @@ func LinkDeserialize(hdr *unix.NlMsghdr, m []byte) (Link, error) {
link = &Gretap{} link = &Gretap{}
case "ipip": case "ipip":
link = &Iptun{} link = &Iptun{}
case "sit":
link = &Sittun{}
case "gre": case "gre":
link = &Gretun{} link = &Gretun{}
case "vti": case "vti":
@@ -1217,6 +1221,8 @@ func LinkDeserialize(hdr *unix.NlMsghdr, m []byte) (Link, error) {
parseGretapData(link, data) parseGretapData(link, data)
case "ipip": case "ipip":
parseIptunData(link, data) parseIptunData(link, data)
case "sit":
parseSittunData(link, data)
case "gre": case "gre":
parseGretunData(link, data) parseGretunData(link, data)
case "vti": case "vti":
@@ -1810,6 +1816,10 @@ func addGretunAttrs(gre *Gretun, linkInfo *nl.RtAttr) {
nl.NewRtAttrChild(data, nl.IFLA_GRE_PMTUDISC, nl.Uint8Attr(gre.PMtuDisc)) nl.NewRtAttrChild(data, nl.IFLA_GRE_PMTUDISC, nl.Uint8Attr(gre.PMtuDisc))
nl.NewRtAttrChild(data, nl.IFLA_GRE_TTL, nl.Uint8Attr(gre.Ttl)) nl.NewRtAttrChild(data, nl.IFLA_GRE_TTL, nl.Uint8Attr(gre.Ttl))
nl.NewRtAttrChild(data, nl.IFLA_GRE_TOS, nl.Uint8Attr(gre.Tos)) nl.NewRtAttrChild(data, nl.IFLA_GRE_TOS, nl.Uint8Attr(gre.Tos))
nl.NewRtAttrChild(data, nl.IFLA_GRE_ENCAP_TYPE, nl.Uint16Attr(gre.EncapType))
nl.NewRtAttrChild(data, nl.IFLA_GRE_ENCAP_FLAGS, nl.Uint16Attr(gre.EncapFlags))
nl.NewRtAttrChild(data, nl.IFLA_GRE_ENCAP_SPORT, htons(gre.EncapSport))
nl.NewRtAttrChild(data, nl.IFLA_GRE_ENCAP_DPORT, htons(gre.EncapDport))
} }
func parseGretunData(link Link, data []syscall.NetlinkRouteAttr) { func parseGretunData(link Link, data []syscall.NetlinkRouteAttr) {
@@ -1835,6 +1845,14 @@ func parseGretunData(link Link, data []syscall.NetlinkRouteAttr) {
gre.Tos = uint8(datum.Value[0]) gre.Tos = uint8(datum.Value[0])
case nl.IFLA_GRE_PMTUDISC: case nl.IFLA_GRE_PMTUDISC:
gre.PMtuDisc = uint8(datum.Value[0]) gre.PMtuDisc = uint8(datum.Value[0])
case nl.IFLA_GRE_ENCAP_TYPE:
gre.EncapType = native.Uint16(datum.Value[0:2])
case nl.IFLA_GRE_ENCAP_FLAGS:
gre.EncapFlags = native.Uint16(datum.Value[0:2])
case nl.IFLA_GRE_ENCAP_SPORT:
gre.EncapSport = ntohs(datum.Value[0:2])
case nl.IFLA_GRE_ENCAP_DPORT:
gre.EncapDport = ntohs(datum.Value[0:2])
} }
} }
} }
@@ -1881,6 +1899,12 @@ func parseLinkXdp(data []byte) (*LinkXdp, error) {
} }
func addIptunAttrs(iptun *Iptun, linkInfo *nl.RtAttr) { func addIptunAttrs(iptun *Iptun, linkInfo *nl.RtAttr) {
if iptun.FlowBased {
// In flow based mode, no other attributes need to be configured
nl.NewRtAttrChild(linkInfo, nl.IFLA_IPTUN_COLLECT_METADATA, boolAttr(iptun.FlowBased))
return
}
data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil)
ip := iptun.Local.To4() ip := iptun.Local.To4()
@@ -1899,6 +1923,10 @@ func addIptunAttrs(iptun *Iptun, linkInfo *nl.RtAttr) {
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_PMTUDISC, nl.Uint8Attr(iptun.PMtuDisc)) nl.NewRtAttrChild(data, nl.IFLA_IPTUN_PMTUDISC, nl.Uint8Attr(iptun.PMtuDisc))
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_TTL, nl.Uint8Attr(iptun.Ttl)) nl.NewRtAttrChild(data, nl.IFLA_IPTUN_TTL, nl.Uint8Attr(iptun.Ttl))
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_TOS, nl.Uint8Attr(iptun.Tos)) nl.NewRtAttrChild(data, nl.IFLA_IPTUN_TOS, nl.Uint8Attr(iptun.Tos))
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_ENCAP_TYPE, nl.Uint16Attr(iptun.EncapType))
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_ENCAP_FLAGS, nl.Uint16Attr(iptun.EncapFlags))
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_ENCAP_SPORT, htons(iptun.EncapSport))
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_ENCAP_DPORT, htons(iptun.EncapDport))
} }
func parseIptunData(link Link, data []syscall.NetlinkRouteAttr) { func parseIptunData(link Link, data []syscall.NetlinkRouteAttr) {
@@ -1915,6 +1943,68 @@ func parseIptunData(link Link, data []syscall.NetlinkRouteAttr) {
iptun.Tos = uint8(datum.Value[0]) iptun.Tos = uint8(datum.Value[0])
case nl.IFLA_IPTUN_PMTUDISC: case nl.IFLA_IPTUN_PMTUDISC:
iptun.PMtuDisc = uint8(datum.Value[0]) iptun.PMtuDisc = uint8(datum.Value[0])
case nl.IFLA_IPTUN_ENCAP_SPORT:
iptun.EncapSport = ntohs(datum.Value[0:2])
case nl.IFLA_IPTUN_ENCAP_DPORT:
iptun.EncapDport = ntohs(datum.Value[0:2])
case nl.IFLA_IPTUN_ENCAP_TYPE:
iptun.EncapType = native.Uint16(datum.Value[0:2])
case nl.IFLA_IPTUN_ENCAP_FLAGS:
iptun.EncapFlags = native.Uint16(datum.Value[0:2])
case nl.IFLA_IPTUN_COLLECT_METADATA:
iptun.FlowBased = int8(datum.Value[0]) != 0
}
}
}
func addSittunAttrs(sittun *Sittun, linkInfo *nl.RtAttr) {
data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil)
if sittun.Link != 0 {
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_LINK, nl.Uint32Attr(sittun.Link))
}
ip := sittun.Local.To4()
if ip != nil {
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_LOCAL, []byte(ip))
}
ip = sittun.Remote.To4()
if ip != nil {
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_REMOTE, []byte(ip))
}
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_TTL, nl.Uint8Attr(sittun.Ttl))
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_TOS, nl.Uint8Attr(sittun.Tos))
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_PMTUDISC, nl.Uint8Attr(sittun.PMtuDisc))
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_ENCAP_TYPE, nl.Uint16Attr(sittun.EncapType))
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_ENCAP_FLAGS, nl.Uint16Attr(sittun.EncapFlags))
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_ENCAP_SPORT, htons(sittun.EncapSport))
nl.NewRtAttrChild(data, nl.IFLA_IPTUN_ENCAP_DPORT, htons(sittun.EncapDport))
}
func parseSittunData(link Link, data []syscall.NetlinkRouteAttr) {
sittun := link.(*Sittun)
for _, datum := range data {
switch datum.Attr.Type {
case nl.IFLA_IPTUN_LOCAL:
sittun.Local = net.IP(datum.Value[0:4])
case nl.IFLA_IPTUN_REMOTE:
sittun.Remote = net.IP(datum.Value[0:4])
case nl.IFLA_IPTUN_TTL:
sittun.Ttl = uint8(datum.Value[0])
case nl.IFLA_IPTUN_TOS:
sittun.Tos = uint8(datum.Value[0])
case nl.IFLA_IPTUN_PMTUDISC:
sittun.PMtuDisc = uint8(datum.Value[0])
case nl.IFLA_IPTUN_ENCAP_TYPE:
sittun.EncapType = native.Uint16(datum.Value[0:2])
case nl.IFLA_IPTUN_ENCAP_FLAGS:
sittun.EncapFlags = native.Uint16(datum.Value[0:2])
case nl.IFLA_IPTUN_ENCAP_SPORT:
sittun.EncapSport = ntohs(datum.Value[0:2])
case nl.IFLA_IPTUN_ENCAP_DPORT:
sittun.EncapDport = ntohs(datum.Value[0:2])
} }
} }
} }

View File

@@ -176,6 +176,13 @@ func testLinkAddDel(t *testing.T, link Link) {
} }
} }
if _, ok := link.(*Sittun); ok {
_, ok := result.(*Sittun)
if !ok {
t.Fatal("Result of create is not a sittun")
}
}
if _, ok := link.(*Gretap); ok { if _, ok := link.(*Gretap); ok {
_, ok := result.(*Gretap) _, ok := result.(*Gretap)
if !ok { if !ok {
@@ -1221,6 +1228,17 @@ func TestLinkAddDelIptun(t *testing.T) {
Remote: net.IPv4(127, 0, 0, 1)}) Remote: net.IPv4(127, 0, 0, 1)})
} }
func TestLinkAddDelSittun(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
testLinkAddDel(t, &Sittun{
LinkAttrs: LinkAttrs{Name: "sittunfoo"},
PMtuDisc: 1,
Local: net.IPv4(127, 0, 0, 1),
Remote: net.IPv4(127, 0, 0, 1)})
}
func TestLinkAddDelVti(t *testing.T) { func TestLinkAddDelVti(t *testing.T) {
tearDown := setUpNetlinkTest(t) tearDown := setUpNetlinkTest(t)
defer tearDown() defer tearDown()

View File

@@ -476,7 +476,12 @@ const (
IFLA_IPTUN_6RD_RELAY_PREFIX IFLA_IPTUN_6RD_RELAY_PREFIX
IFLA_IPTUN_6RD_PREFIXLEN IFLA_IPTUN_6RD_PREFIXLEN
IFLA_IPTUN_6RD_RELAY_PREFIXLEN IFLA_IPTUN_6RD_RELAY_PREFIXLEN
IFLA_IPTUN_MAX = IFLA_IPTUN_6RD_RELAY_PREFIXLEN IFLA_IPTUN_ENCAP_TYPE
IFLA_IPTUN_ENCAP_FLAGS
IFLA_IPTUN_ENCAP_SPORT
IFLA_IPTUN_ENCAP_DPORT
IFLA_IPTUN_COLLECT_METADATA
IFLA_IPTUN_MAX = IFLA_IPTUN_COLLECT_METADATA
) )
const ( const (