2017-12-02 5 views
0

は、私は次の同等をしたい:VLAN設定フローの作成方法は?

sudo ovs-ofctl add-flow s1 table=2,metadata=1379878762,actions=push_vlan:0x8100,mod_vlan_vid:4000,output:6,goto_table:4 -O openflow13 

どのように私はopendaylight Javaコードでこれを行うことができますか?私は見つけることができるいくつかの例に基づいて試みましたが、フローが現れなかったり、時には十分な微調整を行ってフローの一部を表示することができました(私は出力アクションを見ることができませんでした)。私は私の開発にCarbon(最新のカーボン版)を使用しています。夜間のスナップショットに切り替える価値はありますか?

opendaylightでこれを行うと、vlanと関係がある動作がフローに表示されないことがわかります。フローにはgotoだけが表示されます。

=== === UPDATE

私は(下記の答えによって提案された)、VLANタグを設定して作成するには、次のJavaコードを使用します。

private static Instruction createSetVlanAndOutputToPortInstructions(int vlanId, 
     String outputPortUri) { 

    List<Action> actionList = new ArrayList<>(); 
    ActionBuilder ab = new ActionBuilder(); 

    Integer VLAN_ETHERTYPE = 0x8100; 
    ActionBuilder actionBuilder = new ActionBuilder(); 

    //push vlan 
    Action pushVlanAction = actionBuilder 
     .setOrder(0).setAction(new PushVlanActionCaseBuilder() 
      .setPushVlanAction(new PushVlanActionBuilder() 
       .setEthernetType(VLAN_ETHERTYPE) 
        .build()) 
        .build()) 
       .build(); 
    actionList.add(pushVlanAction); 

    //set vlan id 

    SetVlanIdActionBuilder tab = new SetVlanIdActionBuilder(); 
    tab.setVlanId(new VlanId((int) vlanId)); 
    SetVlanIdActionCaseBuilder vidcb = new SetVlanIdActionCaseBuilder(); 
    vidcb.setSetVlanIdAction(tab.build()); 
    Action setVlanIdAction = actionBuilder.setOrder(1).setAction(vidcb.build()).build(); 



    OutputActionBuilder output = new OutputActionBuilder(); 
    output.setMaxLength(Integer.valueOf(0xffff)); 

    Uri controllerPort = new Uri(outputPortUri); 
    output.setOutputNodeConnector(controllerPort); 

    ab = new ActionBuilder(); 
    ab.setKey(new ActionKey(0)); 
    ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build()); 
    ab.setOrder(2); 
    actionList.add(ab.build()); 

    ApplyActionsBuilder aab = new ApplyActionsBuilder(); 

    aab.setAction(actionList); 

    InstructionBuilder ib = new InstructionBuilder(); 
    ib.setKey(new InstructionKey(0)); 
    ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build()); 

    return ib.build(); 
} 

フロールールを作成するコードがありますここに:私はopenvswitchでこれを参照してくださいコードを呼び出す際に

FlowBuilder tagPacketFlow = new FlowBuilder().setTableId((short) tableId) 
      .setFlowName("metadataMatchSetVlanTagSendToPortAndGoToStripVlanTagTable").setId(flowId) 
      .setKey(new FlowKey(flowId)).setCookie(flowCookie); 
    MatchBuilder matchBuilder = new MatchBuilder(); 
    createMetadataMatch(matchBuilder, flowCookie.getValue()); 

    InstructionBuilder ib = new InstructionBuilder(); 
    Instruction createVlanTag = FlowUtils.createSetVlanAndOutputToPortInstructions(
      SdnMudConstants.MUD_RULE_HIT_LABEL, outputPortUri); 

    InstructionsBuilder insb = new InstructionsBuilder(); 
    ArrayList<Instruction> instructions = new ArrayList<Instruction>(); 
    instructions.add(createVlanTag); 
    Instruction gotoInstruction = ib.setInstruction(new GoToTableCaseBuilder() 
      .setGoToTable(new GoToTableBuilder().setTableId(SdnMudConstants.STRIP_VLAN_RULE_TABLE).build()).build()) 
      .setOrder(3) 
      .setKey(new InstructionKey(0)).build(); 
    instructions.add(gotoInstruction); 

    insb.setInstruction(instructions); 
    tagPacketFlow.setMatch(matchBuilder.build()).setInstructions(insb.build()) 
      .setPriority(35).setBufferId(OFConstants.ANY) 
      .setHardTimeout(time).setIdleTimeout(0).setFlags(new FlowModFlags(false, false, false, false, false)); 

cookie=0x523f476a, duration=0.012s, table=2, n_packets=0, n_bytes=0, hard_timeout=30000, priority=35,metadata=0x523f476a actions=goto_table:3 

そして、ここでは、この流れに対応するコンフィグデータストアからのダンプです:

