diff --git a/protocols/isis/server/device.go b/protocols/isis/server/device.go index 1df586558224a7deca49aa3bd4692dadeef08181..e053510f2fd0ece259ae7933b168abd884d69ca5 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 0000000000000000000000000000000000000000..af9167907baf751805a38a96ff1758e2a3df9d14 --- /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 +}