Esempio n. 1
0
def mpls_tun1_group(dpath, mod, ofctl):
    """
    MPLS Tunnel1 Label Group
    """
    _LOG.debug("MPLS Tunnel1 Group: %d %s %s", dpath.id, mod, ofctl)

    entry = mod.mpls_label
    cmd = fibcapi.group_mod_cmd(mod.cmd, dpath.ofproto)
    gid = fibcapi.mpls_label_group_id(3, entry.dst_id)

    def _buckets():
        if not ofgroup.is_bucket_needed(dpath, cmd):
            return []

        next_gid = fibcapi.mpls_interface_group_id(entry.ne_id)
        actions = [
            ofaction.push_mpls(fibcapi.ETHTYPE_MPLS),
            ofaction.set_field("mpls_label", entry.new_label),
            ofaction.set_mpls_ttl(64),
            ofaction.group(next_gid),
        ]
        return [dict(actions=actions)]

    group = ofgroup.group_mod(gid, "INDIRECT", _buckets)
    ofctl.mod_group_entry(dpath, group, cmd)
Esempio n. 2
0
def mpls_interface_group(dpath, mod, ofctl):
    """
    MPLS Interface group
    """
    _LOG.debug("MPLS Interface Group: %d %s", dpath.id, mod)

    entry = mod.mpls_iface
    cmd = fibcapi.group_mod_cmd(mod.cmd, dpath.ofproto)
    gid = fibcapi.mpls_interface_group_id(entry.ne_id)

    def _buckets():
        if not ofgroup.is_bucket_needed(dpath, cmd):
            return []

        next_gid = fibcapi.l2_interface_group_id(entry.port_id, entry.vlan_vid)
        vlan_vid = fibcapi.adjust_vlan_vid(
            entry.vlan_vid) | fibcapi.OFPVID_PRESENT
        actions = [
            ofaction.set_field("eth_src", entry.eth_src),
            ofaction.set_field("eth_dst", entry.eth_dst),
            ofaction.set_field("vlan_vid", vlan_vid),
            ofaction.group(next_gid),
        ]
        return [dict(actions=actions)]

    group = ofgroup.group_mod(gid, "INDIRECT", _buckets)
    ofctl.mod_group_entry(dpath, group, cmd)
Esempio n. 3
0
def mpls_l3_vpn_group(dpath, mod, ofctl, mpls_bos=True):
    """
    MPLS L3 VPN Group
    """
    _LOG.debug("MPLS L3 VPN Group: %d %s %s", dpath.id, mod, ofctl)

    def get_next_gid(entry):
        """
        Get Next Group Id
        """
        if entry.ne_id != 0:
            return fibcapi.mpls_interface_group_id(entry.ne_id)
        elif entry.new_dst_id != 0:
            return fibcapi.mpls_label_group_id(3, entry.new_dst_id)

        return None

    entry = mod.mpls_label
    cmd = fibcapi.group_mod_cmd(mod.cmd, dpath.ofproto)
    gid = fibcapi.mpls_label_group_id(2, entry.dst_id)

    def _buckets():
        if not ofgroup.is_bucket_needed(dpath, cmd):
            return []

        next_gid = get_next_gid(entry)
        actions = [
            ofaction.push_mpls(fibcapi.ETHTYPE_MPLS),
            ofaction.set_field("mpls_label", entry.new_label),
        ]

        if mpls_bos:
            actions.append(ofaction.set_field("mpls_bos", 1))

        actions.append(ofaction.set_mpls_ttl(64))
        actions.append(ofaction.group(next_gid))

        return [dict(actions=actions)]

    group = ofgroup.group_mod(gid, "INDIRECT", _buckets)
    ofctl.mod_group_entry(dpath, group, cmd)
Esempio n. 4
0
def l2_interface_group(dpath, mod, ofctl):
    """
    L2 Interface Group
    """
    _LOG.debug("L2 Interface Group: %d %s", dpath.id, mod)

    ofproto = dpath.ofproto
    entry = mod.l2_iface
    cmd = fibcapi.group_mod_cmd(mod.cmd, dpath.ofproto)
    gid = fibcapi.l2_interface_group_id(entry.port_id, entry.vlan_vid)

    def _buckets():
        if not ofgroup.is_bucket_needed(dpath, cmd):
            return []

        actions = [ofaction.output(entry.port_id)]
        if entry.vlan_vid == ofproto.OFPVID_NONE:
            actions.insert(0, ofaction.pop_vlan())
        return [dict(actions=actions)]

    group = ofgroup.group_mod(gid, "INDIRECT", _buckets)
    ofctl.mod_group_entry(dpath, group, cmd)