Search in sources :

Example 1 with UpfSessionUplink

use of org.onosproject.net.behaviour.upf.UpfSessionUplink in project up4 by omec-project.

the class ReadFlowsCommand method doExecute.

@Override
protected void doExecute() throws Exception {
    Up4AdminService adminService = get(Up4AdminService.class);
    Collection<DownlinkUpfFlow> dlUpfFlow = adminService.getDownlinkFlows();
    Collection<UplinkUpfFlow> ulUpfFlow = adminService.getUplinkFlows();
    Collection<? extends UpfEntity> ulSess = adminService.adminReadAll(UpfEntityType.SESSION_UPLINK);
    Collection<? extends UpfEntity> appFilters = adminService.adminReadAll(UpfEntityType.APPLICATION);
    // Get session and app meter only to show the number of meters
    Collection<? extends UpfEntity> sessMeters = adminService.adminReadAll(UpfEntityType.SESSION_METER);
    Map<Integer, UpfMeter> sessMeterMap = sessMeters.stream().map(m -> (UpfMeter) m).collect(Collectors.toMap(UpfMeter::cellId, m -> m));
    Collection<? extends UpfEntity> appMeters = adminService.adminReadAll(UpfEntityType.APPLICATION_METER);
    print(SEPARATOR);
    print(appFilters.size() + " Applications");
    for (UpfEntity a : appFilters) {
        if (!a.type().equals(UpfEntityType.APPLICATION)) {
            print("ERROR: Wrong application filter: " + a);
            continue;
        }
        UpfApplication app = (UpfApplication) a;
        print("app_id=" + app.appId() + ", ipv4_prefix=" + app.ip4Prefix() + ", l4_range=" + app.l4PortRange() + ", ip_proto=" + app.ipProto());
    }
    print(SEPARATOR);
    print(ulSess.size() + " Uplink Sessions");
    for (UpfEntity s : ulSess) {
        if (!s.type().equals(UpfEntityType.SESSION_UPLINK)) {
            print("ERROR: Wrong uplink session: " + s);
            continue;
        }
        UpfSessionUplink sess = (UpfSessionUplink) s;
        print("n3_addr=" + sess.tunDstAddr() + ", teid=" + sess.teid() + (sess.needsDropping() ? ", drop()" : ", fwd(" + "sess_meter_idx=" + sess.sessionMeterIdx() + ")"));
        UpfMeter sessMeter = sessMeterMap.getOrDefault(sess.sessionMeterIdx(), null);
        if (sessMeter == null) {
            print("    NO SESSION METER (sess_meter_idx=" + sess.sessionMeterIdx() + ")");
        } else {
            print("    Session meter: " + ppUpfMeter(sessMeter));
        }
    }
    print(SEPARATOR);
    print(ulUpfFlow.size() + " Uplink Flows");
    for (UplinkUpfFlow f : ulUpfFlow) {
        print(f.toString());
    }
    print(SEPARATOR);
    print(dlUpfFlow.size() + " Downlink Flows");
    for (DownlinkUpfFlow f : dlUpfFlow) {
        print(f.toString());
    }
    print(SEPARATOR);
    print("Apps=%d, UL sess=%d, UL flows=%d, DL flows=%s", appFilters.size(), ulSess.size(), ulUpfFlow.size(), dlUpfFlow.size());
    print("App meters=%d, Sess meters=%d", appMeters.size(), sessMeters.size());
}
Also used : UpfMeter(org.onosproject.net.behaviour.upf.UpfMeter) Collection(java.util.Collection) DownlinkUpfFlow(org.omecproject.up4.impl.DownlinkUpfFlow) UpfSessionUplink(org.onosproject.net.behaviour.upf.UpfSessionUplink) Collectors(java.util.stream.Collectors) Command(org.apache.karaf.shell.api.action.Command) Up4Utils.ppUpfMeter(org.omecproject.up4.impl.Up4Utils.ppUpfMeter) AbstractShellCommand(org.onosproject.cli.AbstractShellCommand) UplinkUpfFlow(org.omecproject.up4.impl.UplinkUpfFlow) UpfEntity(org.onosproject.net.behaviour.upf.UpfEntity) Map(java.util.Map) Service(org.apache.karaf.shell.api.action.lifecycle.Service) UpfEntityType(org.onosproject.net.behaviour.upf.UpfEntityType) UpfApplication(org.onosproject.net.behaviour.upf.UpfApplication) Up4AdminService(org.omecproject.up4.impl.Up4AdminService) UpfSessionUplink(org.onosproject.net.behaviour.upf.UpfSessionUplink) DownlinkUpfFlow(org.omecproject.up4.impl.DownlinkUpfFlow) UpfMeter(org.onosproject.net.behaviour.upf.UpfMeter) Up4Utils.ppUpfMeter(org.omecproject.up4.impl.Up4Utils.ppUpfMeter) UpfApplication(org.onosproject.net.behaviour.upf.UpfApplication) UplinkUpfFlow(org.omecproject.up4.impl.UplinkUpfFlow) UpfEntity(org.onosproject.net.behaviour.upf.UpfEntity) Up4AdminService(org.omecproject.up4.impl.Up4AdminService)

