Ejemplo n.º 1
0
 def add_faucet_vip(self, vlan, faucet_vip):
     ofmsgs = []
     max_prefixlen = faucet_vip.ip.max_prefixlen
     faucet_vip_host = self._host_from_faucet_vip(faucet_vip)
     priority = self.route_priority + max_prefixlen
     faucet_vip_host_nd_mcast = valve_packet.ipv6_link_eth_mcast(
         valve_packet.ipv6_solicited_node_from_ucast(faucet_vip.ip))
     ofmsgs.append(self.valve_flowmod(
         self.eth_src_table,
         self.valve_in_match(
             self.eth_src_table,
             eth_type=self._eth_type(),
             vlan=vlan,
             nw_proto=inet.IPPROTO_ICMPV6,
             eth_dst=faucet_vip_host_nd_mcast,
             icmpv6_type=icmpv6.ND_NEIGHBOR_SOLICIT),
         priority=priority,
         inst=[
             valve_of.apply_actions([valve_of.output_controller()]),
             valve_of.goto_table(self.flood_table)]))
     ofmsgs.append(self.valve_flowmod(
         self.eth_src_table,
         self.valve_in_match(
             self.eth_src_table,
             eth_type=self._eth_type(),
             eth_dst=self.faucet_mac,
             vlan=vlan,
             nw_proto=inet.IPPROTO_ICMPV6,
             icmpv6_type=icmpv6.ND_NEIGHBOR_ADVERT),
         priority=priority,
         inst=[valve_of.apply_actions([valve_of.output_controller()])]))
     # Initialize IPv6 FIB
     ofmsgs.append(self.valve_flowmod(
         self.eth_src_table,
         self.valve_in_match(
             self.eth_src_table,
             eth_type=self._eth_type(),
             eth_dst=self.faucet_mac,
             vlan=vlan),
         priority=self.route_priority,
         inst=[valve_of.goto_table(self.fib_table)]))
     ofmsgs.append(self.valve_flowcontroller(
         self.fib_table,
         self.valve_in_match(
             self.fib_table,
             eth_type=self._eth_type(),
             vlan=vlan,
             nw_proto=inet.IPPROTO_ICMPV6,
             nw_dst=faucet_vip_host,
             icmpv6_type=icmpv6.ICMPV6_ECHO_REQUEST),
         priority=priority))
     return ofmsgs
Ejemplo n.º 2
0
 def _add_faucet_vip_nd(self, vlan, priority, faucet_vip, faucet_vip_host):
     faucet_vip_host_nd_mcast = valve_packet.ipv6_link_eth_mcast(
         valve_packet.ipv6_solicited_node_from_ucast(faucet_vip.ip))
     controller_and_flood = [
         valve_of.apply_actions([valve_of.output_controller()]),
         valve_of.goto_table(self.flood_table)]
     ofmsgs = []
     ofmsgs.append(self.eth_src_table.flowmod(
         self.eth_src_table.match(
             eth_type=self.ETH_TYPE,
             eth_dst=faucet_vip_host_nd_mcast,
             vlan=vlan,
             nw_proto=inet.IPPROTO_ICMPV6,
             icmpv6_type=icmpv6.ND_NEIGHBOR_SOLICIT),
         priority=priority,
         inst=controller_and_flood))
     ofmsgs.append(self.eth_src_table.flowcontroller(
         self.eth_src_table.match(
             eth_type=self.ETH_TYPE,
             eth_dst=vlan.faucet_mac,
             vlan=vlan,
             nw_proto=inet.IPPROTO_ICMPV6,
             icmpv6_type=icmpv6.ND_NEIGHBOR_ADVERT),
         priority=priority))
     if faucet_vip.ip in valve_packet.IPV6_LINK_LOCAL:
         ofmsgs.append(self.eth_src_table.flowmod(
             self.eth_src_table.match(
                 eth_type=self.ETH_TYPE,
                 eth_dst=valve_packet.IPV6_ALL_ROUTERS_MCAST,
                 vlan=vlan,
                 nw_proto=inet.IPPROTO_ICMPV6,
                 icmpv6_type=icmpv6.ND_ROUTER_SOLICIT),
             priority=priority,
             inst=controller_and_flood))
     return ofmsgs
Ejemplo n.º 3
0
 def add_faucet_vip(self, vlan, faucet_vip):
     ofmsgs = []
     max_prefixlen = faucet_vip.ip.max_prefixlen
     faucet_vip_host = self._host_from_faucet_vip(faucet_vip)
     priority = self.route_priority + max_prefixlen
     ofmsgs.append(self.valve_flowmod(
         self.eth_src_table,
         self.valve_in_match(
             self.eth_src_table,
             eth_type=ether.ETH_TYPE_ARP,
             nw_dst=faucet_vip_host,
             vlan=vlan),
         priority=priority,
         inst=[valve_of.apply_actions([valve_of.output_controller()])]))
     # Initialize IPv4 FIB
     ofmsgs.append(self.valve_flowmod(
         self.eth_src_table,
         self.valve_in_match(
             self.eth_src_table,
             eth_type=self._eth_type(),
             eth_dst=self.faucet_mac,
             vlan=vlan),
         priority=self.route_priority,
         inst=[valve_of.goto_table(self.fib_table)]))
     ofmsgs.append(self.valve_flowcontroller(
         self.fib_table,
         self.valve_in_match(
             self.fib_table,
             vlan=vlan,
             eth_type=self._eth_type(),
             nw_proto=inet.IPPROTO_ICMP,
             nw_src=faucet_vip,
             nw_dst=faucet_vip_host),
         priority=priority))
     return ofmsgs
