Skip to content

Commit 116c5f0

Browse files
author
Marc Odermatt
committedSep 18, 2024
Enable extension options
1 parent 41a56c8 commit 116c5f0

File tree

7 files changed

+68
-3
lines changed

7 files changed

+68
-3
lines changed
 

‎pkg/snet/packet.go

+43-3
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,10 @@ func (r RawPath) SetPath(s *slayers.SCION) error {
360360
return serrors.New("snet.RawPath does not support SetPath")
361361
}
362362

363+
func (r RawPath) SetExtensions(s *slayers.SCION, p *PacketInfo) error {
364+
return serrors.New("snet.RawPath does not support SetExtensions")
365+
}
366+
363367
// Packet describes a SCION packet.
364368
type Packet struct {
365369
Bytes
@@ -370,16 +374,16 @@ type Packet struct {
370374
func (p *Packet) Decode() error {
371375
var (
372376
scionLayer slayers.SCION
373-
hbhLayer slayers.HopByHopExtnSkipper
374-
e2eLayer slayers.EndToEndExtnSkipper
377+
hbhLayer slayers.HopByHopExtn
378+
e2eLayer slayers.EndToEndExtn
375379
udpLayer slayers.UDP
376380
scmpLayer slayers.SCMP
377381
)
378382
parser := gopacket.NewDecodingLayerParser(
379383
slayers.LayerTypeSCION, &scionLayer, &hbhLayer, &e2eLayer, &udpLayer, &scmpLayer,
380384
)
381385
parser.IgnoreUnsupported = true
382-
decoded := make([]gopacket.LayerType, 0, 4)
386+
decoded := make([]gopacket.LayerType, 0, 6)
383387
if err := parser.DecodeLayers(p.Bytes, &decoded); err != nil {
384388
return err
385389
}
@@ -411,6 +415,12 @@ func (p *Packet) Decode() error {
411415
}
412416
}
413417
p.Path = rpath
418+
if len(hbhLayer.Options) != 0 {
419+
p.HbhExtension = &hbhLayer
420+
}
421+
if len(e2eLayer.Options) != 0 {
422+
p.E2eExtension = &e2eLayer
423+
}
414424

415425
switch l4 {
416426
case slayers.LayerTypeSCIONUDP:
@@ -581,10 +591,36 @@ func (p *Packet) Serialize() error {
581591
if err := p.Path.SetPath(&scionLayer); err != nil {
582592
return serrors.WrapStr("setting path", err)
583593
}
594+
if err := p.Path.SetExtensions(&scionLayer, &p.PacketInfo); err != nil {
595+
return serrors.WrapStr("error setting the header extensions", err)
596+
}
584597

585598
packetLayers = append(packetLayers, &scionLayer)
599+
if p.HbhExtension != nil {
600+
packetLayers = append(packetLayers, p.HbhExtension)
601+
}
602+
if p.E2eExtension != nil {
603+
packetLayers = append(packetLayers, p.E2eExtension)
604+
}
605+
586606
packetLayers = append(packetLayers, p.Payload.toLayers(&scionLayer)...)
587607

608+
if p.HbhExtension != nil {
609+
tmp := scionLayer.NextHdr
610+
scionLayer.NextHdr = slayers.HopByHopClass
611+
p.HbhExtension.NextHdr = tmp
612+
613+
if p.E2eExtension != nil {
614+
tmp = p.HbhExtension.NextHdr
615+
p.HbhExtension.NextHdr = slayers.End2EndClass
616+
p.E2eExtension.NextHdr = tmp
617+
}
618+
} else if p.E2eExtension != nil {
619+
tmp := scionLayer.NextHdr
620+
scionLayer.NextHdr = slayers.End2EndClass
621+
p.E2eExtension.NextHdr = tmp
622+
}
623+
588624
buffer := gopacket.NewSerializeBuffer()
589625
options := gopacket.SerializeOptions{
590626
ComputeChecksums: true,
@@ -617,4 +653,8 @@ type PacketInfo struct {
617653
Path DataplanePath
618654
// Payload is the Payload of the message.
619655
Payload Payload
656+
// HbhExtension contains the Hop-by-Hop options.
657+
HbhExtension *slayers.HopByHopExtn
658+
// E2eExtension contains the End-to-End options.
659+
E2eExtension *slayers.EndToEndExtn
620660
}

‎pkg/snet/path.go

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ type DataplanePath interface {
4141
// SetPath sets the path in the SCION header. It assumes that all the fields
4242
// except the path and path type are set correctly.
4343
SetPath(scion *slayers.SCION) error
44+
45+
SetExtensions(s *slayers.SCION, p *PacketInfo) error
4446
}
4547

4648
// Path is an abstract representation of a path. Most applications do not need

‎pkg/snet/path/empty.go

+5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package path
1717
import (
1818
"github.com/scionproto/scion/pkg/slayers"
1919
"github.com/scionproto/scion/pkg/slayers/path/empty"
20+
"github.com/scionproto/scion/pkg/snet"
2021
)
2122

2223
type Empty struct{}
@@ -25,3 +26,7 @@ func (e Empty) SetPath(s *slayers.SCION) error {
2526
s.Path, s.PathType = empty.Path{}, empty.PathType
2627
return nil
2728
}
29+
30+
func (e Empty) SetExtensions(s *slayers.SCION, p *snet.PacketInfo) error {
31+
return nil
32+
}

‎pkg/snet/path/epic.go

+4
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,7 @@ func (e *EPIC) SetPath(s *slayers.SCION) error {
9494
s.Path, s.PathType = ep, ep.Type()
9595
return nil
9696
}
97+
98+
func (e *EPIC) SetExtensions(s *slayers.SCION, p *snet.PacketInfo) error {
99+
return nil
100+
}

‎pkg/snet/path/onehop.go

+5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package path
1616

1717
import (
1818
"crypto/rand"
19+
"github.com/scionproto/scion/pkg/snet"
1920
"hash"
2021
"math/big"
2122
"time"
@@ -68,3 +69,7 @@ func NewOneHop(
6869
ohp.FirstHop.Mac = path.MAC(mac, ohp.Info, ohp.FirstHop, nil)
6970
return ohp, nil
7071
}
72+
73+
func (p OneHop) SetExtensions(s *slayers.SCION, pi *snet.PacketInfo) error {
74+
return nil
75+
}

‎pkg/snet/path/scion.go

+5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/scionproto/scion/pkg/private/serrors"
1919
"github.com/scionproto/scion/pkg/slayers"
2020
"github.com/scionproto/scion/pkg/slayers/path/scion"
21+
"github.com/scionproto/scion/pkg/snet"
2122
)
2223

2324
type SCION struct {
@@ -43,3 +44,7 @@ func (p SCION) SetPath(s *slayers.SCION) error {
4344
s.Path, s.PathType = &sp, sp.Type()
4445
return nil
4546
}
47+
48+
func (p SCION) SetExtensions(s *slayers.SCION, pi *snet.PacketInfo) error {
49+
return nil
50+
}

‎pkg/snet/reply_pather.go

+4
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,7 @@ func (p RawReplyPath) SetPath(s *slayers.SCION) error {
5858
s.Path, s.PathType = p.Path, p.Path.Type()
5959
return nil
6060
}
61+
62+
func (p RawReplyPath) SetExtensions(s *slayers.SCION, pi *PacketInfo) error {
63+
return nil
64+
}

0 commit comments

Comments
 (0)
Please sign in to comment.