Example 2 with UpfSessionUplink

use of org.onosproject.net.behaviour.upf.UpfSessionUplink in project up4 by omec-project.

the class Up4TranslatorImpl method upfEntityToUp4TableEntry.

@Override
public PiTableEntry upfEntityToUp4TableEntry(UpfEntity entity) throws Up4TranslationException {
    PiTableEntry.Builder tableEntryBuilder = PiTableEntry.builder();
    PiAction.Builder actionBuilder = PiAction.builder();
    PiMatchKey.Builder matchBuilder = PiMatchKey.builder();
    switch(entity.type()) {
        case INTERFACE:
            tableEntryBuilder.forTable(PRE_QOS_PIPE_INTERFACES);
            UpfInterface upfIntf = (UpfInterface) entity;
            byte direction;
            byte srcIface;
            actionBuilder.withId(PRE_QOS_PIPE_SET_SOURCE_IFACE);
            if (upfIntf.isAccess()) {
                srcIface = IFACE_ACCESS;
                direction = DIRECTION_UPLINK;
            } else if (upfIntf.isCore()) {
                srcIface = IFACE_CORE;
                direction = DIRECTION_DOWNLINK;
            } else {
                throw new Up4TranslationException("UPF Interface is not Access nor CORE: " + upfIntf);
            }
            actionBuilder.withParameter(new PiActionParam(SRC_IFACE, srcIface)).withParameter(new PiActionParam(DIRECTION, direction)).withParameter(new PiActionParam(SLICE_ID, (byte) upfIntf.sliceId()));
            matchBuilder.addFieldMatch(new PiLpmFieldMatch(HDR_IPV4_DST_PREFIX, ImmutableByteSequence.copyFrom(upfIntf.prefix().address().toOctets()), upfIntf.prefix().prefixLength()));
            break;
        case SESSION_UPLINK:
            tableEntryBuilder.forTable(PRE_QOS_PIPE_SESSIONS_UPLINK);
            UpfSessionUplink sessionUplink = (UpfSessionUplink) entity;
            matchBuilder.addFieldMatch(new PiExactFieldMatch(HDR_N3_ADDRESS, ImmutableByteSequence.copyFrom(sessionUplink.tunDstAddr().toOctets()))).addFieldMatch(new PiExactFieldMatch(HDR_TEID, ImmutableByteSequence.copyFrom(sessionUplink.teid())));
            if (sessionUplink.needsDropping()) {
                actionBuilder.withId(PRE_QOS_PIPE_SET_SESSION_UPLINK_DROP);
            } else {
                actionBuilder.withId(PRE_QOS_PIPE_SET_SESSION_UPLINK);
                actionBuilder.withParameter(new PiActionParam(SESSION_METER_IDX, sessionUplink.sessionMeterIdx()));
            }
            break;
        case SESSION_DOWNLINK:
            tableEntryBuilder.forTable(PRE_QOS_PIPE_SESSIONS_DOWNLINK);
            UpfSessionDownlink sessionDownlink = (UpfSessionDownlink) entity;
            matchBuilder.addFieldMatch(new PiExactFieldMatch(HDR_UE_ADDRESS, ImmutableByteSequence.copyFrom(sessionDownlink.ueAddress().toOctets())));
            if (sessionDownlink.needsDropping() && sessionDownlink.needsBuffering()) {
                log.error("We don't support DROP + BUFF on the UP4 northbound! Defaulting to only BUFF");
                actionBuilder.withId(PRE_QOS_PIPE_SET_SESSION_DOWNLINK_BUFF);
                actionBuilder.withParameter(new PiActionParam(SESSION_METER_IDX, sessionDownlink.sessionMeterIdx()));
            } else if (sessionDownlink.needsDropping()) {
                actionBuilder.withId(PRE_QOS_PIPE_SET_SESSION_DOWNLINK_DROP);
            } else {
                actionBuilder.withParameter(new PiActionParam(SESSION_METER_IDX, sessionDownlink.sessionMeterIdx()));
                if (sessionDownlink.needsBuffering()) {
                    actionBuilder.withId(PRE_QOS_PIPE_SET_SESSION_DOWNLINK_BUFF);
                } else {
                    actionBuilder.withParameter(new PiActionParam(TUNNEL_PEER_ID, ImmutableByteSequence.copyFrom(sessionDownlink.tunPeerId())));
                    actionBuilder.withId(PRE_QOS_PIPE_SET_SESSION_DOWNLINK);
                }
            }
            break;
        case TERMINATION_UPLINK:
            tableEntryBuilder.forTable(PRE_QOS_PIPE_TERMINATIONS_UPLINK);
            UpfTerminationUplink upfTerminationUl = (UpfTerminationUplink) entity;
            matchBuilder.addFieldMatch(new PiExactFieldMatch(HDR_UE_ADDRESS, ImmutableByteSequence.copyFrom(upfTerminationUl.ueSessionId().toOctets()))).addFieldMatch(new PiExactFieldMatch(HDR_APP_ID, ImmutableByteSequence.copyFrom(upfTerminationUl.applicationId())));
            actionBuilder.withParameter(new PiActionParam(CTR_IDX, upfTerminationUl.counterId()));
            if (upfTerminationUl.needsDropping()) {
                actionBuilder.withId(PRE_QOS_PIPE_UPLINK_TERM_DROP);
            } else {
                if (upfTerminationUl.trafficClass() != null) {
                    actionBuilder.withId(PRE_QOS_PIPE_UPLINK_TERM_FWD);
                    actionBuilder.withParameter(new PiActionParam(TC, upfTerminationUl.trafficClass()));
                } else {
                    actionBuilder.withId(PRE_QOS_PIPE_UPLINK_TERM_FWD_NO_TC);
                }
                actionBuilder.withParameter(new PiActionParam(APP_METER_IDX, upfTerminationUl.appMeterIdx()));
            }
            break;
        case TERMINATION_DOWNLINK:
            tableEntryBuilder.forTable(PRE_QOS_PIPE_TERMINATIONS_DOWNLINK);
            UpfTerminationDownlink upfTerminationDl = (UpfTerminationDownlink) entity;
            matchBuilder.addFieldMatch(new PiExactFieldMatch(HDR_UE_ADDRESS, ImmutableByteSequence.copyFrom(upfTerminationDl.ueSessionId().toOctets()))).addFieldMatch(new PiExactFieldMatch(HDR_APP_ID, ImmutableByteSequence.copyFrom(upfTerminationDl.applicationId())));
            actionBuilder.withParameter(new PiActionParam(CTR_IDX, upfTerminationDl.counterId()));
            if (upfTerminationDl.needsDropping()) {
                actionBuilder.withId(PRE_QOS_PIPE_DOWNLINK_TERM_DROP);
            } else {
                actionBuilder.withParameter(new PiActionParam(TEID, upfTerminationDl.teid())).withParameter(new PiActionParam(QFI, upfTerminationDl.qfi()));
                if (upfTerminationDl.trafficClass() != null) {
                    actionBuilder.withId(PRE_QOS_PIPE_DOWNLINK_TERM_FWD);
                    actionBuilder.withParameter(new PiActionParam(TC, upfTerminationDl.trafficClass()));
                } else {
                    actionBuilder.withId(PRE_QOS_PIPE_DOWNLINK_TERM_FWD_NO_TC);
                }
                actionBuilder.withParameter(new PiActionParam(APP_METER_IDX, upfTerminationDl.appMeterIdx()));
            }
            break;
        case TUNNEL_PEER:
            tableEntryBuilder.forTable(PRE_QOS_PIPE_TUNNEL_PEERS);
            UpfGtpTunnelPeer gtpTunnelPeer = (UpfGtpTunnelPeer) entity;
            matchBuilder.addFieldMatch(new PiExactFieldMatch(HDR_TUNNEL_PEER_ID, ImmutableByteSequence.copyFrom(gtpTunnelPeer.tunPeerId())));
            actionBuilder.withId(PRE_QOS_PIPE_LOAD_TUNNEL_PARAM).withParameter(new PiActionParam(SRC_ADDR, gtpTunnelPeer.src().toOctets())).withParameter(new PiActionParam(DST_ADDR, gtpTunnelPeer.dst().toOctets())).withParameter(new PiActionParam(SPORT, gtpTunnelPeer.srcPort()));
            break;
        case APPLICATION:
            tableEntryBuilder.forTable(PRE_QOS_PIPE_APPLICATIONS);
            UpfApplication application = (UpfApplication) entity;
            tableEntryBuilder.withPriority(application.priority());
            actionBuilder.withId(PRE_QOS_PIPE_SET_APP_ID).withParameter(new PiActionParam(APP_ID, application.appId()));
            matchBuilder.addFieldMatch(new PiExactFieldMatch(HDR_SLICE_ID, ImmutableByteSequence.copyFrom((byte) application.sliceId())));
            if (application.ip4Prefix().isPresent()) {
                Ip4Prefix ipPrefix = application.ip4Prefix().get();
                matchBuilder.addFieldMatch(new PiLpmFieldMatch(HDR_APP_IP_ADDR, ImmutableByteSequence.copyFrom(ipPrefix.address().toOctets()), ipPrefix.prefixLength()));
            }
            if (application.l4PortRange().isPresent()) {
                Range<Short> portRange = application.l4PortRange().get();
                matchBuilder.addFieldMatch(new PiRangeFieldMatch(HDR_APP_L4_PORT, ImmutableByteSequence.copyFrom(portRange.lowerEndpoint()), ImmutableByteSequence.copyFrom(portRange.upperEndpoint())));
            }
            if (application.ipProto().isPresent()) {
                byte ipProto = application.ipProto().get();
                matchBuilder.addFieldMatch(new PiTernaryFieldMatch(HDR_APP_IP_PROTO, ImmutableByteSequence.copyFrom(ipProto), ImmutableByteSequence.ofOnes(1)));
            }
            break;
        case SESSION_METER:
        case APPLICATION_METER:
        case COUNTER:
        default:
            throw new Up4TranslationException("Attempting to translate an unsupported UPF entity to a table entry! " + entity);
    }
    return tableEntryBuilder.withMatchKey(matchBuilder.build()).withAction(actionBuilder.build()).build();
}
Also used : UpfSessionUplink(org.onosproject.net.behaviour.upf.UpfSessionUplink) PiMatchKey(org.onosproject.net.pi.runtime.PiMatchKey) UpfTerminationDownlink(org.onosproject.net.behaviour.upf.UpfTerminationDownlink) PiRangeFieldMatch(org.onosproject.net.pi.runtime.PiRangeFieldMatch) UpfSessionDownlink(org.onosproject.net.behaviour.upf.UpfSessionDownlink) UpfApplication(org.onosproject.net.behaviour.upf.UpfApplication) PiTernaryFieldMatch(org.onosproject.net.pi.runtime.PiTernaryFieldMatch) UpfGtpTunnelPeer(org.onosproject.net.behaviour.upf.UpfGtpTunnelPeer) UpfTerminationUplink(org.onosproject.net.behaviour.upf.UpfTerminationUplink) PiAction(org.onosproject.net.pi.runtime.PiAction) PiLpmFieldMatch(org.onosproject.net.pi.runtime.PiLpmFieldMatch) PiTableEntry(org.onosproject.net.pi.runtime.PiTableEntry) UpfInterface(org.onosproject.net.behaviour.upf.UpfInterface) PiExactFieldMatch(org.onosproject.net.pi.runtime.PiExactFieldMatch) Ip4Prefix(org.onlab.packet.Ip4Prefix) PiActionParam(org.onosproject.net.pi.runtime.PiActionParam)

