opendaylight中数据包监听原理

来源:互联网 发布:鲁滨逊漂流记java游戏 编辑:程序博客网 时间:2024/05/18 02:22

关于odl中数据包监听的原理:

数据包的监听需要实现监听数据包的接口,在接口函数里面实现对数据包的处理。

但是数据包的处理有不同的方式,不同bundle之间处理数据包有着先后顺序。

下面介绍下数据包服务接口与监听数据包接口。

IDataPacketService:在sal模块中定义的,数据包服务的接口,定义了三个方法:

 
  void transmitDataPacket(RawPacket outPkt);//传输数据包
    Packet decodeDataPacket(RawPacket pkt);//对原始的数据包流进行解密
    RawPacket encodeDataPacket(Packet pkt);//对数据包进行加密成字节流


IListenDataPacket 接口:同在sal模块中定义的接口,

所有想要接收数据包的组件都必须实现IListenDataPacket接口。该接口并不指定过滤或序列化机制,提供两种处理数据包的模型。
Serial(串行执行):当一个数据包Handler(数据包服务)必须要得到另一个数据包Handler(数据包服务)的某些额外信息的时候。数据包的处理顺序就必须是串行的。若某项服务丢失,那么所有依赖该服务的其他服务都不能被激活。在串行的处理过程中,如果某个plugin在处理数据包(假设命名为数据包1)后返回结果为CONSUMED,那么处理链中的所有其他的plugin都不能再收到数据包1。如果返回值不为CONSUMED,链中的其他元素还可以继续接收数据包,处理。
Parallel(并行执行):如果一个DataPacketListenner不依赖其他的plugin,也不被其他plugin依赖,那么它和别的Listenner一样,都获得数据包的一份拷贝。例如:我们有两个Handler。都不包含任何依赖。那么他们都会获得全部的传递到控制器的packet。并且不能互相干扰。
    处理模型选择由plugin在向OSGI框架注册服务时提供的以下属性值决定:
 * salListenerName:( SAL Data Packet Listener)SAL数据包监听器唯一标识符
 * salListenerDependency: 一个包含有这个监听器依赖项salListenerName的字符串。目前只支持一个依赖项。
 * salListenerFilter: 一个用来匹配数据包的类。不论是串行还是并行处理模式,数据包都只有先通过过滤器的情况下才能被处理。如果不提供过滤器,那么每个收到的packet都会被处理。也就是说 使用了 “match All”。

public interface IListenDataPacket {

这是处理数据包的Handler。处理结束后返回SAL,如果返回时Packet被consume了,那么SAL就不会将数据包继续传递给链上的其他listenner。但是对于那些没有依赖的listenner,还是会继续收到并处理数据包。对于接收到的数据包我们可以查看IncomingNodeConnector就知道包是从哪里来的了。
    /**
     *
     * @param inPkt 收到的数据包
     *
     * @返回的值指示数据包应该被后续listener处理,还是停止后续处理
     */
    PacketResult receiveDataPacket(RawPacket inPkt);
}


0 0
原创粉丝点击