Ejemplo n.º 4
0
 def flowcontroller(self, match=None, priority=None, inst=None, max_len=96):
     """Add flow outputting to controller."""
     if inst is None:
         inst = []
     return self.flowmod(
         match=match,
         priority=priority,
         inst=[valve_of.apply_actions(
             [valve_of.output_controller(max_len)])] + inst)
Ejemplo n.º 5
0
 def flowcontroller(self, match=None, priority=None, inst=None, max_len=96):
     """Add flow outputting to controller."""
     if inst is None:
         inst = ()
     return self.flowmod(match=match,
                         priority=priority,
                         inst=(valve_of.apply_actions(
                             (valve_of.output_controller(max_len), )), ) +
                         inst)
Ejemplo n.º 6
0
 def _add_faucet_vip_nd(self, vlan, priority, faucet_vip, faucet_vip_host):
     faucet_vip_host_nd_mcast = valve_packet.ipv6_link_eth_mcast(
         valve_packet.ipv6_solicited_node_from_ucast(faucet_vip.ip))
     controller_and_flood = [
         valve_of.apply_actions([valve_of.output_controller()]),
         self.vip_table.goto(self.output_table)
     ]
     ofmsgs = []
     ofmsgs.append(
         self.vip_table.flowcontroller(self.vip_table.match(
             eth_type=self.ETH_TYPE,
             nw_proto=valve_of.inet.IPPROTO_ICMPV6,
             icmpv6_type=icmpv6.ICMPV6_ECHO_REQUEST),
                                       priority=priority,
                                       max_len=self.MAX_LEN))
     # IPv6 ND for FAUCET VIP
     ofmsgs.append(
         self.eth_src_table.flowmod(
             self.eth_src_table.match(eth_type=self.ETH_TYPE,
                                      eth_dst=faucet_vip_host_nd_mcast,
                                      vlan=vlan),
             priority=priority,
             inst=[self.eth_src_table.goto(self.vip_table)]))
     ofmsgs.append(
         self.vip_table.flowmod(self.vip_table.match(
             eth_type=self.ETH_TYPE,
             nw_proto=valve_of.inet.IPPROTO_ICMPV6,
             icmpv6_type=icmpv6.ND_NEIGHBOR_SOLICIT),
                                priority=priority,
                                inst=controller_and_flood))
     # IPv6 ND for connected hosts.
     ofmsgs.append(
         self.vip_table.flowcontroller(self.vip_table.match(
             eth_type=self.ETH_TYPE,
             eth_dst=vlan.faucet_mac,
             nw_proto=valve_of.inet.IPPROTO_ICMPV6,
             icmpv6_type=icmpv6.ND_NEIGHBOR_ADVERT),
                                       priority=priority,
                                       max_len=self.MAX_LEN))
     if faucet_vip.ip.is_link_local:
         ofmsgs.append(
             self.eth_src_table.flowmod(
                 self.eth_src_table.match(
                     eth_type=self.ETH_TYPE,
                     eth_dst=valve_packet.IPV6_ALL_ROUTERS_MCAST,
                     vlan=vlan),
                 priority=priority,
                 inst=[self.eth_src_table.goto(self.vip_table)]))
         ofmsgs.append(
             self.vip_table.flowmod(self.vip_table.match(
                 eth_type=self.ETH_TYPE,
                 nw_proto=valve_of.inet.IPPROTO_ICMPV6,
                 icmpv6_type=icmpv6.ND_ROUTER_SOLICIT),
                                    priority=priority,
                                    inst=controller_and_flood))
     return ofmsgs
Ejemplo n.º 7
0
 def add_port(self, port):
     """initialise override_output_port if necessary"""
     ofmsgs = []
     if port.override_output_port:
         ofmsgs.append(self.eth_src_table.flowmod(
             match=self.eth_src_table.match(
                 in_port=port.number),
             priority=self.low_priority + 1,
             inst=[valve_of.apply_actions([
                 valve_of.output_controller(),
                 valve_of.output_port(port.override_output_port.number)])]))
     return ofmsgs
Ejemplo n.º 8
0
 def add_port(self, port):
     """initialise override_output_port if necessary"""
     ofmsgs = []
     if port.override_output_port:
         ofmsgs.append(self.eth_src_table.flowmod(
             match=self.eth_src_table.match(
                 in_port=port.number),
             priority=self.low_priority + 1,
             inst=[valve_of.apply_actions([
                 valve_of.output_controller(),
                 valve_of.output_port(port.override_output_port.number)])]))
     return ofmsgs
Ejemplo n.º 9
0
 def _controller_and_flood(self):
     """Return instructions to forward packet to l2-forwarding"""
     return self.pipeline.accept_to_l2_forwarding(
         actions=[valve_of.output_controller(max_len=self.ICMP_SIZE)])
Ejemplo n.º 10
0
 def _controller_and_flood(self):
     return [
         valve_of.apply_actions([valve_of.output_controller(max_len=self.ICMP_SIZE)]),
         self.vip_table.goto(self.output_table)]
Ejemplo n.º 11
0
 def _controller_and_flood(self):
     return self.pipeline.accept_to_l2_forwarding(
         actions=[valve_of.output_controller(max_len=self.ICMP_SIZE)])
Ejemplo n.º 12
0
 def _controller_and_flood(self):
     return self.pipeline.accept_to_l2_forwarding(
         actions=[valve_of.output_controller(max_len=self.ICMP_SIZE)])