示例#1
0
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)
示例#2
0
 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
示例#3
0
 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
示例#4
0
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