@@ -360,6 +360,10 @@ func (r RawPath) SetPath(s *slayers.SCION) error {
360
360
return serrors .New ("snet.RawPath does not support SetPath" )
361
361
}
362
362
363
+ func (r RawPath ) SetExtensions (s * slayers.SCION , p * PacketInfo ) error {
364
+ return serrors .New ("snet.RawPath does not support SetExtensions" )
365
+ }
366
+
363
367
// Packet describes a SCION packet.
364
368
type Packet struct {
365
369
Bytes
@@ -370,16 +374,16 @@ type Packet struct {
370
374
func (p * Packet ) Decode () error {
371
375
var (
372
376
scionLayer slayers.SCION
373
- hbhLayer slayers.HopByHopExtnSkipper
374
- e2eLayer slayers.EndToEndExtnSkipper
377
+ hbhLayer slayers.HopByHopExtn
378
+ e2eLayer slayers.EndToEndExtn
375
379
udpLayer slayers.UDP
376
380
scmpLayer slayers.SCMP
377
381
)
378
382
parser := gopacket .NewDecodingLayerParser (
379
383
slayers .LayerTypeSCION , & scionLayer , & hbhLayer , & e2eLayer , & udpLayer , & scmpLayer ,
380
384
)
381
385
parser .IgnoreUnsupported = true
382
- decoded := make ([]gopacket.LayerType , 0 , 4 )
386
+ decoded := make ([]gopacket.LayerType , 0 , 6 )
383
387
if err := parser .DecodeLayers (p .Bytes , & decoded ); err != nil {
384
388
return err
385
389
}
@@ -411,6 +415,12 @@ func (p *Packet) Decode() error {
411
415
}
412
416
}
413
417
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
+ }
414
424
415
425
switch l4 {
416
426
case slayers .LayerTypeSCIONUDP :
@@ -581,10 +591,36 @@ func (p *Packet) Serialize() error {
581
591
if err := p .Path .SetPath (& scionLayer ); err != nil {
582
592
return serrors .WrapStr ("setting path" , err )
583
593
}
594
+ if err := p .Path .SetExtensions (& scionLayer , & p .PacketInfo ); err != nil {
595
+ return serrors .WrapStr ("error setting the header extensions" , err )
596
+ }
584
597
585
598
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
+
586
606
packetLayers = append (packetLayers , p .Payload .toLayers (& scionLayer )... )
587
607
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
+
588
624
buffer := gopacket .NewSerializeBuffer ()
589
625
options := gopacket.SerializeOptions {
590
626
ComputeChecksums : true ,
@@ -617,4 +653,8 @@ type PacketInfo struct {
617
653
Path DataplanePath
618
654
// Payload is the Payload of the message.
619
655
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
620
660
}
0 commit comments