{ 
         "buffer_id": 4294967295, 
         "cookie": 1379878762, 
         "flags": "", 
         "flow-name": "metadataMatchSetVlanTagSendToPortAndGoToStripVlanTagTable", 
         "hard-timeout": 30000, 
         "id": "toaster.nist.gov/42", 
         "idle-timeout": 0, 
         "instructions": { 
          "instruction": [ 
           { 
            "go-to-table": { 
             "table_id": 3 
            }, 
            "order": 0 
           } 
          ] 
         }, 
         "match": { 
          "metadata": { 
           "metadata": 1379878762 
          } 
         }, 
         "priority": 35, 
         "table_id": 2 
        } 

だから、VLAN設定はちょうど消えました。

====エンドUPDATE ====

==== UPDATE 1 ====

私は、トランザクションをコミットする前に流れをログに記録。設定されたVLAN命令は次のとおりです。

ApplyActionsCase [_applyActions=ApplyActions 
     [_action=[Action [_action=PushVlanActionCase 
     [_pushVlanAction=PushVlanAction [_ethernetType=33024, 
     _vlanId=VlanId [_value=1001], augmentation=[]], augmentation=[]], 
    _key=ActionKey [_order=0], _order=0, augmentation=[]], 
     Action [_action=SetVlanIdActionCase[_setVlanIdAction=SetVlanIdAction 
    [_vlanId=VlanId [_value=1001], augmentation=[]], 
    augmentation=[]], _key=ActionKey [_order=1], _order=1, 
    augmentation=[]], Action [_action=OutputActionCase 
    [_outputAction=OutputAction [_maxLength=65535, 
    _outputNodeConnector=Uri [_value=openflow:1:6], 
     augmentation=[]], augmentation=[]], 
    _key=ActionKey [_order=2], _order=2, 
     augmentation=[]]], augmentation=[]], augmentation=[]] 

私は間違ったことはありません。

===エンドUPDATE 1 ===

===アップデート2 ===私は後藤を削除し、ここでは、XMLのパターンに従う

https://wiki.opendaylight.org/view/Editing_OpenDaylight_OpenFlow_Plugin:End_to_End_Flows:Example_Flows#Push_VLAN

それgotoなしでのみ動作します。言い換えれば、私がgotoを削除すると、設定データストアでプッシュフローが表示されます。私がgotoを入れると、gotoだけが現れます。

====終了アップデート2 ====

私はopendaylight soutboundでVLANフローに関する課題追跡で問題が破壊されるが、2014年に修正されているよう参照(?)。

これは窒素で固定されていますか?opendaylightに対して不具合を提出するにはどうすればよいですか?

答えて

0

これを試してみてください:

Integer VLAN_ETHERTYPE = 0x8100; 
ActionBuilder actionBuilder = new ActionBuilder(); 
List<Action> actions = new ArrayList<>(); 

//push vlan 
Action pushVlanAction = actionBuilder 
    .setOrder(0).setAction(new PushVlanActionCaseBuilder() 
     .setPushVlanAction(new PushVlanActionBuilder() 
      .setEthernetType(VLAN_ETHERTYPE) 
       .build()) 
       .build()) 
      .build(); 
actions.add(pushVlanAction); 

//set vlan id 
Action setVlanIdAction = actionBuilder 
    .setOrder(1).setAction(new SetFieldCaseBuilder() 
     .setSetField(new SetFieldBuilder() 
      .setVlanMatch(new VlanMatchBuilder() 
       .setVlanId(new VlanIdBuilder() 
        .setVlanId(new VlanId(vlanID)) 
        .setVlanIdPresent(true) 
       .build()) 
      .build()) 
     .build()) 
    .build()) 
    .build(); 
actions.add(setVlanIdAction); 

はその後、次の方法であなたの命令にあなたの行動を追加する必要があります。

//ApplyActions 
ApplyActions applyActions = new ApplyActionsBuilder().setAction(actions).build(); 

//Instruction 
Instruction applyActionsInstruction = new InstructionBuilder() 
     .setOrder(0).setInstruction(new ApplyActionsCaseBuilder() 
       .setApplyActions(applyActions) 
       .build()) 
      .build(); 

はまた見る hereを取ります。

+0

残念ながら動作しませんでした。私のテーブルはまだあります:クッキー= 0x523f476a、期間= 0.012s、テーブル= 2、n_packets = 0、n_bytes = 0、ハード_タイムアウト= 30000、プライオリティ= 35、メタデータ= 0x523f476aアクション= goto_table:3。 – LostInTheFrequencyDomain

+0

上記の更新をご覧ください。助けてくれてありがとう。 – LostInTheFrequencyDomain

+0

なぜsetFieldはVlanMatchBuilder()と同じですか?私はプログラミングモデルについて混乱しています。 – LostInTheFrequencyDomain

関連する問題