Skip to content
Snippets Groups Projects
isis.go 1.64 KiB
Newer Older
package packet

import (
	"bytes"
)

const (
	L1_LAN_HELLO_TYPE = 0x0f
	L1_LS_PDU_TYPE    = 0x18
	L1_CSNP_TYPE      = 0x24
	L1_PSNP_TYPE      = 0x26
	L2_LAN_HELLO_TYPE = 0x10
	L2_LS_PDU_TYPE    = 0x14
	L2_CSNP_TYPE      = 0x19
	L2_PSNP_TYPE      = 0x1b
	P2P_HELLO         = 0x11

	DOWN_STATE         = 2
	INITIALIZING_STATE = 1
Oliver Herms's avatar
Oliver Herms committed
	UP_STATE           = 0
takt's avatar
takt committed
var (
	AllL1ISS  = [6]byte{0x01, 0x80, 0xC2, 0x00, 0x00, 0x14}
	AllL2ISS  = [6]byte{0x01, 0x80, 0xC2, 0x00, 0x00, 0x15}
	AllP2PISS = [6]byte{0x09, 0x00, 0x2b, 0x00, 0x00, 0x05}
	AllISS    = [6]byte{0x09, 0x00, 0x2B, 0x00, 0x00, 0x05}
	AllESS    = [6]byte{0x09, 0x00, 0x2B, 0x00, 0x00, 0x04}
)

Oliver Herms's avatar
Oliver Herms committed
// ISISPacket represents an ISIS packet
type ISISPacket struct {
	Header *ISISHeader
	Body   interface{}
}

Oliver Herms's avatar
Oliver Herms committed
// Decode decodes ISIS packets
func Decode(buf *bytes.Buffer) (*ISISPacket, error) {
	pkt := &ISISPacket{}

Oliver Herms's avatar
Oliver Herms committed
	hdr, err := DecodeHeader(buf)
		return nil, fmt.Errorf("Unable to decode header: %v", err)
	}
	pkt.Header = hdr

	switch pkt.Header.PDUType {
	case P2P_HELLO:
Oliver Herms's avatar
Oliver Herms committed
		p2pHello, err := DecodeP2PHello(buf)
			return nil, fmt.Errorf("Unable to decode P2P hello: %v", err)
		}
		pkt.Body = p2pHello
	case L2_LS_PDU_TYPE:
		lspdu, err := DecodeLSPDU(buf)
		if err != nil {
			return nil, fmt.Errorf("Unable to decode LSPDU: %v", err)
		}
		pkt.Body = lspdu
	case L2_CSNP_TYPE:
		csnp, err := DecodeCSNP(buf)
		if err != nil {
			return nil, fmt.Errorf("Unable to decode CSNP: %v", err)
		}
		pkt.Body = csnp
	case L2_PSNP_TYPE:
		psnp, err := DecodePSNP(buf)
		if err != nil {
			return nil, fmt.Errorf("Unable to decode PSNP: %v", err)
		}
		pkt.Body = psnp