From 0358eea5a4fd2e73224e4b48ea7ac5b68213720f Mon Sep 17 00:00:00 2001 From: Josh Deprez Date: Mon, 1 Apr 2024 15:33:57 +1100 Subject: [PATCH] Handle GDZL and GZN --- aurp/routing_info.go | 11 +++++++++ aurp/transport.go | 57 ++++++++++++++++++++++++++++++++++++++++++++ peer.go | 19 +++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/aurp/routing_info.go b/aurp/routing_info.go index c716e8d..5963cb5 100644 --- a/aurp/routing_info.go +++ b/aurp/routing_info.go @@ -239,3 +239,14 @@ const ( EventCodeNDC EventCode = 4 EventCodeZC EventCode = 5 ) + +func (ec EventCode) String() string { + return map[EventCode]string{ + EventCodeNull: "null", + EventCodeNA: "network added", + EventCodeND: "network deleted", + EventCodeNRC: "network route change", + EventCodeNDC: "network distance change", + EventCodeZC: "zone name change", + }[ec] +} diff --git a/aurp/transport.go b/aurp/transport.go index 40ede57..e9bf0b3 100644 --- a/aurp/transport.go +++ b/aurp/transport.go @@ -209,6 +209,63 @@ func (tr *Transport) NewZIRspPacket(zones ZoneTuples) *ZIRspPacket { } } +// NewGDZLReqPacket returns a new GDZL-Req packet structure. +func (tr *Transport) NewGDZLReqPacket(startIdx uint16) *GDZLReqPacket { + return &GDZLReqPacket{ + Header: Header{ + TrHeader: tr.transaction(tr.LocalConnID), + CommandCode: CmdCodeZoneReq, + Flags: 0, + }, + Subcode: SubcodeGetDomainZoneList, + StartIndex: startIdx, + } +} + +// NewGZNRspPacket returns a new GDZL-Rsp packet structure. If GDZL function is +// not supported, startIdx should be set to -1. +func (tr *Transport) NewGDZLRspPacket(startIdx int16, zoneNames []string) *GDZLRspPacket { + return &GDZLRspPacket{ + Header: Header{ + TrHeader: tr.transaction(tr.RemoteConnID), + CommandCode: CmdCodeZoneReq, + Flags: 0, + }, + Subcode: SubcodeGetDomainZoneList, + StartIndex: startIdx, + ZoneNames: zoneNames, + } +} + +// NewGZNReqPacket returns a new GZN-Req packet structure requesting nets for a +// given zone name. +func (tr *Transport) NewGZNReqPacket(zoneName string) *GZNReqPacket { + return &GZNReqPacket{ + Header: Header{ + TrHeader: tr.transaction(tr.LocalConnID), + CommandCode: CmdCodeZoneReq, + Flags: 0, + }, + Subcode: SubcodeGetZonesNet, + ZoneName: zoneName, + } +} + +// NewGZNRspPacket returns a new GZN-Rsp packet structure. +func (tr *Transport) NewGZNRspPacket(zoneName string, notSupported bool, nets NetworkTuples) *GZNRspPacket { + return &GZNRspPacket{ + Header: Header{ + TrHeader: tr.transaction(tr.RemoteConnID), + CommandCode: CmdCodeZoneReq, + Flags: 0, + }, + Subcode: SubcodeGetZonesNet, + ZoneName: zoneName, + NotSupported: notSupported, + Networks: nets, + } +} + // NewRDPacket returns a new RD packet structure. func (tr *Transport) NewRDPacket(errCode ErrorCode) *RDPacket { return &RDPacket{ diff --git a/peer.go b/peer.go index 2b1234b..ed94a39 100644 --- a/peer.go +++ b/peer.go @@ -345,12 +345,31 @@ func (p *peer) handle(ctx context.Context) error { } if _, err := p.send(p.tr.NewZIRspPacket(zones)); err != nil { log.Printf("Couldn't send ZI-Rsp packet: %v", err) + return err } case *aurp.ZIRspPacket: // TODO: Integrate info into zone table log.Printf("Learned about these zones: %v", pkt.Zones) + case *aurp.GDZLReqPacket: + if _, err := p.send(p.tr.NewGDZLRspPacket(-1, nil)); err != nil { + log.Printf("Couldn't send GDZL-Rsp packet: %v", err) + return err + } + + case *aurp.GDZLRspPacket: + log.Printf("Received a GDZL-Rsp, but I wouldn't have sent a GDZL-Req - that's weird") + + case *aurp.GZNReqPacket: + if _, err := p.send(p.tr.NewGZNRspPacket(pkt.ZoneName, false, nil)); err != nil { + log.Printf("Couldn't send GZN-Rsp packet: %v", err) + return err + } + + case *aurp.GZNRspPacket: + log.Printf("Received a GZN-Rsp, but I wouldn't have sent a GZN-Req - that's weird") + case *aurp.TicklePacket: // Immediately respond with Tickle-Ack if _, err := p.send(p.tr.NewTickleAckPacket()); err != nil {