Aggregations

UpfApplication (org.onosproject.net.behaviour.upf.UpfApplication)2 UpfSessionUplink (org.onosproject.net.behaviour.upf.UpfSessionUplink)2 Collection (java.util.Collection)1 Map (java.util.Map)1 Collectors (java.util.stream.Collectors)1 Command (org.apache.karaf.shell.api.action.Command)1 Service (org.apache.karaf.shell.api.action.lifecycle.Service)1 DownlinkUpfFlow (org.omecproject.up4.impl.DownlinkUpfFlow)1 Up4AdminService (org.omecproject.up4.impl.Up4AdminService)1 Up4Utils.ppUpfMeter (org.omecproject.up4.impl.Up4Utils.ppUpfMeter)1 UplinkUpfFlow (org.omecproject.up4.impl.UplinkUpfFlow)1 Ip4Prefix (org.onlab.packet.Ip4Prefix)1 AbstractShellCommand (org.onosproject.cli.AbstractShellCommand)1 UpfEntity (org.onosproject.net.behaviour.upf.UpfEntity)1 UpfEntityType (org.onosproject.net.behaviour.upf.UpfEntityType)1 UpfGtpTunnelPeer (org.onosproject.net.behaviour.upf.UpfGtpTunnelPeer)1 UpfInterface (org.onosproject.net.behaviour.upf.UpfInterface)1 UpfMeter (org.onosproject.net.behaviour.upf.UpfMeter)1 UpfSessionDownlink (org.onosproject.net.behaviour.upf.UpfSessionDownlink)1 UpfTerminationDownlink (org.onosproject.net.behaviour.upf.UpfTerminationDownlink)1