예제 #1
0
func (self flowTableFeature) exportProps() []byte {
	var props []byte

	instExport := func(pType uint16, keys []instructionKey) {
		if keys == nil {
			return
		}
		var ids []byte
		for _, key := range keys {
			switch k := key.(type) {
			case uint16:
				ids = append(ids, ofp4.MakeInstruction(k)...)
			case uint32:
				ids = append(ids, ofp4.MakeInstructionExperimenter(k)...)
			default:
				panic("unexpected instruction key type")
			}
		}
		props = append(props, ofp4.MakeTableFeaturePropInstructions(pType, ids)...)
	}
	instExport(ofp4.OFPTFPT_INSTRUCTIONS, self.hit.inst)
	instExport(ofp4.OFPTFPT_INSTRUCTIONS_MISS, self.miss.inst)

	oxmExport := func(pType uint16, keys []oxmId) {
		if keys == nil {
			return
		}
		var ids []byte
		for _, key := range keys {
			switch k := key.(type) {
			case uint32:
				ids = append(ids, ofp4.MakeOxm(k)...)
			case [2]uint32:
				ids = append(ids, ofp4.MakeOxmExperimenterHeader(k)...)
			default:
				panic("unknown oxm key")
			}
		}
		props = append(props, ofp4.MakeTableFeaturePropOxm(pType, ids)...)
	}
	oxmExport(ofp4.OFPTFPT_MATCH, self.match)
	oxmExport(ofp4.OFPTFPT_WILDCARDS, self.wildcards)
	oxmExport(ofp4.OFPTFPT_WRITE_SETFIELD, self.hit.writeSetfield)
	oxmExport(ofp4.OFPTFPT_WRITE_SETFIELD_MISS, self.miss.writeSetfield)
	oxmExport(ofp4.OFPTFPT_APPLY_SETFIELD, self.hit.applySetfield)
	oxmExport(ofp4.OFPTFPT_APPLY_SETFIELD_MISS, self.miss.applySetfield)

	nextExport := func(pType uint16, keys []uint8) {
		if keys == nil {
			return
		}
		props = append(props, ofp4.MakeTableFeaturePropNextTables(pType, keys)...)
	}
	nextExport(ofp4.OFPTFPT_NEXT_TABLES, self.hit.next)
	nextExport(ofp4.OFPTFPT_NEXT_TABLES_MISS, self.miss.next)

	actionExport := func(pType uint16, keys []actionKey) {
		if keys == nil {
			return
		}
		var ids []byte
		for _, key := range keys {
			switch k := key.(type) {
			case uint16:
				ids = append(ids, ofp4.MakeActionHeader(k)...)
			case uint32:
				ids = append(ids, ofp4.MakeActionExperimenterHeader(k)...)
			default:
				panic("unexpected action key type")
			}
		}
		props = append(props, ofp4.MakeTableFeaturePropActions(pType, ids)...)
	}
	actionExport(ofp4.OFPTFPT_WRITE_ACTIONS, self.hit.writeActions)
	actionExport(ofp4.OFPTFPT_WRITE_ACTIONS_MISS, self.miss.writeActions)
	actionExport(ofp4.OFPTFPT_APPLY_ACTIONS, self.hit.applyActions)
	actionExport(ofp4.OFPTFPT_APPLY_ACTIONS_MISS, self.miss.applyActions)

	experimenterExport := func(pType uint16, exps []experimenterProp) {
		for _, exp := range exps {
			props = append(props, ofp4.MakeTableFeaturePropExperimenter(pType, exp.Experimenter, exp.ExpType, exp.Data)...)
		}
	}
	experimenterExport(ofp4.OFPTFPT_EXPERIMENTER, self.hit.experimenter)
	experimenterExport(ofp4.OFPTFPT_EXPERIMENTER_MISS, self.miss.experimenter)

	return props
}
예제 #2
0
파일: action.go 프로젝트: hkwi/gopenflow
func (self actionExperimenter) MarshalBinary() ([]byte, error) {
	return ofp4.ActionExperimenterHeader(ofp4.MakeActionExperimenterHeader(self.Experimenter)).AppendData(self.Data), nil
}