iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 20
1

前言

昨天建立ONOS控制器的環境與ONOS APP的開發環境,今天會介紹如何撰寫一般switch轉發的功能

以下程式碼可以在這邊找到 https://github.com/opennetworkinglab/onos/blob/master/apps/learning-switch/src/main/java/org/onosproject/learningswitch/LearningSwitchSolution.java

實做

實做前需要了解幾項OSON提供的物件

  • CoreService: 負責與控制器的核心系統溝通
  • FlowRuleService: 能將Flow規則部署到環境中,反之,亦能提取現有的Flow規則資訊
  • PacketService: 能獲取Data Plane的package與直接發射package到目標port

ONOS應用程式中的生命週期,activate()代表著服務的開始,要先與控制器註冊。
先實例化SwitchPacketProcessor物件,裡面有時做PacketProcessor的抽象類別,當有封包通過時則會觸發該方法。
此APP是實做轉發功能的工作,只處理PV4與ARP的package,所以預先限制。

@Activate
protected void activate() {
    appId = coreService.getAppId("org.foo.app"); //與pom.xml檔案中的名字相同

    processor = new SwitchPacketProcessor();
    packetService.addProcessor(processor, PacketProcessor.director(3));

    /*
     * 限制packet類型為IPV4與ARP
     */
    packetService.requestPackets(DefaultTrafficSelector.builder()
                .matchEthType(Ethernet.TYPE_IPV4).build(), PacketPriority.REACTIVE, appId, Optional.empty());
    packetService.requestPackets(DefaultTrafficSelector.builder()
                .matchEthType(Ethernet.TYPE_ARP).build(), PacketPriority.REACTIVE, appId, Optional.empty());
}

剛剛提到的SwitchPacketProcessor類別因實做PacketProcessor需覆寫process方法,在裡面有呼叫兩個方法,initMacTable與actLikeSwitch。
而initMacTable的目的為實做一般switch上紀錄mac表,macTables變數紀錄者那一台裝置(switch)上的來源的mac與來源port。

private class SwitchPacketProcessor implements PacketProcessor {
    @Override
    public void process(PacketContext pc) {
        initMacTable(pc.inPacket().receivedFrom());
        actLikeSwitch(pc);
    }
protected Map<DeviceId, Map<MacAddress, PortNumber>> macTables = Maps.newConcurrentMap();    
private void initMacTable(ConnectPoint cp) {
    macTables.putIfAbsent(cp.deviceId(), Maps.newConcurrentMap());
}

在process方法裡呼叫的actLikeSwitch方法其目的流程:

  • 首次封包打出時,先紀錄該封包來源port與來源mac,且透過PacketContext物件得到目標mac位置資訊,並使用該mac位置進行查找,但第一次還未有目標port的資訊,判斷式會不成立。
  • 進入到了else 呼叫actLikeHub方法,那actLikeHub的方法可以清楚的看到發出了廣播
  • 當搜尋到了該封包並回應該目標位置的資訊(ARP),所以PacketProcessor會再次被調用
  • 做的事情一樣先記錄下來該目的封包的來源port與來源mac
  • 已經有了目標的port號,理所當然這次能夠順利轉發。而成立條件內有做兩件事情:直接把封包送到目標port號,與建立新的Flow規則。規則的內容為match條件是匹配目的mac,行為是轉發到目的port,優先權為5(REACTIVE),規則未匹配而存活時間為60秒。
public void actLikeSwitch(PacketContext pc) {
    Short type = pc.inPacket().parsed().getEtherType();
    if (type != Ethernet.TYPE_IPV4 && type != Ethernet.TYPE_ARP) {
        return;
    }
    ConnectPoint cp = pc.inPacket().receivedFrom();
    Map<MacAddress, PortNumber> macTable = macTables.get(cp.deviceId());
    MacAddress srcMac = pc.inPacket().parsed().getSourceMAC();
    MacAddress dstMac = pc.inPacket().parsed().getDestinationMAC();
    macTable.put(srcMac, cp.port());
    PortNumber outPort = macTable.get(dstMac);
    if (outPort != null) {
      pc.treatmentBuilder().setOutput(outPort);
      FlowRule fr = DefaultFlowRule.builder()
              .withSelector(DefaultTrafficSelector.builder().matchEthDst(dstMac).build())
              .withTreatment(DefaultTrafficTreatment.builder().setOutput(outPort).build())
              .forDevice(cp.deviceId()).withPriority(PacketPriority.REACTIVE.priorityValue())
              .makeTemporary(60)
              .fromApp(appId).build();
      flowRuleService.applyFlowRules(fr);
      pc.send();
    } else {
        actLikeHub(pc);
    }
}
public void actLikeHub(PacketContext pc) {
    pc.treatmentBuilder().setOutput(PortNumber.FLOOD);
    pc.send();
}

最後在應用程式刪除時,調用deactivate刪除PacketProcessor

@Deactivate
protected void deactivate() {
    packetService.removeProcessor(processor);
}

將應用程式編譯,並推送到控制器上

source $ONOS_ROOT/tools/dev/bash_profile
mvn clean install
onos-app <control ip> reinstall target/foo-app-1.0-SNAPSHOT.oar

使用Mininet將OVS連接到控制器上

mn --controller=remote,ip=<control ip> --mac --topo=single,2 --switch ovsk,protocols=OpenFlow13

可以登入到ONOS dashboard
http:// (control ip) :8181/onos/ui/

帳號 onos 密碼 rocks

安裝必要與剛剛撰寫的APP
需要安裝 APP ID為org.onosproject.openflow 以啟用openflow協定
https://ithelp.ithome.com.tw/upload/images/20191006/20121070m1G9Nt0qmv.png
找到自己的APP ID本篇為org.foo.app
https://ithelp.ithome.com.tw/upload/images/20191006/20121070Ta7hYMBmgY.png

使用ping工具測試其結果
https://ithelp.ithome.com.tw/upload/images/20191006/20121070EQqKyqnhsN.png
查看dashboard上所顯示的網路拓樸
https://ithelp.ithome.com.tw/upload/images/20191006/20121070rBEWqN6Trz.png
查看dashboard上所顯示產生的Flow規則
https://ithelp.ithome.com.tw/upload/images/20191006/201210706kDEgj0HTM.png

Reference

https://github.com/opennetworkinglab/onos


上一篇
Day19 - Mininet 與 ONOS I
下一篇
Day21 - NFV MANO介紹
系列文
SDN/NFV 網路虛擬化調度平台30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言