PortNumber 是 ONOS 中用于表示网络设备端口的一个类。它封装了端口的标识符,并提供了一些常用的端口常量和方法。

  • IN_PORT:表示数据包的输入端口。当数据包需要发送回它进入的端口时使用。
  • TABLE:表示数据包需要发送到下一张流表进行处理。用于多表流水线处理。
  • NORMAL:表示数据包需要按照交换机的正常处理路径进行处理。通常用于硬件交换机的默认路径。
  • FLOOD:表示数据包需要洪泛到所有端口,除了输入端口和被禁止的端口。用于广播数据包到网络中的所有节点。
  • ALL:表示数据包需要发送到所有端口,包括输入端口。与 FLOOD 不同,ALL 包括输入端口。
  • LOCAL:表示数据包需要发送到控制器本地接口。用于与控制器进行通信。

TrafficSelector 是ONOS中的一个接口,用于定义流表项的匹配条件。它类似于OpenFlow中的匹配字段,用于指定哪些数据包应该与流表项匹配,从而触发相应的处理动作。

  • matchEthSrc(MacAddress mac): 匹配源MAC地址。
  • matchEthDst(MacAddress mac): 匹配目的MAC地址。
  • matchIPSrc(IpPrefix ip): 匹配源IP地址。
  • matchIPDst(IpPrefix ip): 匹配目的IP地址。
  • matchTcpSrc(TpPort port): 匹配源TCP端口。
  • matchTcpDst(TpPort port): 匹配目的TCP端口。
  • matchUdpSrc(TpPort port): 匹配源UDP端口。
  • matchUdpDst(TpPort port): 匹配目的UDP端口。
// 构建流表项匹配条件
        TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
        selectorBuilder.matchEthSrc(MacAddress.valueOf("00:11:22:33:44:55"))
                       .matchEthDst(MacAddress.valueOf("66:77:88:99:AA:BB"))
                       .matchIPSrc(IpPrefix.valueOf("192.168.1.1/32"))
                       .matchIPDst(IpPrefix.valueOf("192.168.1.2/32"))
                       .matchTcpSrc(TpPort.tpPort(80))
                       .matchTcpDst(TpPort.tpPort(8080))
                       .matchInPort(PortNumber.portNumber(1))
                       .matchVlanId(VlanId.vlanId((short) 100))
                       .matchEthType(Ethernet.TYPE_IPV4)
                       .matchIPProtocol(IPv4.PROTOCOL_TCP);

        TrafficSelector selector = selectorBuilder.build();

TrafficTreatment 是 ONOS 中用于定义流表项的处理动作的接口。它类似于 OpenFlow 中的动作列表,用于指定当数据包匹配流表项时应该执行的操作。通过 TrafficTreatment,你可以定义诸如转发、修改数据包字段、丢弃数据包等操作。

//设置数据包的输出端口。
builder.setOutput(PortNumber.portNumber(1));
//设置数据包的 VLAN ID。
builder.setVlanId(VlanId.vlanId((short) 100));
//移除数据包的 VLAN 标签。
builder.popVlan();
builder.pushVlan(Ethernet.TYPE_VLAN);
builder.setEthSrc(MacAddress.valueOf("00:11:22:33:44:55"));
builder.setEthDst(MacAddress.valueOf("66:77:88:99:AA:BB"));
builder.setIpDst(IpAddress.valueOf("192.168.1.2"));
builder.setTcpSrc(TpPort.tpPort(80));
builder.setQueue(1);
builder.setMpls(MplsLabel.mplsLabel(100));
//转移到另一个流表。
builder.transition(2);
builder.drop();

ForwardingObjective 是 ONOS 中用于定义流量转发行为的一个接口。它提供了一种抽象的方式来指定如何处理和转发网络流量。ForwardingObjective 通常与 FlowObjectiveService 一起使用,用于安装、删除或修改流表项。

withSelector(TrafficSelector selector)//设置流量选择器。
withTreatment(TrafficTreatment treatment)//设置流量处理器。
withFlag(ForwardingObjective.Flag flag)
makePermanent() //设置为永久性流表项。
makeTemporary(int timeout)//设置为临时流表项,并指定超时时间。
add()//添加流表项

ForwardingObjective forwardingObjective = DefaultForwardingObjective.builder()
                .withSelector(selectorBuilder.build())
                .withTreatment(treatment)
                .withPriority(10)
                .withFlag(ForwardingObjective.Flag.VERSATILE)
                .fromApp(appId)
                .makePermanent()
                .add();

        flowObjectiveService.forward(src.deviceId(), forwardingObjective);

TopologyService 是 ONOS(Open Network Operating System)中的一个核心服务接口,用于管理和查询网络拓扑信息。它提供了一组方法,用于获取网络设备、链路、路径等拓扑相关的信息,并支持拓扑事件监听,以便在拓扑变化时进行响应。

TopologyService 的主要功能
TopologyService 提供了以下主要功能:

  • 获取当前拓扑:
    获取当前的网络拓扑对象。
    获取当前拓扑的设备、链路和主机信息。
  • 路径计算:
    计算从一个设备到另一个设备的所有路径。
    计算从一个设备到另一个设备的最短路径。
  • 拓扑事件监听:
    注册和注销拓扑事件监听器,以便在拓扑变化时收到通知。
package org.onosproject.sample;

import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.net.DeviceId;
import org.onosproject.net.Path;
import org.onosproject.net.topology.Topology;
import org.onosproject.net.topology.TopologyService;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Set;

@Component(immediate = true)
public class TopologyServiceExample {

    private final Logger log = LoggerFactory.getLogger(getClass());

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected TopologyService topologyService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected CoreService coreService;

    private ApplicationId appId;

