ARPHandler为网络主机发送的ARP请求与回应提供服务。而且它允许控制器自身创造ARP消息。
odl上的ARP处理并没有用请求者的MAC地址,这是为了避免构造转发ARP请求的生成树。
当你在一个不是树形的网络中,为了到达需要被洪泛的地址,ARP请求包被广播。
ARPhandler模块中实现的几个接口:
IHostFinder:这个接口定义了触发主机发现的方法,并且探测一个学习到的主机是否还在网络中。
public void find(InetAddress networkAddress);
基于IP地址初始化主机发现,是有hostracker的应用请求触发的。请求的IP地址当时并不在当地的数据库中。
参数:InetAddress类型的网络IP地址。
public void probe(HostNodeConnector host);
被hostracker调用,探测学习到的主机是否还在网络中。
参数:需要被探测的host
IListenDataPacket:监听数据包接口,详见数据包监听那篇
ICacheUpdateAware<ARPEvent, Boolean>:组件想要获得通知集群缓存更新的通知实现的接口
几个重要的成员函数:
protected void sendARPReply(NodeConnector p, byte[] sMAC, InetAddress sIP, byte[] tMAC, InetAddress tIP, short vlan)
参数:发送ARPreply报文的nodeconnector,源MAC地址,源IP地址,目标MAC地址,目标IP地址,vlan号
功能:发送ARPReply
protected void handleARPPacket(Ethernet eHeader, ARP pkt, NodeConnector p, short vlan)
参数:以太网包头,ARP报文,发送的nodeConnector,vlan号
功能:处理解析ARP报文
protected void sendBcastARPRequest(InetAddress targetIP, Subnet subnet)
功能:发送一个广播的ARP请求到交换机的端口,用子网地址作为发送者的IP,控制器的MAC地址作为发送者的MAC,
目标IP地址作为目标网络地址
protected void sendUcastARPRequest(HostNodeConnector host, Subnet subnet)
功能:发送一个单播的ARP请求到已知的具体的交换机的某个端口。发送者的IP是子网的网络地址,
发送者的MAC地址是控制器的MAC地址。
protected void handlePuntedIPPacket(IPv4 pkt, NodeConnector p, short vlan)
iPv4数据包被踢出,如果控制器不知道目的主机 ,需要发送一个广播的ARP请求发现它。
public byte[] getControllerMAC()
获取控制器的MAC
private ARP createARP(short opCode, byte[] senderMacAddress, byte[] senderIP, byte[] targetMacAddress,byte[] targetIP)
构造一个ARP数据包
private Ethernet createEthernet(byte[] sourceMAC, byte[] targetMAC, ARP arp, short vlan)
构造以太网数据包
private void generateAndSendReply(InetAddress sourceIP, byte[] sourceMAC, short vlan)
产生并发送回复报文
routing模块:
routing模块主要就是 Dijkstra算法的实现
需要实现IRouting, ITopologyManagerClusterWideAware接口,其中IRouting是为了查找路径,ITopologyManagerClusterWideAware
是为了保存拓扑,以便路径更新。
IRouting 接口:
接口中定义的一些方法
public Path getRoute(Node src, Node dst);
获取从源节点src到目的节点dst的一条路径
public Path getMaxThroughputRoute(Node src, Node dst);
获取一条从源节点src到目的节点dst的最大吞吐量的路径。
public Path getRoute(Node src, Node dst, Short Bw);
获取一条从源节点到目的节点的满足具体设置的带宽BW的一条路径
public void initMaxThroughput(Map<Edge, Number> EdgeWeightMap);
初始化最大吞吐量
ITopologyManagerClusterWideAware接口继承 ITopologyManagerAware,ITopologyManagerAware又继承IListenTopoUpdates接口
IListenTopoUpdates接口定义了三个方法:
public void edgeUpdate(List<TopoEdgeUpdate> topoedgeupdateList);
当拓扑更新时会被调用来更新拓扑图中的边。
public void edgeOverUtilized(Edge edge);
当一个边的利用率超过设置在控制器上的安全阈值时会被调用
public void edgeUtilBackToNormal(Edge edge);
当一个边的利用率回归到正常状态,安全阈值回归到控制器设置的之下时函数会被调用