// instruction set for output element func (self *Flood) GetFlowInstr() openflow13.Instruction { // If there are no ports in the flood entry, return if !self.isInstalled { return nil } groupInstr := openflow13.NewInstrApplyActions() groupAct := openflow13.NewActionGroup(self.GroupId) groupInstr.AddAction(groupAct, false) return groupInstr }
// instruction set for output element func (self *Output) GetFlowInstr() openflow13.Instruction { outputInstr := openflow13.NewInstrApplyActions() switch self.outputType { case "drop": return nil case "toController": outputAct := openflow13.NewActionOutput(openflow13.P_CONTROLLER) // Dont buffer the packets being sent to controller outputAct.MaxLen = openflow13.OFPCML_NO_BUFFER outputInstr.AddAction(outputAct, false) case "port": outputAct := openflow13.NewActionOutput(self.portNo) outputInstr.AddAction(outputAct, false) } return outputInstr }
// Install all flow actions func (self *Flow) installFlowActions(flowMod *openflow13.FlowMod, instr openflow13.Instruction) error { var actInstr openflow13.Instruction var addActn bool = false // Create a apply_action instruction to be used if its not already created switch instr.(type) { case *openflow13.InstrActions: actInstr = instr default: actInstr = openflow13.NewInstrApplyActions() } // Loop thru all actions for _, flowAction := range self.flowActions { switch flowAction.actionType { case "setVlan": // Push Vlan Tag action pushVlanAction := openflow13.NewActionPushVlan(0x8100) // Set Outer vlan tag field vlanField := openflow13.NewVlanIdField(flowAction.vlanId) setVlanAction := openflow13.NewActionSetField(*vlanField) // Prepend push vlan & setvlan actions to existing instruction actInstr.AddAction(setVlanAction, true) actInstr.AddAction(pushVlanAction, true) addActn = true log.Debugf("flow install. Added pushvlan action: %+v, setVlan actions: %+v", pushVlanAction, setVlanAction) case "popVlan": // Create pop vln action popVlan := openflow13.NewActionPopVlan() // Add it to instruction actInstr.AddAction(popVlan, true) addActn = true log.Debugf("flow install. Added popVlan action: %+v", popVlan) case "setMacDa": // Set Outer MacDA field macDaField := openflow13.NewEthDstField(flowAction.macAddr, nil) setMacDaAction := openflow13.NewActionSetField(*macDaField) // Add set macDa action to the instruction actInstr.AddAction(setMacDaAction, true) addActn = true log.Debugf("flow install. Added setMacDa action: %+v", setMacDaAction) case "setMacSa": // Set Outer MacSA field macSaField := openflow13.NewEthSrcField(flowAction.macAddr, nil) setMacSaAction := openflow13.NewActionSetField(*macSaField) // Add set macDa action to the instruction actInstr.AddAction(setMacSaAction, true) addActn = true log.Debugf("flow install. Added setMacSa Action: %+v", setMacSaAction) case "setTunnelId": // Set tunnelId field tunnelIdField := openflow13.NewTunnelIdField(flowAction.tunnelId) setTunnelAction := openflow13.NewActionSetField(*tunnelIdField) // Add set tunnel action to the instruction actInstr.AddAction(setTunnelAction, true) addActn = true log.Debugf("flow install. Added setTunnelId Action: %+v", setTunnelAction) case "setMetadata": // Set Metadata instruction metadataInstr := openflow13.NewInstrWriteMetadata(flowAction.metadata, flowAction.metadataMask) // Add the instruction to flowmod flowMod.AddInstruction(metadataInstr) default: log.Fatalf("Unknown action type %s", flowAction.actionType) } } // Add the instruction to flow if its not already added if (addActn) && (actInstr != instr) { // Add the instrction to flowmod flowMod.AddInstruction(actInstr) } return nil }
// Install all flow actions func (self *Flow) installFlowActions(flowMod *openflow13.FlowMod, instr openflow13.Instruction) error { var actInstr openflow13.Instruction var addActn bool = false // Create a apply_action instruction to be used if its not already created switch instr.(type) { case *openflow13.InstrActions: actInstr = instr default: actInstr = openflow13.NewInstrApplyActions() } // Loop thru all actions for _, flowAction := range self.flowActions { switch flowAction.actionType { case "pushMpls": //SRTE // Push mpls Tag action pushMplsAction := openflow13.NewActionPushMpls(0x8847) // Set Outer mpls label field mplsLabelField := openflow13.NewMplsLabelField(flowAction.mplsLabel) setMplsAction := openflow13.NewActionSetField(*mplsLabelField) // Prepend push mpls & setlabel actions to existing instruction actInstr.AddAction(setMplsAction, true) actInstr.AddAction(pushMplsAction, true) addActn = true log.Debugf("flow install. Added mpls action: %+v, setMpls actions: %+v", pushMplsAction, setMplsAction) case "popVlanPushMpls": //SRTE // Push mpls Tag action pushMplsAction := openflow13.NewActionPushMpls(0x8847) // Set Outer mpls label field mplsLabelField := openflow13.NewMplsLabelField(flowAction.mplsLabel) setMplsAction := openflow13.NewActionSetField(*mplsLabelField) // Prepend push mpls & setlabel actions to existing instruction actInstr.AddAction(setMplsAction, true) actInstr.AddAction(pushMplsAction, true) // Create pop vlan action popVlan := openflow13.NewActionPopVlan() // Add it to instruction actInstr.AddAction(popVlan, true) addActn = true log.Debugf("flow install. Added pop vlan action: %+v, and Added mpls action: %+v, setMpls actions: %+v", popVlan, pushMplsAction, setMplsAction) case "popMplsPushVlan": //SRTE // Push Vlan Tag action pushVlanAction := openflow13.NewActionPushVlan(0x8100) // Set Outer vlan tag field vlanField := openflow13.NewVlanIdField(flowAction.vlanId, nil) setVlanAction := openflow13.NewActionSetField(*vlanField) // Prepend push vlan & setvlan actions to existing instruction actInstr.AddAction(setVlanAction, true) actInstr.AddAction(pushVlanAction, true) //popmpls action popMplsAction := openflow13.NewActionPopMpls(0x0800) actInstr.AddAction(popMplsAction, true) addActn = true log.Debugf("flow install. Added pop mpls action: %+v, and Added push vlan action: %+v, setVlan actions: %+v", popMplsAction, setVlanAction, vlanField) case "swapMpls": //SRTE - Test this // Set Outer mpls label field mplsLabelField := openflow13.NewMplsLabelField(flowAction.mplsLabel) setMplsAction := openflow13.NewActionSetField(*mplsLabelField) // Prepend push mpls & setlabel actions to existing instruction actInstr.AddAction(setMplsAction, true) addActn = true log.Debugf("flow install. Added swap mpls - setMpls actions: %+v", setMplsAction) case "popMpls": //SRTE // Pop mpls Tag action popMplsAction := openflow13.NewActionPopMpls(0x0800) actInstr.AddAction(popMplsAction, true) addActn = true log.Debugf("flow install. Pop mpls action: %+v", popMplsAction) case "setVlan": // Push Vlan Tag action pushVlanAction := openflow13.NewActionPushVlan(0x8100) // Set Outer vlan tag field vlanField := openflow13.NewVlanIdField(flowAction.vlanId, nil) setVlanAction := openflow13.NewActionSetField(*vlanField) // Prepend push vlan & setvlan actions to existing instruction actInstr.AddAction(setVlanAction, true) actInstr.AddAction(pushVlanAction, true) addActn = true log.Debugf("flow install. Added pushvlan action: %+v, setVlan actions: %+v", pushVlanAction, setVlanAction) case "popVlan": // Create pop vln action popVlan := openflow13.NewActionPopVlan() // Add it to instruction actInstr.AddAction(popVlan, true) addActn = true log.Debugf("flow install. Added popVlan action: %+v", popVlan) case "setMacDa": // Set Outer MacDA field macDaField := openflow13.NewEthDstField(flowAction.macAddr, nil) setMacDaAction := openflow13.NewActionSetField(*macDaField) // Add set macDa action to the instruction actInstr.AddAction(setMacDaAction, true) addActn = true log.Debugf("flow install. Added setMacDa action: %+v", setMacDaAction) case "setMacSa": // Set Outer MacSA field macSaField := openflow13.NewEthSrcField(flowAction.macAddr, nil) setMacSaAction := openflow13.NewActionSetField(*macSaField) // Add set macDa action to the instruction actInstr.AddAction(setMacSaAction, true) addActn = true log.Debugf("flow install. Added setMacSa Action: %+v", setMacSaAction) case "setTunnelId": // Set tunnelId field tunnelIdField := openflow13.NewTunnelIdField(flowAction.tunnelId) setTunnelAction := openflow13.NewActionSetField(*tunnelIdField) // Add set tunnel action to the instruction actInstr.AddAction(setTunnelAction, true) addActn = true log.Debugf("flow install. Added setTunnelId Action: %+v", setTunnelAction) case "setMetadata": // Set Metadata instruction metadataInstr := openflow13.NewInstrWriteMetadata(flowAction.metadata, flowAction.metadataMask) // Add the instruction to flowmod flowMod.AddInstruction(metadataInstr) case "setIPSa": // Set IP src ipSaField := openflow13.NewIpv4SrcField(flowAction.ipAddr, nil) setIPSaAction := openflow13.NewActionSetField(*ipSaField) // Add set action to the instruction actInstr.AddAction(setIPSaAction, true) addActn = true log.Debugf("flow install. Added setIPSa Action: %+v", setIPSaAction) case "setIPDa": // Set IP dst ipDaField := openflow13.NewIpv4DstField(flowAction.ipAddr, nil) setIPDaAction := openflow13.NewActionSetField(*ipDaField) // Add set action to the instruction actInstr.AddAction(setIPDaAction, true) addActn = true log.Debugf("flow install. Added setIPDa Action: %+v", setIPDaAction) case "setTCPSrc": // Set TCP src tcpSrcField := openflow13.NewTcpSrcField(flowAction.l4Port) setTCPSrcAction := openflow13.NewActionSetField(*tcpSrcField) // Add set action to the instruction actInstr.AddAction(setTCPSrcAction, true) addActn = true log.Debugf("flow install. Added setTCPSrc Action: %+v", setTCPSrcAction) case "setTCPDst": // Set TCP dst tcpDstField := openflow13.NewTcpDstField(flowAction.l4Port) setTCPDstAction := openflow13.NewActionSetField(*tcpDstField) // Add set action to the instruction actInstr.AddAction(setTCPDstAction, true) addActn = true log.Debugf("flow install. Added setTCPDst Action: %+v", setTCPDstAction) case "setUDPSrc": // Set UDP src udpSrcField := openflow13.NewUdpSrcField(flowAction.l4Port) setUDPSrcAction := openflow13.NewActionSetField(*udpSrcField) // Add set action to the instruction actInstr.AddAction(setUDPSrcAction, true) addActn = true log.Debugf("flow install. Added setUDPSrc Action: %+v", setUDPSrcAction) case "setUDPDst": // Set UDP dst udpDstField := openflow13.NewUdpDstField(flowAction.l4Port) setUDPDstAction := openflow13.NewActionSetField(*udpDstField) // Add set action to the instruction actInstr.AddAction(setUDPDstAction, true) addActn = true log.Debugf("flow install. Added setUDPDst Action: %+v", setUDPDstAction) default: log.Fatalf("Unknown action type %s", flowAction.actionType) } } // Add the instruction to flow if its not already added if (addActn) && (actInstr != instr) { // Add the instrction to flowmod flowMod.AddInstruction(actInstr) } return nil }