Exemple #1
0
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)]
    ]
Exemple #2
0
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)
Exemple #3
0
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
Exemple #4
0
  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)))
Exemple #5
0
  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)))
Exemple #6
0
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)
Exemple #7
0
    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)))
Exemple #8
0
  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)
Exemple #10
0
    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)
Exemple #11
0
    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')
Exemple #12
0
    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)
Exemple #13
0
  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)
Exemple #14
0
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)
Exemple #15
0
    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')