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");
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。