From 37d0acb9c3a973fc261c8b829e9690514a4a4d64 Mon Sep 17 00:00:00 2001
From: Oliver Herms <oliver.peter.herms@gmail.com>
Date: Fri, 27 Mar 2020 21:54:05 +0100
Subject: [PATCH] Add receive method for ISIS server

---
 protocols/isis/server/device.go  |  4 --
 protocols/isis/server/receive.go | 63 ++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 4 deletions(-)
 create mode 100644 protocols/isis/server/receive.go

diff --git a/protocols/isis/server/device.go b/protocols/isis/server/device.go
index 1df58655..e053510f 100644
--- a/protocols/isis/server/device.go
+++ b/protocols/isis/server/device.go
@@ -114,10 +114,6 @@ func (d *dev) disable() error {
 	return nil
 }
 
-func (d *dev) receiverRoutine() {
-	// To be implemented
-}
-
 func (d *dev) helloRoutine() {
 	// To be implemented
 }
diff --git a/protocols/isis/server/receive.go b/protocols/isis/server/receive.go
new file mode 100644
index 00000000..af916790
--- /dev/null
+++ b/protocols/isis/server/receive.go
@@ -0,0 +1,63 @@
+package server
+
+import (
+	"bytes"
+	"fmt"
+
+	"github.com/bio-routing/bio-rd/protocols/isis/packet"
+	"github.com/pkg/errors"
+)
+
+func (d *dev) receiverRoutine() {
+	defer d.wg.Done()
+
+	for {
+		select {
+		case <-d.done:
+			return
+		default:
+			err := d.self.processIngressPacket()
+			if err != nil {
+				d.srv.log.Errorf("%v", err)
+				return
+			}
+		}
+	}
+}
+
+func (d *dev) processIngressPacket() error {
+	rawPkt, src, err := d.sys.recvPacket()
+	if err != nil {
+		return errors.Wrap(err, "receiving packet failed")
+	}
+
+	pkt, err := packet.Decode(bytes.NewBuffer(rawPkt))
+	if err != nil {
+		return fmt.Errorf("Unable to decode packet from %v on %v: %v: %v", src, d.name, rawPkt, err)
+	}
+
+	switch pkt.Header.PDUType {
+	case packet.P2P_HELLO:
+		err = d.self.processP2PHello(pkt.Body.(*packet.P2PHello), src)
+		if err != nil {
+			return errors.Wrap(err, "Unable to process P2P Hello")
+		}
+	case packet.L2_LS_PDU_TYPE:
+		err = d.self.processLSPDU(pkt.Body.(*packet.LSPDU), src)
+		if err != nil {
+			return errors.Wrap(err, "Unable to process LSPDU")
+		}
+	case packet.L2_CSNP_TYPE:
+		err = d.self.processCSNP(pkt.Body.(*packet.CSNP), src)
+		if err != nil {
+			return errors.Wrap(err, "Unable to process CSNP")
+		}
+	case packet.L2_PSNP_TYPE:
+		err = d.self.processPSNP(pkt.Body.(*packet.PSNP), src)
+		if err != nil {
+			return errors.Wrap(err, "Unable to process PSNP")
+		}
+	}
+
+	return nil
+}
-- 
GitLab