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
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
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
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
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