Exemple #1
0
    def _packet_in_handler(self, ev):
        msg = ev.msg
        datapath = msg.datapath
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser
        dpid = datapath.id
        in_port = msg.match['in_port']
        self.mac_to_port.setdefault(dpid, {})
        self.ip_to_port.setdefault(dpid, {})
        flow_exists = 0

        pkt = packet.Packet(msg.data)

        #Ignore LLDP as it is used by the topology discovery module
        eth = pkt.get_protocols(ethernet.ethernet)[0]
        if eth.ethertype == ether.ETH_TYPE_LLDP:
            return

        header_list = dict((p.protocol_name, p) 
                for p in pkt.protocols if type(p) != str)

        if ARP in header_list:
            src_ip = header_list[ARP].src_ip
            self.ip_to_port[dpid][src_ip] = in_port
            dst = eth.dst
            src = eth.src
            self.mac_to_port[dpid][src] = in_port
            if dst in self.mac_to_port[dpid]:
                out_port = self.mac_to_port[dpid][dst]
            else:
                out_port = ofproto.OFPP_FLOOD
    
            actions = [parser.OFPActionOutput(out_port)]
    
            data = None
            if msg.buffer_id == ofproto.OFP_NO_BUFFER:
                data = msg.data
    
            out = parser.OFPPacketOut(datapath=datapath, 
                                      buffer_id=msg.buffer_id,
                                  in_port=in_port, actions=actions, data=data)
            datapath.send_msg(out)
    
        elif IPV4 in header_list:
            drop_flag = False
            dst = eth.dst
            src = eth.src
            proto = "any"
            sport  = "any"
            dport  = "any"
            src_ip = header_list[IPV4].src
            dst_ip = header_list[IPV4].dst
            self.ip_to_port[dpid][src_ip] = in_port
            if TCP in header_list:
                proto="tcp"
                sport = header_list[TCP].src_port
                dport = header_list[TCP].dst_port
            if UDP in header_list:
                proto="udp"
                sport = header_list[UDP].src_port
                dport = header_list[UDP].dst_port
            if ICMP in header_list:
                proto="icmp"

            if dst_ip in self.ip_to_port[dpid]:
                out_port = self.ip_to_port[dpid][dst_ip]
            else:
                out_port = ofproto.OFPP_FLOOD
    
            # Check if this packet hits any light probe rule and take
            # necessary action
            #print ("%d : %d : %s : %s : %s : %s : %s" % (in_port, out_port,
            #    proto, src_ip, sport, dst_ip, dport))
            result = self.datapaths[datapath.id].fsm.inspect_packets(datapath, 
                    in_port, out_port,
                    proto=proto, src_ip=src_ip, src_port=sport, dst_ip=dst_ip,
                    dst_port=dport, pkt_data=pkt)
            sport = "any"
            dport = "any"
            if (result != None):
                if "drop" in result:
                    drop_flag = True
                    actions = ""
                else:
                    actions = [parser.OFPActionOutput(out_port)]
    
            if drop_flag == False:
                actions = [parser.OFPActionOutput(out_port)]
    
                if (out_port != ofproto.OFPP_FLOOD):
                    reinstate_flag = False
                    if self.datapaths[datapath.id].flows.getflow(datapath, 
                            src_ip, dst_ip, proto, sport, dport) == None:
                        self.datapaths[datapath.id].send_ip_flow(
                            ofproto.OFPFC_ADD, in_port, out_port,
                            proto=proto, src_ip=src_ip, src_port=sport, 
                            dst_ip=dst_ip, dst_port=dport, drop=drop_flag)
                        if result != None:
                            matches_rule = True
                            if "reinstate" in result:
                                reinstate_flag = True
                        else:
                            matches_rule = False
                        self.datapaths[datapath.id].flows.addflow(datapath, 
                                proto, src_ip, "any", dst_ip, 
                                "any", out_port=out_port, 
                                matches_rule=matches_rule,
                                reinstate=reinstate_flag)
                    else:
                        flow_exists = 1
    
                #Now deal with the incoming packet if there is no flow
                if flow_exists == 0:
                    data = None
                    if msg.buffer_id == ofproto.OFP_NO_BUFFER:
                        data = msg.data
    
                    out = parser.OFPPacketOut(datapath=datapath, 
                        buffer_id=msg.buffer_id,
                        in_port=in_port, actions=actions, data=data)
                    datapath.send_msg(out)
Exemple #2
0
    def _request_stats(self, datapath):
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser

        req = parser.OFPFlowStatsRequest(datapath)
        datapath.send_msg(req)