Example #1
0
    def output(self, port, vlan, hairpin=False, external_forwarding_requested=None):
        """Get instructions list to output a packet through the regular
        pipeline.

        args:
            port: Port object of port to output packet to
            vlan: Vlan object of vlan to output packet on
            hairpin: if True, hairpinning is required
            apply_egress_acl: if True the packet will be sent to the egress acl
                table before being output
        returns:
            list of Instructions
        """
        instructions = []
        if self.egress_table:
            metadata, metadata_mask = faucet_md.get_egress_metadata(
                port.number, vlan.vid)
            if self.egress_acl_table:
                instructions.extend(valve_of.metadata_goto_table(
                    metadata, metadata_mask, self.egress_acl_table))
            else:
                instructions.extend(valve_of.metadata_goto_table(
                    metadata, metadata_mask, self.egress_table))
        else:
            instructions.append(valve_of.apply_actions(vlan.output_port(
                port, hairpin=hairpin, output_table=self.output_table,
                external_forwarding_requested=external_forwarding_requested)))
        return instructions
Example #2
0
    def output(self, port, vlan, hairpin=False, loop_protect_field=None):
        """Get instructions list to output a packet through the regular
        pipeline.

        args:
            port: Port object of port to output packet to
            vlan: Vlan object of vlan to output packet on
            hairpin: if True, hairpinning is required
        returns:
            list of Instructions
        """
        instructions = []
        if self.egress_table:
            metadata, metadata_mask = faucet_md.get_egress_metadata(
                port.number, vlan.vid)
            instructions.extend(
                valve_of.metadata_goto_table(metadata, metadata_mask,
                                             self.egress_table))
        else:
            instructions.append(
                valve_of.apply_actions(
                    vlan.output_port(port,
                                     hairpin=hairpin,
                                     output_table=self.output_table,
                                     loop_protect_field=loop_protect_field)))
        return instructions
Example #3
0
    def output(self, port, vlan):
        """Get instructions list to output a packet through the regular
        pipeline.

        args:
            port: Port object of port to output packet to
            vlan: Vlan object of vlan to output packet on
        returns:
            list of Instructions
        """
        instructions = []
        if self.egress_table:
            metadata, metadata_mask = faucet_md.get_egress_metadata(
                port.number, vlan.vid)
            instructions.extend(
                valve_of.metadata_goto_table(metadata, metadata_mask,
                                             self.egress_table))
        else:
            instructions.append(valve_of.apply_actions(vlan.output_port(port)))
        return instructions
Example #4
0
    def output(self, port, vlan, hairpin=False):
        """Get instructions list to output a packet through the regular
        pipeline.

        args:
            port: Port object of port to output packet to
            vlan: Vlan object of vlan to output packet on
            hairpin: if True, hairpinning is required
        returns:
            list of Instructions
        """
        instructions = []
        if self.egress_table:
            metadata, metadata_mask = faucet_md.get_egress_metadata(
                port.number, vlan.vid)
            instructions.extend(valve_of.metadata_goto_table(
                metadata, metadata_mask, self.egress_table))
        else:
            instructions.append(valve_of.apply_actions(vlan.output_port(port, hairpin=hairpin)))
        return instructions
Example #5
0
    def learn_host_on_vlan_port_flows(self, port, vlan, eth_src,
                                      delete_existing, refresh_rules,
                                      src_rule_idle_timeout,
                                      src_rule_hard_timeout,
                                      dst_rule_idle_timeout):
        """Return flows that implement learning a host on a port."""
        ofmsgs = []

        if port.permanent_learn:
            # Antispoofing rule for this MAC.
            if self.classification_table != self.eth_src_table:
                ofmsgs.append(self.classification_table.flowmod(
                    self.classification_table.match(
                        in_port=port.number, vlan=vlan, eth_src=eth_src),
                    priority=self.host_priority,
                    inst=[self.classification_table.goto(self.eth_src_table)]))
            ofmsgs.append(self.classification_table.flowdrop(
                self.classification_table.match(vlan=vlan, eth_src=eth_src),
                priority=(self.host_priority - 2)))
        else:
            # Delete any existing entries for MAC.
            if delete_existing:
                ofmsgs.extend(self.delete_host_from_vlan(eth_src, vlan))

        # Associate this MAC with source port.
        src_match = self.eth_src_table.match(
            in_port=port.number, vlan=vlan, eth_src=eth_src)
        src_priority = self.host_priority - 1
        inst = self.eth_src_table.goto(self.output_table)

        if port.override_output_port:
            inst = valve_of.apply_actions([
                valve_of.output_port(port.override_output_port.number)])
        ofmsgs.append(self.eth_src_table.flowmod(
            match=src_match,
            priority=src_priority,
            inst=[inst],
            hard_timeout=src_rule_hard_timeout,
            idle_timeout=src_rule_idle_timeout))

        hairpinning = port.hairpin or port.hairpin_unicast

        # If we are refreshing only and not in hairpin mode, leave existing eth_dst alone.
        if refresh_rules and not hairpinning:
            return ofmsgs

        # Output packets for this MAC to specified port.
        if self.egress_table is not None:
            metadata, metadata_mask = get_egress_metadata(port.number, vlan.vid)
            ofmsgs.append(self.eth_dst_table.flowmod(
                self.eth_dst_table.match(vlan=vlan, eth_dst=eth_src),
                priority=self.host_priority,
                inst=valve_of.metadata_goto_table(
                    metadata, metadata_mask, self.egress_table),
                idle_timeout=dst_rule_idle_timeout))
        else:
            ofmsgs.append(self.eth_dst_table.flowmod(
                self.eth_dst_table.match(vlan=vlan, eth_dst=eth_src),
                priority=self.host_priority,
                inst=[valve_of.apply_actions(vlan.output_port(port))],
                idle_timeout=dst_rule_idle_timeout))

        # If port is in hairpin mode, install a special rule
        # that outputs packets destined to this MAC back out the same
        # port they came in (e.g. multiple hosts on same WiFi AP,
        # and FAUCET is switching between them on the same port).
        if hairpinning:
            ofmsgs.append(self.eth_dst_hairpin_table.flowmod(
                self.eth_dst_hairpin_table.match(in_port=port.number, vlan=vlan, eth_dst=eth_src),
                priority=self.host_priority,
                inst=[valve_of.apply_actions(vlan.output_port(port, hairpin=True))],
                idle_timeout=dst_rule_idle_timeout))

        return ofmsgs