def build_of_actions(self,inport,action_list): ### BUILD OF ACTIONS of_actions = [] for actions in action_list: outport = actions['outport'] del actions['outport'] if 'srcmac' in actions: of_actions.append(of.ofp_action_dl_addr.set_src(actions['srcmac'])) if 'dstmac' in actions: of_actions.append(of.ofp_action_dl_addr.set_dst(actions['dstmac'])) if 'srcip' in actions: of_actions.append(of.ofp_action_nw_addr.set_src(actions['srcip'])) if 'dstip' in actions: of_actions.append(of.ofp_action_nw_addr.set_dst(actions['dstip'])) if 'srcport' in actions: of_actions.append(of.ofp_action_tp_port.set_src(actions['srcport'])) if 'dstport' in actions: of_actions.append(of.ofp_action_tp_port.set_dst(actions['dstport'])) if 'vlan_id' in actions: if actions['vlan_id'] is None: of_actions.append(of.ofp_action_strip_vlan()) else: of_actions.append(of.ofp_action_vlan_vid(vlan_vid=actions['vlan_id'])) if 'vlan_pcp' in actions: if actions['vlan_pcp'] is None: if not actions['vlan_id'] is None: raise RuntimeError("vlan_id and vlan_pcp must be set together!") pass else: of_actions.append(of.ofp_action_vlan_pcp(vlan_pcp=actions['vlan_pcp'])) if (not inport is None) and (outport == inport): of_actions.append(of.ofp_action_output(port=of.OFPP_IN_PORT)) else: of_actions.append(of.ofp_action_output(port=outport)) return of_actions
def build_of_actions(self,inport,action_list): ### BUILD OF ACTIONS of_actions = [] for actions in action_list: outport = actions['port'] del actions['port'] if 'srcmac' in actions: of_actions.append(of.ofp_action_dl_addr.set_src(actions['srcmac'])) if 'dstmac' in actions: of_actions.append(of.ofp_action_dl_addr.set_dst(actions['dstmac'])) if 'srcip' in actions: of_actions.append(of.ofp_action_nw_addr.set_src(actions['srcip'])) if 'dstip' in actions: of_actions.append(of.ofp_action_nw_addr.set_dst(actions['dstip'])) if 'srcport' in actions: of_actions.append(of.ofp_action_tp_port.set_src(actions['srcport'])) if 'dstport' in actions: of_actions.append(of.ofp_action_tp_port.set_dst(actions['dstport'])) if 'vlan_id' in actions: if actions['vlan_id'] is None: of_actions.append(of.ofp_action_strip_vlan()) else: of_actions.append(of.ofp_action_vlan_vid(vlan_vid=actions['vlan_id'])) if 'vlan_pcp' in actions: if actions['vlan_pcp'] is None: if not actions['vlan_id'] is None: raise RuntimeError("vlan_id and vlan_pcp must be set together!") pass else: of_actions.append(of.ofp_action_vlan_pcp(vlan_pcp=actions['vlan_pcp'])) if (not inport is None) and (outport == inport): of_actions.append(of.ofp_action_output(port=of.OFPP_IN_PORT)) else: of_actions.append(of.ofp_action_output(port=outport)) return of_actions
def _match_action(self,msg): if len(self.actions) == 1 and self.actions[0] == "" : return for action in self.actions: action_name = action.split('=')[0] if action_name != "STRIP_VLAN": action_argu = action.split('=')[1] if(action_name == "OUTPUT"): msg.actions.append(of.ofp_action_output(port = int(action_argu))) elif(action_name == "ENQUEUE"): port = action_argu.split(':')[0] queue_id = action_argu.split(':')[1] msg.actions.append(of.ofp_action_enqueue(port = int(port) , queue_id = int(queue_id))) elif(action_name == "STRIP_VLAN"): msg.actions.append(of.ofp_action_strip_vlan()) elif(action_name == "SET_VLAN_VID"): msg.actions.append(of.ofp_action_vlan_vid(vlan_vid = int(action_argu))) elif(action_name == "SET_VLAN_PCP"): msg.actions.append(of.ofp_action_vlan_pcp(vlan_pcp = int(action_argu))) elif(action_name == "SET_DL_SRC"): msg.actions.append(of.ofp_action_dl_addr(type = 4 , dl_addr = EthAddr(action_argu))) elif(action_name == "SET_DL_DST"): msg.actions.append(of.ofp_action_dl_addr(type = 5 , dl_addr = EthAddr(action_argu))) elif(action_name == "SET_NW_TOS"): msg.actions.append(of.ofp_action_nw_tos(nw_tos = int(action_argu))) elif(action_name == "SET_NW_SRC"): msg.actions.append(of.ofp_action_nw_addr(type = 6 , nw_addr = IPAddr(action_argu))) elif(action_name == "SET_NW_DST"): msg.actions.append(of.ofp_action_nw_addr(type = 7 , nw_addr = IPAddr(action_argu))) elif(action_name == "SET_TP_SRC"): msg.actions.append(of.ofp_action_tp_port(type = 9 , tp_port = int(action_argu))) elif(action_name == "SET_TP_DST"): msg.actions.append(of.ofp_action_tp_port(type = 10 , tp_port = int(action_argu)))
def _match_action(self,msg): if(self.actions == "OUTPUT"): msg.actions.append(of.ofp_action_output(port = int(self.actions_argu))) elif(self.actions == "enqueue"): port = self.actions_argu.split(':')[0] queue_id = self.actions_argu.split(':')[1] msg.actions.append(of.ofp_action_enqueue(port = int(port) , queue_id = int(queue_id))) elif(self.actions == "strip-vlan"): msg.actions.append(of.ofp_action_strip_vlan()) elif(self.actions == "set-vlan-id"): msg.actions.append(of.ofp_action_vlan_vid(vlan_vid = int(self.actions_argu))) elif(self.actions == "set-vlan-priority"): msg.actions.append(of.ofp_action_vlan_pcp(vlan_pcp = int(self.actions_argu))) elif(self.actions == "SET_DL_SRC"): msg.actions.append(of.ofp_action_dl_addr(type = 4 , dl_addr = EthAddr(self.actions_argu))) elif(self.actions == "SET_DL_DST"): msg.actions.append(of.ofp_action_dl_addr(type = 5 , dl_addr = EthAddr(self.actions_argu))) elif(self.actions == "SET_NW_TOS"): msg.actions.append(of.ofp_action_nw_tos(nw_tos = int(self.actions_argu))) elif(self.actions == "SET_NW_SRC"): msg.actions.append(of.ofp_action_nw_addr(type = 6 , nw_addr = IPAddr(self.actions_argu))) elif(self.actions == "SET_NW_DST"): msg.actions.append(of.ofp_action_nw_addr(type = 7 , nw_addr = IPAddr(self.actions_argu))) elif(self.actions == "SET_TP_SRC"): msg.actions.append(of.ofp_action_tp_port(type = 9 , tp_port = int(self.actions_argu))) elif(self.actions == "SET_TP_DST"): msg.actions.append(of.ofp_action_tp_port(type = 10 , tp_port = int(self.actions_argu)))
def install_flow(self,pred,action_list): switch = pred['switch'] ### BUILD OF MATCH inport = pred['inport'] match = of.ofp_match() match.in_port = pred['inport'] match.dl_src = pred['srcmac'] match.dl_dst = pred['dstmac'] match.dl_type = pred['ethtype'] if 'vlan_id' in pred: match.dl_vlan = pred['vlan_id'] else: match.dl_vlan = 0xffff if 'vlan_pcp' in pred: match.dl_vlan_pcp = pred['vlan_pcp'] else: match.dl_vlan_pcp = 0 match.nw_proto = pred['protocol'] if 'srcip' in pred: match.nw_src = pred['srcip'] if 'dstip' in pred: match.nw_dst = pred['dstip'] if 'tos' in pred: match.nw_tos = pred['tos'] if 'srcport' in pred: match.tp_src = pred['srcport'] if 'dstport' in pred: match.tp_dst = pred['dstport'] ### BUILD OF ACTIONS of_actions = [] for actions in action_list: outport = actions['outport'] del actions['outport'] if 'srcmac' in actions: of_actions.append(of.ofp_action_dl_addr.set_src(actions['srcmac'])) if 'dstmac' in actions: of_actions.append(of.ofp_action_dl_addr.set_dst(actions['dstmac'])) if 'srcip' in actions: of_actions.append(of.ofp_action_nw_addr.set_src(actions['srcip'])) if 'dstip' in actions: of_actions.append(of.ofp_action_nw_addr.set_dst(actions['dstip'])) if 'vlan_id' in actions: if actions['vlan_id'] is None: of_actions.append(of.ofp_action_strip_vlan()) else: of_actions.append(of.ofp_action_vlan_vid(vlan_vid=actions['vlan_id'])) if 'vlan_pcp' in actions: if actions['vlan_pcp'] is None: if not actions['vlan_id'] is None: raise RuntimeError("vlan_id and vlan_pcp must be set together!") pass else: of_actions.append(of.ofp_action_vlan_pcp(vlan_pcp=actions['vlan_pcp'])) if outport == inport: of_actions.append(of.ofp_action_output(port=of.OFPP_IN_PORT)) else: of_actions.append(of.ofp_action_output(port=outport)) msg = of.ofp_flow_mod(command=of.OFPFC_ADD, idle_timeout=of.OFP_FLOW_PERMANENT, hard_timeout=of.OFP_FLOW_PERMANENT, match=match, actions=of_actions) try: self.switches[switch]['connection'].send(msg) except RuntimeError, e: print "ERROR:install_flow: %s to switch %d" % (str(e),switch)
def configureRules(connection, lruleset): """ Configure initial rules """ #print "Ready for configure init rules in SW: " + dpidToStr(connection.dpid) + " " + str(connection.dpid) of_fib = parse_of_file(lruleset) #print of_fib of_list = [] try: of_list = of_fib[dpidToStr(connection.dpid)] except KeyError: print "Oops! There are no for the Sw " + dpidToStr(connection.dpid) #f = open('/tmp/' + dpidToStr(event.dpid), 'wa') #f.write( dpidToStr(event.dpid) + " begin " + str(time.time())) #of_entry = of_list[0] #print of_entry for of_entry in of_list: msg = of.ofp_flow_mod() #print "writing OpenFlow entry:", of_entry #msg.priority = 42 if "dl_type" in of_entry.keys(): msg.match.dl_type = int(of_entry["dl_type"], 16) if "nw_proto" in of_entry.keys(): msg.match.nw_proto = int(of_entry["nw_proto"], 10) #ETH if "dl_src" in of_entry.keys(): msg.match.dl_src = EthAddr(of_entry["dl_src"]) if "dl_dst" in of_entry.keys(): msg.match.dl_dst = EthAddr(of_entry["dl_dst"]) #IP if "nw_src" in of_entry.keys(): msg.match.nw_src = of_entry["nw_src"] #msg.match.nw_src = IPAddr(of_entry["nw_src"]) if "nw_dst" in of_entry.keys(): msg.match.nw_dst = of_entry["nw_dst"] #msg.match.nw_dst = IPAddr(of_entry["nw_dst"]) if "nw_tos" in of_entry.keys(): msg.match.nw_tos = int(of_entry["nw_tos"], 10) #UDP if "tp_dst" in of_entry.keys(): msg.match.tp_dst = int(of_entry["tp_dst"], 10) if "tp_src" in of_entry.keys(): msg.match.tp_src = int(of_entry["tp_src"], 10) #OTHERS if "in_port" in of_entry.keys(): msg.match.in_port = int(of_entry["in_port"], 10) if "dl_vlan" in of_entry.keys(): msg.match.dl_vlan = int(of_entry["dl_vlan"], 10) if "dl_vlan_pcp" in of_entry.keys(): msg.match.dl_vlan_pcp = int(of_entry["dl_vlan_pcp"], 10) #msg.match.tp_dst = 80 # iterate list of actions #output #vlan if "mod_nw_tos" in of_entry["actions"].keys(): msg.actions.append( of.ofp_action_nw_tos( nw_tos=int(of_entry["actions"]["mod_nw_tos"], 10))) if "mod_vlan_vid" in of_entry["actions"].keys(): msg.actions.append( of.ofp_action_vlan_vid( vlan_vid=int(of_entry["actions"]["mod_vlan_vid"], 10))) if "mod_vlan_pcp" in of_entry["actions"].keys(): msg.actions.append( of.ofp_action_vlan_pcp( vlan_pcp=int(of_entry["actions"]["mod_vlan_pcp"], 10))) if "mod_dl_src" in of_entry["actions"].keys(): msg.actions.append( of.ofp_action_dl_addr.set_src( EthAddr(of_entry["actions"]["mod_dl_src"]))) if "mod_dl_dst" in of_entry["actions"].keys(): msg.actions.append( of.ofp_action_dl_addr.set_dst( EthAddr(of_entry["actions"]["mod_dl_dst"]))) if "output" in of_entry["actions"].keys(): msg.actions.append( of.ofp_action_output( port=int(of_entry["actions"]["output"], 10))) #print "set the output port" connection.send(msg) #f.write(" ending " + str(time.time()) + "\n") #f.close() print "Rules configured, allow traffic for " + dpidToStr(connection.dpid)
def _match_action(self, msg): if len(self.actions) == 1 and self.actions[0] == "": return for action in self.actions: action_name = action.split('=')[0] if action_name != "STRIP_VLAN": action_argu = action.split('=')[1] if (action_name == "OUTPUT"): msg.actions.append(of.ofp_action_output(port=int(action_argu))) elif (action_name == "ENQUEUE"): port = action_argu.split(':')[0] queue_id = action_argu.split(':')[1] msg.actions.append( of.ofp_action_enqueue(port=int(port), queue_id=int(queue_id))) elif (action_name == "STRIP_VLAN"): msg.actions.append(of.ofp_action_strip_vlan()) elif (action_name == "SET_VLAN_VID"): msg.actions.append( of.ofp_action_vlan_vid(vlan_vid=int(action_argu))) elif (action_name == "SET_VLAN_PCP"): msg.actions.append( of.ofp_action_vlan_pcp(vlan_pcp=int(action_argu))) elif (action_name == "SET_DL_SRC"): msg.actions.append( of.ofp_action_dl_addr(type=4, dl_addr=EthAddr(action_argu))) elif (action_name == "SET_DL_DST"): msg.actions.append( of.ofp_action_dl_addr(type=5, dl_addr=EthAddr(action_argu))) elif (action_name == "SET_NW_TOS"): msg.actions.append( of.ofp_action_nw_tos(nw_tos=int(action_argu))) elif (action_name == "SET_NW_SRC"): msg.actions.append( of.ofp_action_nw_addr(type=6, nw_addr=IPAddr(action_argu))) elif (action_name == "SET_NW_DST"): msg.actions.append( of.ofp_action_nw_addr(type=7, nw_addr=IPAddr(action_argu))) elif (action_name == "SET_TP_SRC"): msg.actions.append( of.ofp_action_tp_port(type=9, tp_port=int(action_argu))) elif (action_name == "SET_TP_DST"): msg.actions.append( of.ofp_action_tp_port(type=10, tp_port=int(action_argu)))
def install_flow(self, pred, action_list): switch = pred['switch'] ### BUILD OF MATCH inport = pred['inport'] match = of.ofp_match() match.in_port = pred['inport'] match.dl_src = pred['srcmac'] match.dl_dst = pred['dstmac'] match.dl_type = pred['ethtype'] if 'vlan_id' in pred: match.dl_vlan = pred['vlan_id'] else: match.dl_vlan = 0xffff if 'vlan_pcp' in pred: match.dl_vlan_pcp = pred['vlan_pcp'] else: match.dl_vlan_pcp = 0 match.nw_proto = pred['protocol'] if 'srcip' in pred: match.nw_src = pred['srcip'] if 'dstip' in pred: match.nw_dst = pred['dstip'] if 'tos' in pred: match.nw_tos = pred['tos'] if 'srcport' in pred: match.tp_src = pred['srcport'] if 'dstport' in pred: match.tp_dst = pred['dstport'] ### BUILD OF ACTIONS of_actions = [] for actions in action_list: outport = actions['outport'] del actions['outport'] if 'srcmac' in actions: of_actions.append( of.ofp_action_dl_addr.set_src(actions['srcmac'])) if 'dstmac' in actions: of_actions.append( of.ofp_action_dl_addr.set_dst(actions['dstmac'])) if 'srcip' in actions: of_actions.append( of.ofp_action_nw_addr.set_src(actions['srcip'])) if 'dstip' in actions: of_actions.append( of.ofp_action_nw_addr.set_dst(actions['dstip'])) if 'vlan_id' in actions: if actions['vlan_id'] is None: of_actions.append(of.ofp_action_strip_vlan()) else: of_actions.append( of.ofp_action_vlan_vid(vlan_vid=actions['vlan_id'])) if 'vlan_pcp' in actions: if actions['vlan_pcp'] is None: if not actions['vlan_id'] is None: raise RuntimeError( "vlan_id and vlan_pcp must be set together!") pass else: of_actions.append( of.ofp_action_vlan_pcp(vlan_pcp=actions['vlan_pcp'])) if outport == inport: of_actions.append(of.ofp_action_output(port=of.OFPP_IN_PORT)) else: of_actions.append(of.ofp_action_output(port=outport)) msg = of.ofp_flow_mod(command=of.OFPFC_ADD, idle_timeout=of.OFP_FLOW_PERMANENT, hard_timeout=of.OFP_FLOW_PERMANENT, match=match, actions=of_actions) try: self.switches[switch]['connection'].send(msg) except RuntimeError, e: print "ERROR:install_flow: %s to switch %d" % (str(e), switch)
def build_nx_actions(self,inport,action_list,table_id,pipeline): ### BUILD NX ACTIONS of_actions = [] ctlr_outport = False # there is a controller outport action phys_outports = list() # list of physical outports to forward out of possibly_resubmit_next_table = False # should packet be passed on to next table? atleast_one_action = False for actions in action_list: atleast_one_action = True if 'srcmac' in actions: of_actions.append(of.ofp_action_dl_addr.set_src(actions['srcmac'])) if 'dstmac' in actions: of_actions.append(of.ofp_action_dl_addr.set_dst(actions['dstmac'])) if 'srcip' in actions: of_actions.append(of.ofp_action_nw_addr.set_src(actions['srcip'])) if 'dstip' in actions: of_actions.append(of.ofp_action_nw_addr.set_dst(actions['dstip'])) if 'srcport' in actions: of_actions.append(of.ofp_action_tp_port.set_src(actions['srcport'])) if 'dstport' in actions: of_actions.append(of.ofp_action_tp_port.set_dst(actions['dstport'])) if 'vlan_id' in actions: if actions['vlan_id'] is None: of_actions.append(of.ofp_action_strip_vlan()) else: of_actions.append(of.ofp_action_vlan_vid(vlan_vid=actions['vlan_id'])) if 'vlan_pcp' in actions: if actions['vlan_pcp'] is None: if not actions['vlan_id'] is None: raise RuntimeError("vlan_id and vlan_pcp must be set together!") pass else: of_actions.append(of.ofp_action_vlan_pcp(vlan_pcp=actions['vlan_pcp'])) assert 'port' in actions outport = actions['port'] if outport == of.OFPP_CONTROLLER: ctlr_outport = True else: """ There is either a physical output action (i.e., on a non-controller port), or a "send to next table" action.""" possibly_resubmit_next_table = True if outport != CUSTOM_NEXT_TABLE_PORT: phys_outports.append(outport) """ Otherwise there are no physical outports; just a possibility of resubmitting to the next table. Pass. """ """In general, actual packet forwarding may have to wait until the final table in the pipeline. This means we must determine if there is a "next" table that processes the packet from here, or if this is the last one. But first, the easy part. There are exactly three cases where a forwarding table *will* in fact "immediately forward" a packet according to the current rule (and all previous table stages that processed the packet), without waiting for any other further processing: (1) if the packet is dropped by the current rule, (2) if the packet is forwarded to the controller port, or (3) if this is the last stage of the pipeline. In the case of (1) and (2), packet forwarding may happen immediately and only depend on the current rule. But in (3), the forwarding decision must take the current rule as well as previous port changes into account, as follows: (a) if the current rule specifies an output port, forward the packet out of that port. (b) if the current rule does not specify an outport, then forward the packet out of the port using the value stored in the dedicated per-packet port register. If neither of (1)-(3) above is true, then we take the following approach: (a) if there is an outport set by this rule, write that value into the dedicated per-packet register that contains the current port the packet is in. (b) if there is no outport set by this rule, and if this is table id 0, move the value of the inport into the dedicated per-packet port register. This denotes that the packet is currently still on its inport. (c) resubmit the packet to the "next" table (according to the pipeline). """ exists_next_table = table_id in pipeline.edges # Decide first on "immediate forwarding" conditions: immediately_fwd = True if not atleast_one_action: # (1) drop of_actions = [] elif ctlr_outport: # (2) controller of_actions = [] of_actions.append(of.ofp_action_output(port=of.OFPP_CONTROLLER)) elif possibly_resubmit_next_table and (not exists_next_table): # (3) last stage of pipeline if len(phys_outports) > 0: # fwd out of latest assigned ports for p in phys_outports: of_actions.append(of.ofp_action_output(port=p)) else: # fwd out of stored port value of_actions.append(nx.nx_output_reg(reg=nx.NXM_NX_REG2, nbits=16)) elif (not exists_next_table) and (not possibly_resubmit_next_table): raise RuntimeError("Unexpected condition in multi-stage processing") else: # must resubmit packet to subsequent tables for processing immediately_fwd = False if immediately_fwd: return of_actions # Act on packet with knowledge that subsequent tables must process it assert (possibly_resubmit_next_table and exists_next_table and (not immediately_fwd)) next_table = pipeline.edges[table_id] if len(phys_outports) > 0: # move port register to latest assigned port values for p in phys_outports: of_actions.append(nx.nx_reg_load(dst=nx.NXM_NX_REG2, value=p, nbits=16)) of_actions.append(nx.nx_action_resubmit.resubmit_table( table=next_table)) elif table_id == 0: # move the inport value to reg2. of_actions.append(nx.nx_reg_move(src=nx.NXM_OF_IN_PORT, dst=nx.NXM_NX_REG2, nbits=16)) of_actions.append(nx.nx_action_resubmit.resubmit_table( table=next_table)) else: of_actions.append(nx.nx_action_resubmit.resubmit_table( table=next_table)) return of_actions
def configureRules (connection, lruleset): """ Configure initial rules """ #print "Ready for configure init rules in SW: " + dpidToStr(connection.dpid) + " " + str(connection.dpid) of_fib = parse_of_file(lruleset) #print of_fib of_list = [] try: of_list = of_fib[dpidToStr(connection.dpid)] except KeyError: print "Oops! There are no for the Sw " + dpidToStr(connection.dpid) #f = open('/tmp/' + dpidToStr(event.dpid), 'wa') #f.write( dpidToStr(event.dpid) + " begin " + str(time.time())) #of_entry = of_list[0] #print of_entry for of_entry in of_list: msg = of.ofp_flow_mod() #print "writing OpenFlow entry:", of_entry #msg.priority = 42 if "dl_type" in of_entry.keys(): msg.match.dl_type = int(of_entry["dl_type"], 16) if "nw_proto" in of_entry.keys(): msg.match.nw_proto = int(of_entry["nw_proto"], 10) #ETH if "dl_src" in of_entry.keys(): msg.match.dl_src = EthAddr(of_entry["dl_src"]) if "dl_dst" in of_entry.keys(): msg.match.dl_dst = EthAddr(of_entry["dl_dst"]) #IP if "nw_src" in of_entry.keys(): msg.match.nw_src = of_entry["nw_src"] #msg.match.nw_src = IPAddr(of_entry["nw_src"]) if "nw_dst" in of_entry.keys(): msg.match.nw_dst = of_entry["nw_dst"] #msg.match.nw_dst = IPAddr(of_entry["nw_dst"]) if "nw_tos" in of_entry.keys(): msg.match.nw_tos = int(of_entry["nw_tos"],10) #UDP if "tp_dst" in of_entry.keys(): msg.match.tp_dst = int(of_entry["tp_dst"],10) if "tp_src" in of_entry.keys(): msg.match.tp_src = int(of_entry["tp_src"],10) #OTHERS if "in_port" in of_entry.keys(): msg.match.in_port = int(of_entry["in_port"],10) if "dl_vlan" in of_entry.keys(): msg.match.dl_vlan = int(of_entry["dl_vlan"],10) if "dl_vlan_pcp" in of_entry.keys(): msg.match.dl_vlan_pcp = int(of_entry["dl_vlan_pcp"],10) #msg.match.tp_dst = 80 # iterate list of actions #output #vlan if "mod_nw_tos" in of_entry["actions"].keys(): msg.actions.append(of.ofp_action_nw_tos(nw_tos = int(of_entry["actions"]["mod_nw_tos"],10))) if "mod_vlan_vid" in of_entry["actions"].keys(): msg.actions.append(of.ofp_action_vlan_vid(vlan_vid = int(of_entry["actions"]["mod_vlan_vid"],10))) if "mod_vlan_pcp" in of_entry["actions"].keys(): msg.actions.append(of.ofp_action_vlan_pcp(vlan_pcp = int(of_entry["actions"]["mod_vlan_pcp"],10))) if "mod_dl_src" in of_entry["actions"].keys(): msg.actions.append(of.ofp_action_dl_addr.set_src(EthAddr(of_entry["actions"]["mod_dl_src"]))) if "mod_dl_dst" in of_entry["actions"].keys(): msg.actions.append(of.ofp_action_dl_addr.set_dst(EthAddr(of_entry["actions"]["mod_dl_dst"]))) if "output" in of_entry["actions"].keys(): msg.actions.append(of.ofp_action_output(port = int(of_entry["actions"]["output"],10))) #print "set the output port" connection.send(msg) #f.write(" ending " + str(time.time()) + "\n") #f.close() print "Rules configured, allow traffic for " + dpidToStr(connection.dpid)
def _modify_flow(self, command_type): msg = of.ofp_flow_mod() print self.payload if command_type == "MOD_ST": msg.command = of.OFPFC_MODIFY_STRICT elif command_type == "MOD": msg.command = of.OFPFC_MODIFY if self.payload.has_key("wildcards"): msg.match.wildcards = int(self.payload['wildcards']) if self.payload.has_key("dstIP"): msg.match.nw_dst = IPAddr(self.payload['dstIP']) if self.payload.has_key("srcMac"): msg.match.dl_src = EthAddr(self.payload['srcMac']) if self.payload.has_key("srcIP"): msg.match.nw_src = IPAddr(self.payload['srcIP']) if self.payload.has_key("dstMac"): msg.match.dl_dst = EthAddr(self.payload['dstMac']) if self.payload.has_key("hardTimeout"): msg.hard_timeout = int(self.payload['hardTimeout']) if self.payload.has_key("srcPort"): msg.match.tp_src = int(self.payload['srcPort']) if self.payload.has_key("priority"): msg.priority = int(self.payload['priority']) if self.payload.has_key("ingressPort"): msg.match.in_port = int(self.payload['ingressPort']) if self.payload.has_key("vlan"): msg.match.dl_vlan = int(self.payload['vlan']) if self.payload.has_key("ether-type"): msg.match.dl_type = int(self.payload['ether-type']) if self.payload.has_key("duration"): msg.duration_sec = int(self.payload['duration']) if self.payload.has_key("idleTimeout"): msg.idle_timeout = int(self.payload['idleTimeout']) if self.payload.has_key("netProtocol"): msg.match.nw_proto = int(self.payload['netProtocol']) self.dpid = self.payload['switch'].replace(':', '-')[6:] self._parse_actions(self.payload['actions']) for connection in core.openflow._connections.values(): # print dpidToStr(connection.dpid) conn_dpid = str(dpidToStr(connection.dpid)) print conn_dpid if conn_dpid == self.dpid: """match actions""" if (self.actions == "OUTPUT"): msg.actions.append( of.ofp_action_output(port=int(self.actions_argu))) elif (self.actions == "enqueue"): port = self.actions_argu.split(':')[0] queue_id = self.actions_argu.split(':')[1] msg.actions.append( of.ofp_action_enqueue(port=int(port), queue_id=int(queue_id))) elif (self.actions == "strip-vlan"): msg.actions.append(of.ofp_action_strip_vlan()) elif (self.actions == "set-vlan-id"): msg.actions.append( of.ofp_action_vlan_vid( vlan_vid=int(self.actions_argu))) elif (self.actions == "set-vlan-priority"): msg.actions.append( of.ofp_action_vlan_pcp( vlan_pcp=int(self.actions_argu))) elif (self.actions == "SET_DL_SRC"): msg.actions.append( of.ofp_action_dl_addr(type=4, dl_addr=EthAddr( self.actions_argu))) elif (self.actions == "SET_DL_DST"): msg.actions.append( of.ofp_action_dl_addr(type=5, dl_addr=EthAddr( self.actions_argu))) elif (self.actions == "SET_NW_TOS"): msg.actions.append( of.ofp_action_nw_tos(nw_tos=int(self.actions_argu))) elif (self.actions == "SET_NW_SRC"): msg.actions.append( of.ofp_action_nw_addr(type=6, nw_addr=IPAddr( self.actions_argu))) elif (self.actions == "SET_NW_DST"): msg.actions.append( of.ofp_action_nw_addr(type=7, nw_addr=IPAddr( self.actions_argu))) elif (self.actions == "SET_TP_SRC"): msg.actions.append( of.ofp_action_tp_port(type=9, tp_port=int(self.actions_argu))) elif (self.actions == "SET_TP_DST"): msg.actions.append( of.ofp_action_tp_port(type=10, tp_port=int(self.actions_argu))) connection.send(msg)
def _modify_flow(self,command_type): msg = of.ofp_flow_mod() print self.payload if command_type == "MOD_ST": msg.command = of.OFPFC_MODIFY_STRICT elif command_type == "MOD": msg.command = of.OFPFC_MODIFY if self.payload.has_key("wildcards"): msg.match.wildcards = int(self.payload['wildcards']) if self.payload.has_key("dstIP"): msg.match.nw_dst = IPAddr(self.payload['dstIP']) if self.payload.has_key("srcMac"): msg.match.dl_src = EthAddr(self.payload['srcMac']) if self.payload.has_key("srcIP"): msg.match.nw_src = IPAddr(self.payload['srcIP']) if self.payload.has_key("dstMac"): msg.match.dl_dst = EthAddr(self.payload['dstMac']) if self.payload.has_key("hardTimeout"): msg.hard_timeout = int(self.payload['hardTimeout']) if self.payload.has_key("srcPort"): msg.match.tp_src = int(self.payload['srcPort']) if self.payload.has_key("priority"): msg.priority = int(self.payload['priority']) if self.payload.has_key("ingressPort"): msg.match.in_port = int(self.payload['ingressPort']) if self.payload.has_key("vlan"): msg.match.dl_vlan = int(self.payload['vlan']) if self.payload.has_key("ether-type"): msg.match.dl_type = int(self.payload['ether-type']) if self.payload.has_key("duration"): msg.duration_sec = int(self.payload['duration']) if self.payload.has_key("idleTimeout"): msg.idle_timeout = int(self.payload['idleTimeout']) if self.payload.has_key("netProtocol"): msg.match.nw_proto = int(self.payload['netProtocol']) self.dpid = self.payload['switch'].replace(':','-')[6:] self._parse_actions(self.payload['actions']) for connection in core.openflow._connections.values() : # print dpidToStr(connection.dpid) conn_dpid = str(dpidToStr(connection.dpid)) print conn_dpid if conn_dpid == self.dpid: """match actions""" if(self.actions == "OUTPUT"): msg.actions.append(of.ofp_action_output(port = int(self.actions_argu))) elif(self.actions == "enqueue"): port = self.actions_argu.split(':')[0] queue_id = self.actions_argu.split(':')[1] msg.actions.append(of.ofp_action_enqueue(port = int(port) , queue_id = int(queue_id))) elif(self.actions == "strip-vlan"): msg.actions.append(of.ofp_action_strip_vlan()) elif(self.actions == "set-vlan-id"): msg.actions.append(of.ofp_action_vlan_vid(vlan_vid = int(self.actions_argu))) elif(self.actions == "set-vlan-priority"): msg.actions.append(of.ofp_action_vlan_pcp(vlan_pcp = int(self.actions_argu))) elif(self.actions == "SET_DL_SRC"): msg.actions.append(of.ofp_action_dl_addr(type = 4 , dl_addr = EthAddr(self.actions_argu))) elif(self.actions == "SET_DL_DST"): msg.actions.append(of.ofp_action_dl_addr(type = 5 , dl_addr = EthAddr(self.actions_argu))) elif(self.actions == "SET_NW_TOS"): msg.actions.append(of.ofp_action_nw_tos(nw_tos = int(self.actions_argu))) elif(self.actions == "SET_NW_SRC"): msg.actions.append(of.ofp_action_nw_addr(type = 6 , nw_addr = IPAddr(self.actions_argu))) elif(self.actions == "SET_NW_DST"): msg.actions.append(of.ofp_action_nw_addr(type = 7 , nw_addr = IPAddr(self.actions_argu))) elif(self.actions == "SET_TP_SRC"): msg.actions.append(of.ofp_action_tp_port(type = 9 , tp_port = int(self.actions_argu))) elif(self.actions == "SET_TP_DST"): msg.actions.append(of.ofp_action_tp_port(type = 10 , tp_port = int(self.actions_argu))) connection.send(msg)