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)
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)
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)
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)