예제 #1
0
 def add_port(self, port):
     ofmsgs = []
     if port.vlans():
         mirror_act = port.mirror_actions()
         tagged_ofmsgs = []
         for vlan in port.tagged_vlans:
             tagged_ofmsgs.append(
                 self._port_add_vlan_rules(port,
                                           vlan,
                                           mirror_act,
                                           push_vlan=False))
         untagged_ofmsgs = []
         native_vlan = self._native_vlan(port)
         if native_vlan is not None:
             untagged_ofmsgs.append(
                 self._port_add_vlan_rules(port, native_vlan, mirror_act))
         # If no untagged VLANs, add explicit drop rule for untagged packets.
         if port.count_untag_vlan_miss and not untagged_ofmsgs:
             untagged_ofmsgs.append(
                 self.vlan_table.flowmod(self.vlan_table.match(
                     in_port=port.number, vlan=NullVLAN()),
                                         priority=self.low_priority))
         ofmsgs.extend(tagged_ofmsgs)
         ofmsgs.extend(untagged_ofmsgs)
         if port.lacp:
             ofmsgs.append(
                 self.vlan_table.flowcontroller(
                     self.vlan_table.match(
                         in_port=port.number,
                         eth_type=valve_of.ether.ETH_TYPE_SLOW,
                         eth_dst=valve_packet.SLOW_PROTOCOL_MULTICAST),
                     priority=self.dp_highest_priority,
                     max_len=valve_packet.LACP_SIZE))
             ofmsgs.extend(self.lacp_advertise(port))
     return ofmsgs
예제 #2
0
 def add_port(self, port):
     ofmsgs = super().add_port(port)
     # If this is a stacking port, accept all VLANs (came from another FAUCET)
     if port.stack:
         # Actual stack traffic will have VLAN tags.
         ofmsgs.append(
             self.vlan_table.flowdrop(match=self.vlan_table.match(
                 in_port=port.number, vlan=NullVLAN()),
                                      priority=self.low_priority + 1))
         ofmsgs.append(
             self.vlan_table.flowmod(
                 match=self.vlan_table.match(in_port=port.number),
                 priority=self.low_priority,
                 inst=self.pipeline.accept_to_classification()))
     return ofmsgs
예제 #3
0
 def _port_add_vlan_rules(self, port, vlan, mirror_act, push_vlan=True):
     actions = copy.copy(mirror_act)
     match_vlan = vlan
     if push_vlan:
         actions.extend(valve_of.push_vlan_act(
             self.vlan_table, vlan.vid))
         match_vlan = NullVLAN()
     if self.has_externals:
         if port.loop_protect_external:
             actions.append(self.vlan_table.set_no_external_forwarding_requested())
         else:
             actions.append(self.vlan_table.set_external_forwarding_requested())
     inst = (
         valve_of.apply_actions(actions),
         self.vlan_table.goto(self._find_forwarding_table(vlan)))
     return self.vlan_table.flowmod(
         self.vlan_table.match(in_port=port.number, vlan=match_vlan),
         priority=self.low_priority, inst=inst)
예제 #4
0
 def del_port(self, port):
     ofmsgs = []
     if port.vlans():
         ofmsgs.extend(self._del_host_flows(port))
         native_vlan = self._native_vlan(port)
         if native_vlan is not None or port.count_untag_vlan_miss:
             ofmsgs.append(self.vlan_table.flowdel(
                 self.vlan_table.match(in_port=port.number, vlan=NullVLAN()),
                 priority=self.low_priority))
         for vlan in port.tagged_vlans:
             ofmsgs.append(self.vlan_table.flowdel(
                 self.vlan_table.match(in_port=port.number, vlan=vlan),
                 priority=self.low_priority))
         if port.lacp:
             ofmsgs.append(self.vlan_table.flowdel(
                 self._lacp_match(port),
                 priority=self.dp_highest_priority))
     return ofmsgs
예제 #5
0
 def add_port(self, port):
     if port.vlans():
         mirror_act = port.mirror_actions()
         tagged_ofmsgs = []
         for vlan in port.tagged_vlans:
             tagged_ofmsgs.append(self._port_add_vlan_rules(
                 port, vlan, mirror_act, push_vlan=False))
         untagged_ofmsgs = []
         native_vlan = self._native_vlan(port)
         if native_vlan is not None:
             untagged_ofmsgs.append(self._port_add_vlan_rules(
                 port, native_vlan, mirror_act))
         # If no untagged VLANs, add explicit drop rule for untagged packets.
         if port.count_untag_vlan_miss and not untagged_ofmsgs:
             untagged_ofmsgs.append(self.vlan_table.flowmod(
                 self.vlan_table.match(in_port=port.number, vlan=NullVLAN()),
                 priority=self.low_priority))
         return tagged_ofmsgs + untagged_ofmsgs
     return []
예제 #6
0
 def add_port(self, port):
     ofmsgs = []
     if port.vlans():
         mirror_act = port.mirror_actions()
         for vlan in port.tagged_vlans:
             ofmsgs.append(self._port_add_vlan_rules(
                 port, vlan, mirror_act, push_vlan=False))
         native_vlan = self._native_vlan(port)
         if native_vlan is not None:
             ofmsgs.append(self._port_add_vlan_rules(
                 port, native_vlan, mirror_act))
         # If no untagged VLANs, add explicit drop rule for untagged packets.
         elif port.count_untag_vlan_miss:
             ofmsgs.append(self.vlan_table.flowdrop(
                 self.vlan_table.match(in_port=port.number, vlan=NullVLAN()),
                 priority=self.low_priority))
         if port.lacp:
             ofmsgs.append(self.vlan_table.flowcontroller(
                 self._lacp_match(port),
                 priority=self.dp_highest_priority,
                 max_len=valve_packet.LACP_SIZE))
             ofmsgs.extend(self.lacp_advertise(port))
     return ofmsgs