def build_output_actions(output_dict): """Implement actions to alter packet/output.""" output_actions = [] output_port = None ofmsgs = [] # if destination rewriting selected, rewrite it. if 'dl_dst' in output_dict: output_actions.append(valve_of.set_eth_dst(output_dict['dl_dst'])) # rewrite any VLAN headers. vlan_actions = rewrite_vlan(output_dict) if vlan_actions: output_actions.extend(vlan_actions) if 'port' in output_dict: output_port = output_dict['port'] output_actions.append(valve_of.output_port(output_port)) if 'failover' in output_dict: failover = output_dict['failover'] group_id = failover['group_id'] buckets = [] for port in failover['ports']: buckets.append( valve_of.bucket(watch_port=port, actions=[valve_of.output_port(port)])) ofmsgs.append(valve_of.groupdel(group_id=group_id)) ofmsgs.append(valve_of.groupadd_ff(group_id=group_id, buckets=buckets)) output_actions.append(valve_of.group_act(group_id=group_id)) return (output_port, output_actions, ofmsgs)
def _add_faucet_fib_to_vip(self, vlan, priority, faucet_vip, faucet_vip_host): learn_connected_priority = self.route_priority + faucet_vip.network.prefixlen faucet_mac = vlan.faucet_mac insts = [valve_of.goto_table(self.fib_table)] if self._global_routing(): vlan_mac = valve_packet.int_in_mac(faucet_mac, vlan.vid) insts = [valve_of.apply_actions([ valve_of.set_eth_dst(vlan_mac), valve_of.set_vlan_vid(self.global_vlan.vid)])] + insts ofmsgs = [] ofmsgs.append(self.eth_src_table.flowmod( self.eth_src_table.match(eth_type=self.ETH_TYPE, eth_dst=faucet_mac, vlan=vlan), priority=self.route_priority, inst=insts)) routed_vlans = self._routed_vlans(vlan) if self._global_routing(): vlan = self.global_vlan ofmsgs.append(self.fib_table.flowmod( self._route_match(vlan, faucet_vip_host), priority=priority, inst=[valve_of.goto_table(self.vip_table)])) if self.proactive_learn and not faucet_vip.ip.is_link_local: for routed_vlan in routed_vlans: ofmsgs.append(self.fib_table.flowmod( self._route_match(routed_vlan, faucet_vip), priority=learn_connected_priority, inst=[valve_of.goto_table(self.vip_table)])) ofmsgs.append(self.vip_table.flowcontroller( self.vip_table.match(eth_type=self.ETH_TYPE), priority=priority-1, max_len=self.MAX_LEN)) return ofmsgs
def _nexthop_actions(self, eth_dst, vlan): ofmsgs = [] if self.routers: ofmsgs.append(valve_of.set_vlan_vid(vlan.vid)) ofmsgs.extend([ valve_of.set_eth_src(self.faucet_mac), valve_of.set_eth_dst(eth_dst), valve_of.dec_ip_ttl()]) return ofmsgs
def build_acl_entry(rule_conf, acl_allow_inst, port_num=None, vlan_vid=None): acl_inst = [] match_dict = {} for attrib, attrib_value in list(rule_conf.items()): if attrib == 'in_port': continue if attrib == 'actions': allow = False allow_specified = False if 'allow' in attrib_value: allow_specified = True if attrib_value['allow'] == 1: allow = True if 'mirror' in attrib_value: port_no = attrib_value['mirror'] acl_inst.append( valve_of.apply_actions([valve_of.output_port(port_no)])) if not allow_specified: allow = True if 'output' in attrib_value: output_dict = attrib_value['output'] output_actions = [] output_port = None if 'port' in output_dict: output_port = output_dict['port'] # if destination rewriting selected, rewrite it. if 'dl_dst' in output_dict: output_actions.append( valve_of.set_eth_dst(output_dict['dl_dst'])) # rewrite any VLAN headers. vlan_actions = rewrite_vlan(output_dict) if vlan_actions: output_actions.extend(vlan_actions) # output to a port if specified. if output_port is not None: output_actions.append(valve_of.output_port(output_port)) acl_inst.append(valve_of.apply_actions(output_actions)) # if port specified, output packet now and exit pipeline. if output_port is not None: continue if allow: acl_inst.append(acl_allow_inst) else: match_dict[attrib] = attrib_value if port_num is not None: match_dict['in_port'] = port_num if vlan_vid is not None: match_dict['vlan_vid'] = valve_of.vid_present(vlan_vid) acl_match = valve_of.match_from_dict(match_dict) return acl_match, acl_inst
def _add_faucet_fib_to_vip(self, vlan, priority, faucet_vip, faucet_vip_host): learn_connected_priority = self.route_priority + faucet_vip.network.prefixlen faucet_mac = vlan.faucet_mac insts = [valve_of.goto_table(self.fib_table)] if self._global_routing(): vlan_mac = faucet_mac.split(':')[:4] + [ '%x' % (vlan.vid >> 8), '%x' % (vlan.vid & 0xff) ] vlan_mac = ':'.join(vlan_mac) insts = [ valve_of.apply_actions([ valve_of.set_eth_dst(vlan_mac), valve_of.set_vlan_vid(self.global_vlan.vid) ]) ] + insts ofmsgs = [] ofmsgs.append( self.eth_src_table.flowmod(self.eth_src_table.match( eth_type=self.ETH_TYPE, eth_dst=faucet_mac, vlan=vlan), priority=self.route_priority, inst=insts)) routed_vlans = self._routed_vlans(vlan) if self._global_routing(): vlan = self.global_vlan ofmsgs.append( self.fib_table.flowmod(self._route_match(vlan, faucet_vip_host), priority=priority, inst=[valve_of.goto_table(self.vip_table)])) if self.proactive_learn and faucet_vip.ip not in self.LINK_LOCAL: for routed_vlan in routed_vlans: ofmsgs.append( self.fib_table.flowmod( self._route_match(routed_vlan, faucet_vip), priority=learn_connected_priority, inst=[valve_of.goto_table(self.vip_table)])) ofmsgs.append( self.vip_table.flowcontroller( self.vip_table.match(eth_type=self.ETH_TYPE), priority=priority - 1, max_len=self.MAX_LEN)) return ofmsgs