def backflow_rules(outport): return [ of.ofp_flow_mod(match=of.ofp_match(in_port=_i, dl_type=ethernet.IP_TYPE, nw_tos=out_tos(outport)), actions=[ of.ofp_action_nw_tos(nw_tos=0), of.ofp_action_output(port=_o) ], priority=of.OFP_DEFAULT_PRIORITY - _p) for _i, _o, _p in [(outport, of.OFPP_IN_PORT, 0), (None, outport, 1)] ]
def eviction_rule(evport, dlport): return of.ofp_flow_mod( match=of.ofp_match( in_port=evport, dl_type=ethernet.IP_TYPE, nw_tos=0, ), actions=[ of.ofp_action_nw_tos(nw_tos=in_tos(evport)), of.ofp_action_output( port=of.OFPP_IN_PORT if evport == dlport else dlport) ], priority=of.OFP_DEFAULT_PRIORITY - 1)
def rewrite_msg(msg, export): assert msg.header_type in {of.OFPT_FLOW_MOD, of.OFPT_PACKET_OUT} if msg.header_type == of.OFPT_FLOW_MOD: assert msg.match.in_port is not None msg.match.nw_tos = in_tos(msg.match.in_port) msg.match.in_port = export if msg.header_type == of.OFPT_PACKET_OUT: msg.in_port = export oacts = [action for action in msg.actions if action.type == of.OFPAT_OUTPUT] assert len(oacts) == 1 msg.actions.insert(0, of.ofp_action_nw_tos(nw_tos=out_tos(oacts[0].port))) oacts[0].port = of.OFPP_IN_PORT
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 sendToSwitchByNodeNumber(sw, fr, to, src, dst, pri, tp, ToS): src_ip = "10.0.0." + src dst_ip = "10.0.0." + dst in_port = getPort(sw, fr, 1) out_port = getPort(sw, to) sw_no = int(sw) - gl.hostNum # ip udp msg_udp = of.ofp_flow_mod() msg_udp.priority = pri # 数字越大, 优先级越高 msg_udp.match.dl_type = 0x0800 msg_udp.match.nw_proto = pkt.ipv4.UDP_PROTOCOL msg_udp.match.nw_src = src_ip msg_udp.match.nw_dst = dst_ip msg_udp.match.in_port = in_port msg_udp.match.nw_tos = tp if int(sw) <= 45 and int(sw) >= 41: print(sw, " modifies ToS.") msg_udp.actions.append(of.ofp_action_nw_tos(nw_tos=ToS)) # msg_udp.actions.append(of.ofp_action_vendor_generic(body = " SFP is %s " % ToS)) msg_udp.actions.append(of.ofp_action_output(port=out_port)) print("Sending rules to switch s%s..." % sw_no) core.openflow.connections[sw_no].send(msg_udp)
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 configureRules (self, event, lruleset): """ Configure initial rules """ print "Ready for configure init rules in SW: " + dpidToStr(event.dpid) + " " + str(event.dpid) of_fib = parse_of_file(lruleset) #print of_fib of_list = [] try: of_list = of_fib[dpidToStr(event.dpid)] except KeyError: print "Oops! There is no information about the Sw " + dpidToStr(event.dpid) + " in the configuration file" #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 = IPAddr(of_entry["nw_src"]) if "nw_dst" in of_entry.keys(): 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"],16) if "vlan_tci" in of_entry.keys(): msg.match.vlan_tci = int(of_entry["vlan_tci"],16) #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"],16))) 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(): print "mod_dl_dst: %s " % of_entry["actions"]["mod_dl_dst"] 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" self.connection.send(msg) #f.write(" ending " + str(time.time()) + "\n") #f.close() print "Init rules configured, allow traffic for " + dpidToStr(event.dpid)
def _handle_PacketIn (self, event): dpid = event.connection.dpid inport = event.port packet = event.parsed if not packet.parsed: log.warning("%i %i ignoring unparsed packet", dpid, inport) return if dpid not in self.ip_mac_port: self.ip_mac_port[dpid] = {} for fake in self.fakeways: self.ip_mac_port[dpid][IPAddr(fake)] = Entry(of.OFPP_NONE, dpid_to_mac(dpid)) if packet.type == ethernet.LLDP_TYPE: return if isinstance(packet.next, ipv4): log.debug("%i %i IP %s => %s", dpid,inport, packet.next.srcip,packet.next.dstip) self._send_lost_buffers(dpid, packet.next.srcip, packet.src, inport) if packet.next.srcip in self.ip_mac_port[dpid]: if self.ip_mac_port[dpid][packet.next.srcip] != (inport, packet.src): log.debug("%i %i RE-learned %s", dpid,inport,packet.next.srcip) else: #log.info("%i %i learned %s", dpid,inport,str(packet.next.srcip)) log.info("switch %i learned %s from input port %i", dpid,str(packet.next.srcip),inport) self.ip_mac_port[dpid][packet.next.srcip] = Entry(inport, packet.src) dstaddr = packet.next.dstip if dstaddr in self.ip_mac_port[dpid]: prt = self.ip_mac_port[dpid][dstaddr].port mac = self.ip_mac_port[dpid][dstaddr].mac print dstaddr if prt == inport: log.warning("%i %i not sending packet for %s back out of the " + "input port" % (dpid, inport, str(dstaddr))) else: log.debug("%i %i installing flow for %s => %s out port %i" % (dpid, inport, packet.next.srcip, dstaddr, prt)) if event.ofp.buffer_id==None: bid = None else: bid = event.ofp.buffer_id ip_packet=packet.find("ipv4") if ip_packet!=None: if ip_packet.protocol==1: actions3 = [] actions3.append(of.ofp_action_dl_addr.set_dst(mac)) #actions3.append(of.ofp_action_output(port = prt)) actions3.append(of.ofp_action_enqueue(port = prt,queue_id=1)) match3 = of.ofp_match.from_packet(packet, inport) match3.dl_type=0x800 match3.nw_proto = 1 match3.dl_src = None msg3 = of.ofp_flow_mod(command=of.OFPFC_ADD, idle_timeout=FLOW_IDLE_TIMEOUT, hard_timeout=of.OFP_FLOW_PERMANENT, buffer_id=bid, actions=actions3, priority=30, match=match3) event.connection.send(msg3.pack()) print "into queue 1" elif ip_packet.protocol==17 or ip_packet.protocol==6: udp_packet=packet.find("udp") if udp_packet==None: udp_packet=packet.find("tcp") if ip_packet.dstip==IPAddr("172.16.0.3") and udp_packet.dstport==5001: actions5 = [] actions5.append(of.ofp_action_dl_addr.set_dst(mac)) #actions5.append(of.ofp_action_output(port = prt)) actions5.append(of.ofp_action_enqueue(port = prt,queue_id=3)) match5 = of.ofp_match.from_packet(packet, inport) match5.dl_type=0x800 match5.nw_proto = 17 match5.nw_dst = IPAddr("172.16.0.3") match5.tp_dst = 5001 match5.dl_src = None msg5 = of.ofp_flow_mod(command=of.OFPFC_ADD, idle_timeout=FLOW_IDLE_TIMEOUT, hard_timeout=of.OFP_FLOW_PERMANENT, buffer_id=bid, actions=actions5, priority=43, match=match5) event.connection.send(msg5.pack()) print "privillaged user into queue 3" elif ip_packet.tos==0: actions2 = [] actions2.append(of.ofp_action_dl_addr.set_dst(mac)) #actions2.append(of.ofp_action_output(port = prt)) actions2.append(of.ofp_action_nw_tos(224)) actions2.append(of.ofp_action_enqueue(port = prt,queue_id=2)) match2 = of.ofp_match.from_packet(packet, inport) match2.dl_type=0x800 if udp_packet!=None: match2.nw_proto = 17 else: match2.nw_proto = 6 match2.dl_src = None msg2 = of.ofp_flow_mod(command=of.OFPFC_ADD, idle_timeout=FLOW_IDLE_TIMEOUT, hard_timeout=of.OFP_FLOW_PERMANENT, buffer_id=bid, actions=actions2, priority=42, match=match2) event.connection.send(msg2.pack()) print "into queue 2" else: actions1 = [] actions1.append(of.ofp_action_dl_addr.set_dst(mac)) #actions1.append(of.ofp_action_output(port = prt)) actions1.append(of.ofp_action_enqueue(port = prt,queue_id=2)) match1 = of.ofp_match.from_packet(packet, inport) match1.dl_type=0x800 match1.nw_tos = 224 match1.dl_src = None msg1 = of.ofp_flow_mod(command=of.OFPFC_ADD, idle_timeout=FLOW_IDLE_TIMEOUT, hard_timeout=of.OFP_FLOW_PERMANENT, buffer_id=bid, actions=actions1, priority=42, match=match1) event.connection.send(msg1.pack()) print "into queue 2 dscp tagged" else: actions = [] actions.append(of.ofp_action_dl_addr.set_dst(mac)) actions.append(of.ofp_action_output(port = prt)) match4 = of.ofp_match.from_packet(packet, inport) match4.dl_src = None # Wildcard source MAC msg = of.ofp_flow_mod(command=of.OFPFC_ADD, idle_timeout=FLOW_IDLE_TIMEOUT, hard_timeout=of.OFP_FLOW_PERMANENT, buffer_id=bid, actions=actions, priority=20, match=match4) event.connection.send(msg.pack()) elif self.arp_for_unknowns: if (dpid,dstaddr) not in self.lost_buffers: self.lost_buffers[(dpid,dstaddr)] = [] bucket = self.lost_buffers[(dpid,dstaddr)] entry = (time.time() + MAX_BUFFER_TIME,event.ofp.buffer_id,inport) bucket.append(entry) while len(bucket) > MAX_BUFFERED_PER_IP: del bucket[0] self.outstanding_arps = {k:v for k,v in self.outstanding_arps.iteritems() if v > time.time()} if (dpid,dstaddr) in self.outstanding_arps: return self.outstanding_arps[(dpid,dstaddr)] = time.time() + 4 r = arp() r.hwtype = r.HW_TYPE_ETHERNET r.prototype = r.PROTO_TYPE_IP r.hwlen = 6 r.protolen = r.protolen r.opcode = r.REQUEST r.hwdst = ETHER_BROADCAST r.protodst = dstaddr r.hwsrc = packet.src r.protosrc = packet.next.srcip e = ethernet(type=ethernet.ARP_TYPE, src=packet.src, dst=ETHER_BROADCAST) e.set_payload(r) log.debug("%i %i ARPing for %s on behalf of %s" % (dpid, inport, str(r.protodst), str(r.protosrc))) msg = of.ofp_packet_out() msg.data = e.pack() msg.actions.append(of.ofp_action_output(port = of.OFPP_FLOOD)) msg.in_port = inport event.connection.send(msg) elif isinstance(packet.next, arp): a = packet.next log.debug("%i %i ARP %s %s => %s", dpid, inport, {arp.REQUEST:"request",arp.REPLY:"reply"}.get(a.opcode, 'op:%i' % (a.opcode,)), str(a.protosrc), str(a.protodst)) if a.prototype == arp.PROTO_TYPE_IP: if a.hwtype == arp.HW_TYPE_ETHERNET: if a.protosrc != 0: # Learn or update port/MAC info if a.protosrc in self.ip_mac_port[dpid]: if self.ip_mac_port[dpid][a.protosrc] != (inport, packet.src): log.debug("%i %i RE-learned %s", dpid,inport,str(a.protosrc)) else: log.info("switch %i learned %s from input port %i", dpid,str(a.protosrc),inport) self.ip_mac_port[dpid][a.protosrc] = Entry(inport, packet.src) # Send any waiting packets... self._send_lost_buffers(dpid, a.protosrc, packet.src, inport) if a.opcode == arp.REQUEST: # Maybe we can answer if a.protodst in self.ip_mac_port[dpid]: # We have an answer... if not self.ip_mac_port[dpid][a.protodst].isExpired(): # .. and it's relatively current, so we'll reply ourselves r = arp() r.hwtype = a.hwtype r.prototype = a.prototype r.hwlen = a.hwlen r.protolen = a.protolen r.opcode = arp.REPLY r.hwdst = a.hwsrc r.protodst = a.protosrc r.protosrc = a.protodst r.hwsrc = self.ip_mac_port[dpid][a.protodst].mac e = ethernet(type=packet.type, src=dpid_to_mac(dpid), dst=a.hwsrc) e.set_payload(r) #log.debug("%i %i answering ARP for %s" % (dpid, inport,str(r.protosrc))) msg = of.ofp_packet_out() msg.data = e.pack() msg.actions.append(of.ofp_action_output(port = of.OFPP_IN_PORT)) msg.in_port = inport event.connection.send(msg) return # Didn't know how to answer or otherwise handle this ARP, so just flood it log.debug("%i %i flooding ARP %s %s => %s" % (dpid, inport, {arp.REQUEST:"request",arp.REPLY:"reply"}.get(a.opcode,'op:%i' % (a.opcode,)), str(a.protosrc), str(a.protodst))) msg = of.ofp_packet_out(in_port = inport, data = event.ofp, action = of.ofp_action_output(port = of.OFPP_FLOOD)) event.connection.send(msg)
def _handle_PacketIn(self, event): dpid = event.connection.dpid inport = event.port packet = event.parsed if not packet.parsed: log.warning("%i %i ignoring unparsed packet", dpid, inport) return if dpid not in self.ip_mac_port: self.ip_mac_port[dpid] = {} for fake in self.fakeways: self.ip_mac_port[dpid][IPAddr(fake)] = Entry( of.OFPP_NONE, dpid_to_mac(dpid)) if packet.type == ethernet.LLDP_TYPE: return if isinstance(packet.next, ipv4): log.debug("%i %i IP %s => %s", dpid, inport, packet.next.srcip, packet.next.dstip) self._send_lost_buffers(dpid, packet.next.srcip, packet.src, inport) if packet.next.srcip in self.ip_mac_port[dpid]: if self.ip_mac_port[dpid][packet.next.srcip] != (inport, packet.src): log.debug("%i %i RE-learned %s", dpid, inport, packet.next.srcip) else: #log.info("%i %i learned %s", dpid,inport,str(packet.next.srcip)) log.info("switch %i learned %s from input port %i", dpid, str(packet.next.srcip), inport) self.ip_mac_port[dpid][packet.next.srcip] = Entry( inport, packet.src) dstaddr = packet.next.dstip if dstaddr in self.ip_mac_port[dpid]: prt = self.ip_mac_port[dpid][dstaddr].port mac = self.ip_mac_port[dpid][dstaddr].mac print dstaddr if prt == inport: log.warning( "%i %i not sending packet for %s back out of the " + "input port" % (dpid, inport, str(dstaddr))) else: log.debug( "%i %i installing flow for %s => %s out port %i" % (dpid, inport, packet.next.srcip, dstaddr, prt)) if event.ofp.buffer_id == None: bid = None else: bid = event.ofp.buffer_id ip_packet = packet.find("ipv4") if ip_packet != None: if ip_packet.protocol == 1: actions3 = [] actions3.append(of.ofp_action_dl_addr.set_dst(mac)) #actions3.append(of.ofp_action_output(port = prt)) actions3.append( of.ofp_action_enqueue(port=prt, queue_id=1)) match3 = of.ofp_match.from_packet(packet, inport) match3.dl_type = 0x800 match3.nw_proto = 1 match3.dl_src = None msg3 = of.ofp_flow_mod( command=of.OFPFC_ADD, idle_timeout=FLOW_IDLE_TIMEOUT, hard_timeout=of.OFP_FLOW_PERMANENT, buffer_id=bid, actions=actions3, priority=30, match=match3) event.connection.send(msg3.pack()) print "into queue 1" elif ip_packet.protocol == 17 or ip_packet.protocol == 6: udp_packet = packet.find("udp") if udp_packet == None: udp_packet = packet.find("tcp") if ip_packet.dstip == IPAddr( "172.16.0.3" ) and udp_packet.dstport == 5001: actions5 = [] actions5.append( of.ofp_action_dl_addr.set_dst(mac)) #actions5.append(of.ofp_action_output(port = prt)) actions5.append( of.ofp_action_enqueue(port=prt, queue_id=3)) match5 = of.ofp_match.from_packet( packet, inport) match5.dl_type = 0x800 match5.nw_proto = 17 match5.nw_dst = IPAddr("172.16.0.3") match5.tp_dst = 5001 match5.dl_src = None msg5 = of.ofp_flow_mod( command=of.OFPFC_ADD, idle_timeout=FLOW_IDLE_TIMEOUT, hard_timeout=of.OFP_FLOW_PERMANENT, buffer_id=bid, actions=actions5, priority=43, match=match5) event.connection.send(msg5.pack()) print "privillaged user into queue 3" elif ip_packet.tos == 0: actions2 = [] actions2.append( of.ofp_action_dl_addr.set_dst(mac)) #actions2.append(of.ofp_action_output(port = prt)) actions2.append(of.ofp_action_nw_tos(224)) actions2.append( of.ofp_action_enqueue(port=prt, queue_id=2)) match2 = of.ofp_match.from_packet( packet, inport) match2.dl_type = 0x800 if udp_packet != None: match2.nw_proto = 17 else: match2.nw_proto = 6 match2.dl_src = None msg2 = of.ofp_flow_mod( command=of.OFPFC_ADD, idle_timeout=FLOW_IDLE_TIMEOUT, hard_timeout=of.OFP_FLOW_PERMANENT, buffer_id=bid, actions=actions2, priority=42, match=match2) event.connection.send(msg2.pack()) print "into queue 2" else: actions1 = [] actions1.append( of.ofp_action_dl_addr.set_dst(mac)) #actions1.append(of.ofp_action_output(port = prt)) actions1.append( of.ofp_action_enqueue(port=prt, queue_id=2)) match1 = of.ofp_match.from_packet( packet, inport) match1.dl_type = 0x800 match1.nw_tos = 224 match1.dl_src = None msg1 = of.ofp_flow_mod( command=of.OFPFC_ADD, idle_timeout=FLOW_IDLE_TIMEOUT, hard_timeout=of.OFP_FLOW_PERMANENT, buffer_id=bid, actions=actions1, priority=42, match=match1) event.connection.send(msg1.pack()) print "into queue 2 dscp tagged" else: actions = [] actions.append(of.ofp_action_dl_addr.set_dst(mac)) actions.append(of.ofp_action_output(port=prt)) match4 = of.ofp_match.from_packet(packet, inport) match4.dl_src = None # Wildcard source MAC msg = of.ofp_flow_mod( command=of.OFPFC_ADD, idle_timeout=FLOW_IDLE_TIMEOUT, hard_timeout=of.OFP_FLOW_PERMANENT, buffer_id=bid, actions=actions, priority=20, match=match4) event.connection.send(msg.pack()) elif self.arp_for_unknowns: if (dpid, dstaddr) not in self.lost_buffers: self.lost_buffers[(dpid, dstaddr)] = [] bucket = self.lost_buffers[(dpid, dstaddr)] entry = (time.time() + MAX_BUFFER_TIME, event.ofp.buffer_id, inport) bucket.append(entry) while len(bucket) > MAX_BUFFERED_PER_IP: del bucket[0] self.outstanding_arps = { k: v for k, v in self.outstanding_arps.iteritems() if v > time.time() } if (dpid, dstaddr) in self.outstanding_arps: return self.outstanding_arps[(dpid, dstaddr)] = time.time() + 4 r = arp() r.hwtype = r.HW_TYPE_ETHERNET r.prototype = r.PROTO_TYPE_IP r.hwlen = 6 r.protolen = r.protolen r.opcode = r.REQUEST r.hwdst = ETHER_BROADCAST r.protodst = dstaddr r.hwsrc = packet.src r.protosrc = packet.next.srcip e = ethernet(type=ethernet.ARP_TYPE, src=packet.src, dst=ETHER_BROADCAST) e.set_payload(r) log.debug("%i %i ARPing for %s on behalf of %s" % (dpid, inport, str(r.protodst), str(r.protosrc))) msg = of.ofp_packet_out() msg.data = e.pack() msg.actions.append(of.ofp_action_output(port=of.OFPP_FLOOD)) msg.in_port = inport event.connection.send(msg) elif isinstance(packet.next, arp): a = packet.next log.debug("%i %i ARP %s %s => %s", dpid, inport, { arp.REQUEST: "request", arp.REPLY: "reply" }.get(a.opcode, 'op:%i' % (a.opcode, )), str(a.protosrc), str(a.protodst)) if a.prototype == arp.PROTO_TYPE_IP: if a.hwtype == arp.HW_TYPE_ETHERNET: if a.protosrc != 0: # Learn or update port/MAC info if a.protosrc in self.ip_mac_port[dpid]: if self.ip_mac_port[dpid][a.protosrc] != ( inport, packet.src): log.debug("%i %i RE-learned %s", dpid, inport, str(a.protosrc)) else: log.info("switch %i learned %s from input port %i", dpid, str(a.protosrc), inport) self.ip_mac_port[dpid][a.protosrc] = Entry( inport, packet.src) # Send any waiting packets... self._send_lost_buffers(dpid, a.protosrc, packet.src, inport) if a.opcode == arp.REQUEST: # Maybe we can answer if a.protodst in self.ip_mac_port[dpid]: # We have an answer... if not self.ip_mac_port[dpid][ a.protodst].isExpired(): # .. and it's relatively current, so we'll reply ourselves r = arp() r.hwtype = a.hwtype r.prototype = a.prototype r.hwlen = a.hwlen r.protolen = a.protolen r.opcode = arp.REPLY r.hwdst = a.hwsrc r.protodst = a.protosrc r.protosrc = a.protodst r.hwsrc = self.ip_mac_port[dpid][ a.protodst].mac e = ethernet(type=packet.type, src=dpid_to_mac(dpid), dst=a.hwsrc) e.set_payload(r) #log.debug("%i %i answering ARP for %s" % (dpid, inport,str(r.protosrc))) msg = of.ofp_packet_out() msg.data = e.pack() msg.actions.append( of.ofp_action_output( port=of.OFPP_IN_PORT)) msg.in_port = inport event.connection.send(msg) return # Didn't know how to answer or otherwise handle this ARP, so just flood it log.debug("%i %i flooding ARP %s %s => %s" % (dpid, inport, { arp.REQUEST: "request", arp.REPLY: "reply" }.get(a.opcode, 'op:%i' % (a.opcode, )), str(a.protosrc), str(a.protodst))) msg = of.ofp_packet_out( in_port=inport, data=event.ofp, action=of.ofp_action_output(port=of.OFPP_FLOOD)) event.connection.send(msg)
def moly_set_entries(self): if self.connection.dpid == 1: # Set ARP forwarding self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_ARP, actions=[of.ofp_action_output(port=4)]) self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_ARP, actions=[of.ofp_action_output(port=1)]) # Set ICMP forwarding self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_ICMP, actions=[of.ofp_action_output(port=4)]) self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_ICMP, actions=[of.ofp_action_output(port=1)]) # Set TCP/UDP forwarding # h1 to DPI self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_TCP, actions=[ of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=2) ]) self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_UDP, actions=[ of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=2) ]) # h2 to DPI self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_TCP, actions=[ of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=2) ]) self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_UDP, actions=[ of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=2) ]) # DPI to MBOX self.send_flow_mod(in_port=2, dl_type=ETHERTYPE_IPV4, actions=[of.ofp_action_output(port=3)]) # MBOX to h2 self.send_flow_mod(in_port=3, dl_type=ETHERTYPE_IPV4, nw_tos=DSCP_IMM_1, actions=[ of.ofp_action_nw_tos(nw_tos=DSCP_BEST_EFF), of.ofp_action_output(port=4) ]) # MBOX to h1 self.send_flow_mod(in_port=3, dl_type=ETHERTYPE_IPV4, nw_tos=DSCP_IMM_2, actions=[ of.ofp_action_nw_tos(nw_tos=DSCP_BEST_EFF), of.ofp_action_output(port=1) ]) elif self.connection.dpid == 2: # Forward everything self.send_flow_mod(in_port=1, actions=[of.ofp_action_output(port=2)]) self.send_flow_mod(in_port=2, actions=[of.ofp_action_output(port=1)]) log.debug('MoLy setup completed')
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)
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 moly_set_entries(self): if self.connection.dpid == 1: # Set ARP forwarding self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_ARP, actions=[of.ofp_action_output(port=4)]) self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_ARP, actions=[of.ofp_action_output(port=1)]) # Set ICMP forwarding self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_ICMP, actions=[of.ofp_action_output(port=4)]) self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_ICMP, actions=[of.ofp_action_output(port=1)]) # Set TCP/UDP forwarding # h1 to DPI self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_TCP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=2)]) self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_UDP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=2)]) # h2 to DPI self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_TCP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=2)]) self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_UDP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=2)]) # DPI to MBOX self.send_flow_mod(in_port=2, dl_type=ETHERTYPE_IPV4, actions=[of.ofp_action_output(port=3)]) # MBOX to h2 self.send_flow_mod(in_port=3, dl_type=ETHERTYPE_IPV4, nw_tos=DSCP_IMM_1, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_BEST_EFF), of.ofp_action_output(port=4)]) # MBOX to h1 self.send_flow_mod(in_port=3, dl_type=ETHERTYPE_IPV4, nw_tos=DSCP_IMM_2, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_BEST_EFF), of.ofp_action_output(port=1)]) elif self.connection.dpid == 2: # Forward everything self.send_flow_mod(in_port=1, actions=[of.ofp_action_output(port=2)]) self.send_flow_mod(in_port=2, actions=[of.ofp_action_output(port=1)]) log.debug('MoLy setup completed')
def moly_set_entries(self): if self.connection.dpid == 1: # Set ARP forwarding self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_ARP, actions=[of.ofp_action_output(port=4)]) self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_ARP, actions=[of.ofp_action_output(port=1)]) # Set ICMP forwarding self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_ICMP, actions=[of.ofp_action_output(port=4)]) self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_ICMP, actions=[of.ofp_action_output(port=1)]) # Set TCP/UDP forwarding # h1 to DPI self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_TCP, actions=[ of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=2) ]) self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_UDP, actions=[ of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=2) ]) # h2 to DPI self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_TCP, actions=[ of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=2) ]) self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_UDP, actions=[ of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=2) ]) ####### TWO DPI INSTANCES ####### ## h1 to DPI1 (src IP = 10.0.0.1) #self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.1'), nw_proto=IPPROTO_TCP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=2)]) #self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.1'), nw_proto=IPPROTO_UDP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=2)]) ## h1 to DPI2 (src IP = 10.0.0.2) #self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.2'), nw_proto=IPPROTO_TCP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=6)]) #self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.2'), nw_proto=IPPROTO_UDP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=6)]) ## h2 to DPI1 (src IP = 10.0.0.1) #self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.1'), nw_proto=IPPROTO_TCP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=2)]) #self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.1'), nw_proto=IPPROTO_UDP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=2)]) ## h2 to DPI2 (src IP = 10.0.0.2) #self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.2'), nw_proto=IPPROTO_TCP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=6)]) #self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.2'), nw_proto=IPPROTO_UDP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=6)]) # DPI1 to MBOX1 self.send_flow_mod(in_port=2, dl_type=ETHERTYPE_IPV4, actions=[of.ofp_action_output(port=3)]) # DPI2 to MBOX1 self.send_flow_mod(in_port=6, dl_type=ETHERTYPE_IPV4, actions=[of.ofp_action_output(port=3)]) # MBOX1 to MBOX2 self.send_flow_mod(in_port=3, dl_type=ETHERTYPE_IPV4, actions=[of.ofp_action_output(port=5)]) # MBOX2 to h2 self.send_flow_mod(in_port=5, dl_type=ETHERTYPE_IPV4, nw_tos=DSCP_IMM_1, actions=[ of.ofp_action_nw_tos(nw_tos=DSCP_BEST_EFF), of.ofp_action_output(port=4) ]) # MBOX2 to h1 self.send_flow_mod(in_port=5, dl_type=ETHERTYPE_IPV4, nw_tos=DSCP_IMM_2, actions=[ of.ofp_action_nw_tos(nw_tos=DSCP_BEST_EFF), of.ofp_action_output(port=1) ]) elif self.connection.dpid == 2: # Forward everything self.send_flow_mod(in_port=1, actions=[of.ofp_action_output(port=2)]) self.send_flow_mod(in_port=2, actions=[of.ofp_action_output(port=1)]) log.debug('MoLy setup completed')
def moly_set_entries(self): if self.connection.dpid == 1: # Set ARP forwarding self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_ARP, actions=[of.ofp_action_output(port=4)]) self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_ARP, actions=[of.ofp_action_output(port=1)]) # Set ICMP forwarding self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_ICMP, actions=[of.ofp_action_output(port=4)]) self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_ICMP, actions=[of.ofp_action_output(port=1)]) # Set TCP/UDP forwarding # h1 to DPI self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_TCP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=2)]) self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_UDP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=2)]) # h2 to DPI self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_TCP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=2)]) self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_proto=IPPROTO_UDP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=2)]) ####### TWO DPI INSTANCES ####### ## h1 to DPI1 (src IP = 10.0.0.1) #self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.1'), nw_proto=IPPROTO_TCP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=2)]) #self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.1'), nw_proto=IPPROTO_UDP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=2)]) ## h1 to DPI2 (src IP = 10.0.0.2) #self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.2'), nw_proto=IPPROTO_TCP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=6)]) #self.send_flow_mod(in_port=1, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.2'), nw_proto=IPPROTO_UDP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_1), of.ofp_action_output(port=6)]) ## h2 to DPI1 (src IP = 10.0.0.1) #self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.1'), nw_proto=IPPROTO_TCP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=2)]) #self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.1'), nw_proto=IPPROTO_UDP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=2)]) ## h2 to DPI2 (src IP = 10.0.0.2) #self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.2'), nw_proto=IPPROTO_TCP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=6)]) #self.send_flow_mod(in_port=4, dl_type=ETHERTYPE_IPV4, nw_src=IPAddr('10.0.0.2'), nw_proto=IPPROTO_UDP, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_IMM_2), of.ofp_action_output(port=6)]) # DPI1 to MBOX1 self.send_flow_mod(in_port=2, dl_type=ETHERTYPE_IPV4, actions=[of.ofp_action_output(port=3)]) # DPI2 to MBOX1 self.send_flow_mod(in_port=6, dl_type=ETHERTYPE_IPV4, actions=[of.ofp_action_output(port=3)]) # MBOX1 to MBOX2 self.send_flow_mod(in_port=3, dl_type=ETHERTYPE_IPV4, actions=[of.ofp_action_output(port=5)]) # MBOX2 to h2 self.send_flow_mod(in_port=5, dl_type=ETHERTYPE_IPV4, nw_tos=DSCP_IMM_1, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_BEST_EFF), of.ofp_action_output(port=4)]) # MBOX2 to h1 self.send_flow_mod(in_port=5, dl_type=ETHERTYPE_IPV4, nw_tos=DSCP_IMM_2, actions=[of.ofp_action_nw_tos(nw_tos=DSCP_BEST_EFF), of.ofp_action_output(port=1)]) elif self.connection.dpid == 2: # Forward everything self.send_flow_mod(in_port=1, actions=[of.ofp_action_output(port=2)]) self.send_flow_mod(in_port=2, actions=[of.ofp_action_output(port=1)]) log.debug('MoLy setup completed')