diff --git a/openflow15/action.go b/openflow15/action.go index 4920e17..733a102 100644 --- a/openflow15/action.go +++ b/openflow15/action.go @@ -378,7 +378,10 @@ func (a *ActionPush) MarshalBinary() (data []byte, err error) { } func (a *ActionPush) UnmarshalBinary(data []byte) error { - a.ActionHeader.UnmarshalBinary(data[:4]) + err := a.ActionHeader.UnmarshalBinary(data[:4]) + if err != nil { + return err + } a.EtherType = binary.BigEndian.Uint16(data[4:]) return nil } @@ -414,8 +417,7 @@ func (a *ActionPopVlan) MarshalBinary() (data []byte, err error) { } func (a *ActionPopVlan) UnmarshalBinary(data []byte) error { - a.ActionHeader.UnmarshalBinary(data[:4]) - return nil + return a.ActionHeader.UnmarshalBinary(data[:4]) } type ActionPopMpls struct { @@ -452,7 +454,10 @@ func (a *ActionPopMpls) MarshalBinary() (data []byte, err error) { } func (a *ActionPopMpls) UnmarshalBinary(data []byte) error { - a.ActionHeader.UnmarshalBinary(data[:4]) + err := a.ActionHeader.UnmarshalBinary(data[:4]) + if err != nil { + return err + } a.EtherType = binary.BigEndian.Uint16(data[4:]) return nil } diff --git a/openflow15/flowmod.go b/openflow15/flowmod.go index b27c499..bc1e7bb 100644 --- a/openflow15/flowmod.go +++ b/openflow15/flowmod.go @@ -130,7 +130,10 @@ func (f *FlowMod) MarshalBinary() (data []byte, err error) { func (f *FlowMod) UnmarshalBinary(data []byte) error { n := 0 - f.Header.UnmarshalBinary(data[n:]) + err := f.Header.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(f.Header.Len()) f.Cookie = binary.BigEndian.Uint64(data[n:]) @@ -158,7 +161,10 @@ func (f *FlowMod) UnmarshalBinary(data []byte) error { f.Importance = binary.BigEndian.Uint16(data[n:]) n += 2 - f.Match.UnmarshalBinary(data[n:]) + err = f.Match.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(f.Match.Len()) for n < int(f.Header.Length) { diff --git a/openflow15/instruction.go b/openflow15/instruction.go index d42b95f..eb24d29 100644 --- a/openflow15/instruction.go +++ b/openflow15/instruction.go @@ -7,6 +7,8 @@ import ( "errors" "antrea.io/libOpenflow/util" + + log "github.com/sirupsen/logrus" ) // ofp_instruction_type 1.5 @@ -70,6 +72,9 @@ func DecodeInstr(data []byte) Instruction { case InstrType_DEPRECATED: case InstrType_STAT_TRIGGER: case InstrType_EXPERIMENTER: + default: + log.Warningf("Unknown Instrheader type: %v", t) + return nil } a.UnmarshalBinary(data) @@ -98,7 +103,10 @@ func (instr *InstrGotoTable) MarshalBinary() (data []byte, err error) { } func (instr *InstrGotoTable) UnmarshalBinary(data []byte) error { - instr.InstrHeader.UnmarshalBinary(data[:4]) + err := instr.InstrHeader.UnmarshalBinary(data[:4]) + if err != nil { + return err + } instr.TableId = data[4] copy(instr.pad, data[5:8]) @@ -145,7 +153,10 @@ func (instr *InstrWriteMetadata) MarshalBinary() (data []byte, err error) { } func (instr *InstrWriteMetadata) UnmarshalBinary(data []byte) error { - instr.InstrHeader.UnmarshalBinary(data[:4]) + err := instr.InstrHeader.UnmarshalBinary(data[:4]) + if err != nil { + return err + } copy(instr.pad, data[4:8]) instr.Metadata = binary.BigEndian.Uint64(data[8:16]) @@ -202,7 +213,10 @@ func (instr *InstrActions) MarshalBinary() (data []byte, err error) { } func (instr *InstrActions) UnmarshalBinary(data []byte) error { - instr.InstrHeader.UnmarshalBinary(data[:4]) + err := instr.InstrHeader.UnmarshalBinary(data[:4]) + if err != nil { + return err + } n := 8 for n < int(instr.Length) { @@ -294,7 +308,11 @@ func (instr *InstrStatTrigger) MarshalBinary() (data []byte, err error) { } func (instr *InstrStatTrigger) UnmarshalBinary(data []byte) error { - instr.InstrHeader.UnmarshalBinary(data[:4]) + var err error + err = instr.InstrHeader.UnmarshalBinary(data[:4]) + if err != nil { + return err + } instr.Flags = binary.BigEndian.Uint32(data[4:8]) instr.Thresholds.UnmarshalBinary(data[8:]) diff --git a/openflow15/match.go b/openflow15/match.go index 52c17e1..fa16865 100644 --- a/openflow15/match.go +++ b/openflow15/match.go @@ -4,9 +4,10 @@ import ( "encoding/binary" "errors" "fmt" - "log" "net" + log "github.com/sirupsen/logrus" + "antrea.io/libOpenflow/util" ) @@ -607,6 +608,9 @@ func DecodeMatchField(class uint16, field uint8, length uint8, hasMask bool, dat val = new(TcpFlagsField) case OXM_FIELD_ACTSET_OUTPUT: val = new(ActsetOutputField) + default: + log.Errorf("Unhandled Field: %d in Packet Register Class: %d", field, class) + return nil, fmt.Errorf("Bad pkt class: %v field: %v", class, field) } err := val.UnmarshalBinary(data) if err != nil { diff --git a/openflow15/meter.go b/openflow15/meter.go index 947a7f3..9ec3d20 100644 --- a/openflow15/meter.go +++ b/openflow15/meter.go @@ -4,6 +4,7 @@ package openflow15 import ( "encoding/binary" + "fmt" log "github.com/sirupsen/logrus" @@ -124,7 +125,10 @@ func (m *MeterBandDrop) MarshalBinary() (data []byte, err error) { func (m *MeterBandDrop) UnmarshalBinary(data []byte) error { n := 0 - m.MeterBandHeader.UnmarshalBinary(data[n:]) + err := m.MeterBandHeader.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(m.MeterBandHeader.Len()) return nil @@ -279,7 +283,10 @@ func (m *MeterMod) MarshalBinary() (data []byte, err error) { func (m *MeterMod) UnmarshalBinary(data []byte) error { n := 0 - m.Header.UnmarshalBinary(data[n:]) + err := m.Header.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(m.Header.Len()) m.Command = binary.BigEndian.Uint16(data[n:]) @@ -291,7 +298,10 @@ func (m *MeterMod) UnmarshalBinary(data []byte) error { for n < int(m.Header.Length) { mbh := new(MeterBandHeader) - mbh.UnmarshalBinary(data[n:]) + err = mbh.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(mbh.Len()) switch mbh.Type { case MBT_DROP: @@ -308,6 +318,9 @@ func (m *MeterMod) UnmarshalBinary(data []byte) error { mbExp.MeterBandHeader = *mbh mbExp.Experimenter = binary.BigEndian.Uint32(data[n:]) m.MeterBands = append(m.MeterBands, mbExp) + default: + log.Warningf("Unknown MeterBandHeader type : %v", mbh.Type) + return fmt.Errorf("Unknown MeterBandHeader type : %v", mbh.Type) } n += 4 } diff --git a/openflow15/multipart.go b/openflow15/multipart.go index f5e9bac..509dc10 100644 --- a/openflow15/multipart.go +++ b/openflow15/multipart.go @@ -129,6 +129,9 @@ func (s *MultipartRequest) UnmarshalBinary(data []byte) error { // The request body is ofp_bundle_features_request. req = new(BundleFeaturesRequest) case MultipartType_Experimenter: + default: + err = fmt.Errorf("Received unknown multipart type: %v", s.Type); + return err } if req != nil { @@ -279,6 +282,9 @@ func (s *MultipartReply) UnmarshalBinary(data []byte) error { repl = NewBundleFeatures() case MultipartType_Experimenter: break + default: + err = fmt.Errorf("Received unknown multipart type: %v", s.Type); + return err } err = repl.UnmarshalBinary(data[n:]) @@ -568,6 +574,9 @@ func (s *FlowStatsRequest) UnmarshalBinary(data []byte) error { n += 8 err := s.Match.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(s.Match.Len()) return err @@ -728,7 +737,10 @@ func (s *AggregateStatsRequest) UnmarshalBinary(data []byte) error { s.CookieMask = binary.BigEndian.Uint64(data[n:]) n += 8 - s.Match.UnmarshalBinary(data[n:]) + err := s.Match.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(s.Match.Len()) return nil } @@ -2025,6 +2037,8 @@ func (f *TableFeatures) UnmarshalBinary(data []byte) error { fallthrough case TFPT_EXPERIMENTER_MISS: p = new(TableExperimenterProperty) + default: + return fmt.Errorf("Unknown TFPT %v", t) } err := p.UnmarshalBinary(data[n:]) if err != nil { @@ -2759,6 +2773,7 @@ func (m *MeterDesc) UnmarshalBinary(data []byte) (err error) { case MBT_EXPERIMENTER: p = new(MeterBandExperimenter) default: + return fmt.Errorf("unknown MBT: %v", binary.BigEndian.Uint16(data[n:])) } err = p.UnmarshalBinary(data[n:]) if err != nil { diff --git a/openflow15/nx_action.go b/openflow15/nx_action.go index fb5a877..d76a4d3 100644 --- a/openflow15/nx_action.go +++ b/openflow15/nx_action.go @@ -3,7 +3,10 @@ package openflow15 import ( "encoding/binary" "errors" + "fmt" "net" + + log "github.com/sirupsen/logrus" ) // NX Action constants @@ -176,6 +179,8 @@ func DecodeNxAction(data []byte) Action { case NXAST_RAW_ENCAP: case NXAST_RAW_DECAP: case NXAST_DEC_NSH_TTL: + default: + log.Warningf("unknown NXActionHeader subtype: %v", data) } return a } @@ -225,6 +230,9 @@ func (a *NXActionConjunction) UnmarshalBinary(data []byte) error { n := 0 a.NXActionHeader = new(NXActionHeader) err := a.NXActionHeader.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(a.NXActionHeader.Len()) if len(data) < int(a.Len()) { return errors.New("the []byte is too short to unmarshal a full NXActionConjunction message") @@ -290,6 +298,9 @@ func (a *NXActionConnTrack) UnmarshalBinary(data []byte) error { n := 0 a.NXActionHeader = new(NXActionHeader) err := a.NXActionHeader.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(a.NXActionHeader.Len()) if len(data) < int(a.Len()) { return errors.New("the []byte is too short to unmarshal a full NXActionConnTrack message") @@ -544,6 +555,9 @@ func (a *NXActionResubmit) UnmarshalBinary(data []byte) error { n := 0 a.NXActionHeader = new(NXActionHeader) err := a.NXActionHeader.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(a.NXActionHeader.Len()) if len(data) < int(a.Len()) { return errors.New("the []byte is too short to unmarshal a full NXActionConjunction message") @@ -619,6 +633,9 @@ func (a *NXActionResubmitTable) UnmarshalBinary(data []byte) error { n := 0 a.NXActionHeader = new(NXActionHeader) err := a.NXActionHeader.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(a.NXActionHeader.Len()) if len(data) < int(a.Len()) { return errors.New("the []byte is too short to unmarshal a full NXActionResubmitTable message") @@ -792,6 +809,9 @@ func (a *NXActionCTNAT) UnmarshalBinary(data []byte) error { n := 0 a.NXActionHeader = new(NXActionHeader) err := a.NXActionHeader.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(a.NXActionHeader.Len()) if len(data) < int(a.Len()) { return errors.New("the []byte is too short to unmarshal a full NXActionCTNAT message") @@ -942,6 +962,9 @@ func (a *NXActionDecTTL) UnmarshalBinary(data []byte) error { n := 0 a.NXActionHeader = new(NXActionHeader) err := a.NXActionHeader.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(a.NXActionHeader.Len()) if len(data) < int(a.Len()) { return errors.New("the []byte is too short to unmarshal a full NXActionDecTTL message") @@ -995,6 +1018,9 @@ func (a *NXActionDecTTLCntIDs) UnmarshalBinary(data []byte) error { n := 0 a.NXActionHeader = new(NXActionHeader) err := a.NXActionHeader.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n += int(a.NXActionHeader.Len()) if len(data) < int(a.Len()) { return errors.New("the []byte is too short to unmarshal a full NXActionDecTTLCntIDs message") @@ -1807,6 +1833,9 @@ func DecodeController2Prop(data []byte) (Property, error) { p = new(NXActionController2PropPause) case NXAC2PT_METER_ID: p = new(NXActionController2PropMeterId) + default: + err := fmt.Errorf("Unknown DecodeController2Prop type %v", data) + return nil, err } err := p.UnmarshalBinary(data) if err != nil { diff --git a/openflow15/nxext_test.go b/openflow15/nxext_test.go index 0fdc877..8f54eef 100644 --- a/openflow15/nxext_test.go +++ b/openflow15/nxext_test.go @@ -343,7 +343,7 @@ func TestNXActionLearn(t *testing.T) { if err != nil { t.Fatalf("Failed to UnMarshal message: %v", err) } - if err = nsLearnEquals(oriAction, newAction); err != nil { + if err = nxLearnEquals(oriAction, newAction); err != nil { t.Error(err) } } @@ -676,7 +676,7 @@ func prepareLearnSpecs() []*NXLearnSpec { } } -func nsLearnEquals(oriAction, newAction *NXActionLearn) error { +func nxLearnEquals(oriAction, newAction *NXActionLearn) error { if oriAction.IdleTimeout != newAction.IdleTimeout { return errors.New("learn idleTimeout not equal") } diff --git a/openflow15/nxt_message.go b/openflow15/nxt_message.go index 7e94705..8b214cf 100644 --- a/openflow15/nxt_message.go +++ b/openflow15/nxt_message.go @@ -3,6 +3,7 @@ package openflow15 import ( "encoding/binary" "errors" + "fmt" "antrea.io/libOpenflow/protocol" "antrea.io/libOpenflow/util" @@ -743,6 +744,9 @@ func DecodeContinuationProp(data []byte) (Property, error) { p = new(ContinuationPropActionSet) case NXCPT_ODP_PORT: p = new(ContinuationPropOdpPort) + default: + err := fmt.Errorf("Unknown DecodeContinuationProp type %v", data) + return nil, err } err := p.UnmarshalBinary(data) if err != nil { @@ -1213,6 +1217,9 @@ func DecodePacketIn2Prop(data []byte) (Property, error) { p = new(PacketIn2PropUserdata) case NXPINT_CONTINUATION: p = new(PacketIn2PropContinuation) + default: + err := fmt.Errorf("Unknown PacketIn2Prop type %v", data) + return nil, err } err := p.UnmarshalBinary(data) if err != nil { @@ -1255,7 +1262,7 @@ func (p *PacketIn2) UnmarshalBinary(data []byte) error { for n < len(data) { prop, err := DecodePacketIn2Prop(data[n:]) if err != nil { - break + return err } p.Props = append(p.Props, prop) n += int(prop.Len()) @@ -1306,7 +1313,7 @@ func (p *Resume) UnmarshalBinary(data []byte) error { for n < len(data) { prop, err := DecodePacketIn2Prop(data[n:]) if err != nil { - break + return err } p.Props = append(p.Props, prop) n += int(prop.Len()) @@ -1338,6 +1345,9 @@ func decodeVendorData(experimenterType uint32, data []byte) (msg util.Message, e msg = new(BundleAdd) case Type_PacketIn2: msg = new(PacketIn2) + default: + err = fmt.Errorf("Unknown experimenterType %v", experimenterType) + return nil, err } err = msg.UnmarshalBinary(data) if err != nil { diff --git a/openflow15/openflow15.go b/openflow15/openflow15.go index 0f597fd..ebbd16c 100644 --- a/openflow15/openflow15.go +++ b/openflow15/openflow15.go @@ -913,6 +913,9 @@ func (s *SwitchFeatures) UnmarshalBinary(data []byte) error { n := 0 err = s.Header.UnmarshalBinary(data[n:]) + if err != nil { + return err + } n = int(s.Header.Len()) copy(s.DPID, data[n:]) n += len(s.DPID) @@ -988,7 +991,10 @@ func (v *VendorHeader) UnmarshalBinary(data []byte) error { return errors.New("The []byte the wrong size to unmarshal an " + "VendorHeader message.") } - v.Header.UnmarshalBinary(data) + err := v.Header.UnmarshalBinary(data) + if err != nil { + return err + } n := int(v.Header.Len()) v.Vendor = binary.BigEndian.Uint32(data[n:]) n += 4 @@ -1269,7 +1275,10 @@ func (p *AsyncConfigPropReasons) MarshalBinary() (data []byte, err error) { } func (p *AsyncConfigPropReasons) UnmarshalBinary(data []byte) (err error) { - p.Header.UnmarshalBinary(data) + err = p.Header.UnmarshalBinary(data) + if err != nil { + return + } n := p.Header.Len() p.Mask = binary.BigEndian.Uint32(data[n:]) @@ -1314,7 +1323,10 @@ func (p *AsyncConfigPropExperimenter) MarshalBinary() (data []byte, err error) { } func (p *AsyncConfigPropExperimenter) UnmarshalBinary(data []byte) (err error) { - p.Header.UnmarshalBinary(data) + err = p.Header.UnmarshalBinary(data) + if err != nil { + return + } n := p.Header.Len() p.Experimenter = binary.BigEndian.Uint32(data[n:]) @@ -1510,7 +1522,10 @@ func (p *PropExperimenter) MarshalBinary() (data []byte, err error) { } func (p *PropExperimenter) UnmarshalBinary(data []byte) (err error) { - p.Header.UnmarshalBinary(data) + err = p.Header.UnmarshalBinary(data) + if err != nil { + return + } n := p.Header.Len() p.Experimenter = binary.BigEndian.Uint32(data[n:]) diff --git a/openflow15/port.go b/openflow15/port.go index 623c818..bba0d70 100644 --- a/openflow15/port.go +++ b/openflow15/port.go @@ -475,6 +475,9 @@ func (p *PortMod) MarshalBinary() (data []byte, err error) { func (p *PortMod) UnmarshalBinary(data []byte) (err error) { err = p.Header.UnmarshalBinary(data) + if err != nil { + return + } n := p.Header.Len() p.PortNo = binary.BigEndian.Uint32(data[n:])