Floodlight 入门 之 起步篇 - 如何创建一个PacketOut消息

Floodlight 入门 之 起步篇 - 如何创建一个PacketOut消息

2017-3-4

开辟新篇章,原文链接


介绍

将一个来自控制器的packet插入到OpenFlow-SDN的数据平面通常是很有用的。在这一章中,我们通过从控制器向交换机发送packet-out消息来完成上述功能。通常来说,这个数据是一些包含更高层payload的以太网帧。例如,net.floodlightcontroller.dhcpserver.DHCPServer模块发送包含DHCP reply消息的packet-out消息来回复包含DHCP requests的packet-in消息。(这些 DHCP replies每个都是带IPv4 Payload的以太网帧。这些IPv4 Payload有UDP packet作为它们的payload,最后UDP packet的payload是DHCP packet。)

构成一个packet-out消息,然后将它插入到数据平面,总体而言,我们需要做的事是:

  • 创造被插入数据的每一层,设置header数据域。
  • 设置每一层的payload作为下一个更高的一层。
  • 将Ethernet对象串行化为字节数组。
  • 组成一个packet-out并将其payload设置为串行的Ethernet对象。
  • 设置输出和输入端口的packe-out
  • 发送packet-out到交换机

举个例子,我们来创建一个UDP packet来插入到数据平面(作为packet-out)。这个例子倾向于展示在一个模块发送一个packet-out所需要的步骤。它的运行不需要依赖任何底层模块。

第一层

概念的介绍,原作者傲娇的的抛出了一个链接,并送给了你一个微笑。

第二层

我们先创建一个Ethernet对象然后按照我们的期望设置其header域。注意,我们这次使用的以太网帧的类型是IPv4.这意味着在以太网帧的payload是一个IPv4的packet。

Ethernet l2 = new Ethernet();
l2.setSourceMACAddress(MacAddress.of("00:00:00:00:00:01"));
l2.setDestinationMACAddress(MacAddress.BROADCAST);
l2.setEtherType(EthType.IPv4);

第三层

我们将创建一个IPv4来放置我们的IPv4 header数据和UDP payload。向上面的Ethernet一样,注意我们要指定packet的类型:

IPv4 l3 = new IPv4();
l3.setSourceAddress(IPv4.of("192.168.1.1"));
l3.setDestinationAddress(IPv4.of("192.168.1.255"));
l3.setTtl((byte) 64);
l3.setProtocol(IpProtocol.UDP);

第四层

下面,我们需要创建一个UDP实例。它将包含UDP相关的header属性和UDP packet的payload:

UDP l4 = new UDP();
l4.setSourcePort(TransportPort.of(65003));
l4.setDestinationPort(TransportPort.of(67));

第7层

UDP packet也包含了其他packet或者header,作者说了一堆。。。想看的话点这个

Data l7 = new Data();
l7.setData(new byte[1000]);

设置payload和serialze

现在我们已经创建每个header。下一步我们将设置每一层的payload:

l2.setPayload(l3);
l3.setPayload(l4);
l4.setPayload(l7);

然后,我们将Ethernet对象串行化,然后依次将里面的每个packet的payload串行化。

byte[] serializedData = l2.serialize();

创建packet-out并写入交换机

最后,我们需要创建packet-out消息并写入交换机。

OFPacketOut po = mySwitch.getOFFactory().buildPacketOut() /* mySwitch is some IOFSwitch object */
    .setData(serializedData)
    .setActions(Collections.singletonList((OFAction) mySwitch.getOFFactory().actions().output(OFPort.FLOOD, 0xffFFffFF)))
    .setInPort(OFPort.CONTROLLER)
    .build();

mySwitch.write(po);

恭喜,你现在已经学会如何玩弄packet-out消息了=-=

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值