def _build_group_buckets(self, vlan, unicast_flood): buckets = [] for port in vlan.tagged_flood_ports(unicast_flood): buckets.append(valve_of.bucket( actions=[valve_of.output_port(port.number)])) for port in vlan.untagged_flood_ports(unicast_flood): buckets.append(valve_of.bucket( actions=[ valve_of.pop_vlan(), valve_of.output_port(port.number)])) return buckets
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 build_output_actions(acl_table, output_dict): """Implement actions to alter packet/output.""" output_actions = [] output_port = None ofmsgs = [] # rewrite any VLAN headers first always vlan_actions = rewrite_vlan(acl_table, output_dict) if vlan_actions: output_actions.extend(vlan_actions) if 'set_fields' in output_dict: for set_field in output_dict['set_fields']: output_actions.append(acl_table.set_field(**set_field)) if 'port' in output_dict: output_port = output_dict['port'] output_actions.append(valve_of.output_port(output_port)) if 'ports' in output_dict: for output_port in output_dict['ports']: 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 _nexthop_group_buckets(self, vlan, port, eth_src): actions = self._nexthop_actions(eth_src, vlan) if not vlan.port_is_tagged(port): actions.append(valve_of.pop_vlan()) actions.append(valve_of.output_port(port.number)) buckets = [valve_of.bucket(actions=actions)] return buckets
def build_output_actions(acl_table, output_dict): """Implement actions to alter packet/output.""" output_actions = [] output_port = None ofmsgs = [] # rewrite any VLAN headers first always vlan_actions = rewrite_vlan(acl_table, output_dict) if vlan_actions: output_actions.extend(vlan_actions) if 'set_fields' in output_dict: for set_field in output_dict['set_fields']: output_actions.append(acl_table.set_field(**set_field)) if 'port' in output_dict: output_port = output_dict['port'] output_actions.append(valve_of.output_port(output_port)) if 'ports' in output_dict: for output_port in output_dict['ports']: 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 build_ordered_output_actions(acl_table, output_list, tunnel_rules=None, source_id=None): """Build actions from ordered ACL output list""" output_actions = [] output_ports = [] output_ofmsgs = [] output_inst = [] for action in output_list: for key, value in action.items(): if key == 'pop_vlans': for _ in range(value): output_actions.append(valve_of.pop_vlan()) if key == 'vlan_vid': output_actions.extend(push_vlan(acl_table, value)) if key == 'swap_vid': output_actions.append(acl_table.set_vlan_vid(value)) if key == 'vlan_vids': for vlan_vid in value: output_actions.extend(push_vlan(acl_table, vlan_vid)) if key == 'set_fields': for set_field in value: output_actions.append(acl_table.set_field(**set_field)) if key == 'port': output_ports.append(value) output_actions.append(valve_of.output_port(value)) if key == 'ports': for output_port in value: output_ports.append(output_port) output_actions.append(valve_of.output_port(output_port)) if key == 'failover': group_id = value['group_id'] buckets = [] for port in value['ports']: buckets.append( valve_of.bucket(watch_port=port, actions=[valve_of.output_port(port)])) output_ofmsgs.extend( valve_of.groupadd_ff(group_id=group_id, buckets=buckets)) output_actions.append(valve_of.group_act(group_id=group_id)) if key == 'tunnel' and tunnel_rules and source_id is not None: source_rule = tunnel_rules[value][source_id] _, tunnel_actions, tunnel_ofmsgs, tunnel_inst = build_output_actions( acl_table, source_rule) output_actions.extend(tunnel_actions) output_ofmsgs.extend(tunnel_ofmsgs) output_inst.extend(tunnel_inst) if key == 'goto': output_inst.append(valve_of.goto_table_id(value)) return (output_ports, output_actions, output_ofmsgs, output_inst)
def build_output_actions(acl_table, output_dict, tunnel_rules=None, source_id=None): """Implement actions to alter packet/output.""" if isinstance(output_dict, (list, tuple)): return build_ordered_output_actions(acl_table, output_dict, tunnel_rules, source_id) output_actions = [] output_inst = [] output_port = None ofmsgs = [] # rewrite any VLAN headers first always vlan_actions = rewrite_vlan(acl_table, output_dict) if vlan_actions: output_actions.extend(vlan_actions) if 'set_fields' in output_dict: for set_field in output_dict['set_fields']: output_actions.append(acl_table.set_field(**set_field)) if 'port' in output_dict: output_port = output_dict['port'] output_actions.append(valve_of.output_port(output_port)) if 'ports' in output_dict: for output_port in output_dict['ports']: 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.extend(valve_of.groupadd_ff(group_id=group_id, buckets=buckets)) output_actions.append(valve_of.group_act(group_id=group_id)) if 'tunnel' in output_dict and tunnel_rules and source_id is not None: tunnel_id = output_dict['tunnel'] source_rule = tunnel_rules[tunnel_id][source_id] _, tunnel_actions, tunnel_ofmsgs, tunnel_inst = build_output_actions( acl_table, source_rule) output_actions.extend(tunnel_actions) tunnel_ofmsgs.extend(tunnel_ofmsgs) output_inst.extend(tunnel_inst) if 'goto' in output_dict: output_inst.append(valve_of.goto_table_id(output_dict['goto'])) return (output_port, output_actions, ofmsgs, output_inst)
def _nexthop_group_buckets(self, vlan, port, eth_src): actions = self._nexthop_actions(eth_src, vlan) actions.extend(vlan.output_port(port)) buckets = [valve_of.bucket(actions=actions)] return buckets