    public void activate() {
        appId = coreService.registerApplication("org.onosproject.sample");
        log.info("TopologyServiceExample started with Application ID {}", appId.id());

        // 获取当前拓扑
        Topology topology = topologyService.currentTopology();
        log.info("Current topology: {}", topology);

        // 获取网络中的所有设备
        Set<DeviceId> deviceIds = topologyService.getDeviceIds();
        for (DeviceId deviceId : deviceIds) {
            log.info("Device ID: {}", deviceId);
        }

        // 计算从一个设备到另一个设备的所有路径
        DeviceId src = DeviceId.deviceId("of:0000000000000001");
        DeviceId dst = DeviceId.deviceId("of:0000000000000002");
        Set<Path> paths = topologyService.getPaths(topology, src, dst);
        for (Path path : paths) {
            log.info("Path: {}", path);
        }
    }

    public void deactivate() {
        log.info("TopologyServiceExample stopped");
    }
}

TopologyListener 是 ONOS(Open Network Operating System)中的一个接口,用于监听网络拓扑的变化事件。当网络拓扑发生变化时,例如设备添加或移除、链路状态变化等,TopologyListener 会接收到相应的事件通知。通过实现 TopologyListener 接口,开发者可以在拓扑变化时执行特定的操

package org.onosproject.sample;

import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.net.topology.TopologyEvent;
import org.onosproject.net.topology.TopologyListener;
import org.onosproject.net.topology.TopologyService;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(immediate = true)
public class TopologyListenerExample {

    private final Logger log = LoggerFactory.getLogger(getClass());

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected TopologyService topologyService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected CoreService coreService;

    private ApplicationId appId;
    private InternalTopologyListener listener = new InternalTopologyListener();

    public void activate() {
        appId = coreService.registerApplication("org.onosproject.sample");
        log.info("TopologyListenerExample started with Application ID {}", appId.id());

        // 注册拓扑监听器
        topologyService.addListener(listener);
    }

    public void deactivate() {
        // 注销拓扑监听器
        topologyService.removeListener(listener);
        log.info("TopologyListenerExample stopped");
    }

    // 内部类实现TopologyListener接口
    private class InternalTopologyListener implements TopologyListener {
        @Override
        public void event(TopologyEvent event) {
            log.info("Received topology event: {}", event);
            switch (event.type()) {
                case TOPOLOGY_CHANGED:
                    log.info("Topology changed");
                    break;
                case TOPOLOGY_INIT:
                    log.info("Topology initialized");
                    break;
                case TOPOLOGY_RECOMPUTED:
                    log.info("Topology recomputed");
                    break;
                default:
                    log.warn("Unknown topology event type: {}", event.type());
            }
        }
    }
}

AbstractStore 是 ONOS 中的一个抽象类,用于简化存储服务的实现。它提供了一些基本的存储功能和事件处理机制,供具体的存储实现类继承和扩展。通过继承 AbstractStore,开发者可以更方便地实现自定义的存储服务,同时利用其内置的事件处理机制。
在 ONOS(Open Network Operating System)中,ACL(访问控制列表)是一种用于控制网络流量的机制。通过定义一组规则,ACL 可以允许或拒绝特定的数据包流入或流出网络设备。ACL 通常用于实现网络安全策略,如防火墙规则、流量过滤等。

package org.onosproject.sample;

import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.net.flow.DefaultFlowRule;
import org.onosproject.net.flow.FlowRule;
import org.onosproject.net.flow.FlowRuleService;
import org.onosproject.net.flow.criteria.Criterion;
import org.onosproject.net.flow.criteria.Criteria;
import org.onosproject.net.flow.instructions.Instructions;
import org.onosproject.net.DeviceId;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(immediate = true)
public class AclExample {

    private final Logger log = LoggerFactory.getLogger(getClass());

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected FlowRuleService flowRuleService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected CoreService coreService;

    private ApplicationId appId;

    public void activate() {
        appId = coreService.registerApplication("org.onosproject.sample");
        log.info("ACL Example started with Application ID {}", appId.id());

        // 定义设备ID,假设所有规则应用于同一个设备
        DeviceId deviceId = DeviceId.deviceId("of:0000000000000001");

        // 允许从 192.168.1.0/24 到 10.0.0.0/24 的所有流量
        FlowRule allowRule = DefaultFlowRule.builder()
            .forDevice(deviceId)
            .withSelector(DefaultTrafficSelector.builder()
                .matchIPSrc(IpPrefix.valueOf("192.168.1.0/24"))
                .matchIPDst(IpPrefix.valueOf("10.0.0.0/24"))
                .build())
            .withTreatment(DefaultTrafficTreatment.builder()
                .setOutput(PortNumber.NORMAL)
                .build())
            .withPriority(40000)
            .fromApp(appId)
            .makePermanent()
            .build();

        // 拒绝从 192.168.2.0/24 到 10.0.0.0/24 的所有流量
        FlowRule denyRule = DefaultFlowRule.builder()
            .forDevice(deviceId)
            .withSelector(DefaultTrafficSelector.builder()
                .matchIPSrc(IpPrefix.valueOf("192.168.2.0/24"))
                .matchIPDst(IpPrefix.valueOf("10.0.0.0/24"))
                .build())
            .withTreatment(DefaultTrafficTreatment.builder()
                .drop()
                .build())
            .withPriority(40001)
            .fromApp(appId)
            .makePermanent()
            .build();

        // 添加流表规则
        flowRuleService.applyFlowRules(allowRule, denyRule);
        log.info("ACL rules applied");
    }

    public void deactivate() {
        log.info("ACL Example stopped");
    }
}

putao
5 声望0 粉丝

推动世界向前发展,改善民生。


« 上一篇
rust解惑--解构
下一篇 »
rust解惑--并发

引用和评论

0 条评论