package goloxi import "fmt" const ( VERSION_1_0 = 1 VERSION_1_1 = 2 VERSION_1_2 = 3 VERSION_1_3 = 4 VERSION_1_4 = 5 VERSION_1_5 = 6 ) const ( OFPTHello = 0 OFPTError = 1 OFPTEchoRequest = 2 OFPTEchoReply = 3 OFPTExperimenter = 4 ) type Serializable interface { Serialize(encoder *Encoder) error } type Deserializable interface { Decode(decoder *Decoder) error } type Header struct { Version uint8 Type uint8 Length uint16 Xid uint32 } type Message interface { Serializable GetVersion() uint8 GetLength() uint16 MessageType() uint8 MessageName() string GetXid() uint32 SetXid(xid uint32) } type Uint128 struct { Hi uint64 Lo uint64 } type IOxm interface { Serializable GetOXMName() string GetOXMValue() interface{} } type IOxmMasked interface { Serializable GetOXMName() string GetOXMValue() interface{} GetOXMValueMask() interface{} } type IOxmId interface { Serializable GetOXMName() string } type IAction interface { Serializable GetType() uint16 GetLen() uint16 GetActionName() string GetActionFields() map[string]interface{} } func (self *Header) Decode(decoder *Decoder) (err error) { if decoder.Length() < 8 { return fmt.Errorf("Header packet too short: %d < 4", decoder.Length()) } defer func() { if r := recover(); r != nil { var ok bool err, ok = r.(error) if !ok { err = fmt.Errorf("Error while parsing OpenFlow packet: %+v", r) } } }() self.Version = decoder.ReadByte() self.Type = decoder.ReadByte() self.Length = decoder.ReadUint16() self.Xid = decoder.ReadUint32() return nil }