首页 文章

如何创建set vlan流?

提问于
浏览
0

我想做相同的以下内容:

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出现在流程中 .

===更新===

我使用以下java代码来设置和创建vlan标记(通过以下答案建议):

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();
}

创建流规则的代码如下:

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));

在调用代码后,我在openvswitch中看到了这个:

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设置刚刚消失了 .

====结束更新====

====更新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=[]]

我看不出有什么不妥 .

===结束更新1 ===

===更新2 ===

当我删除goto并遵循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的错误?

2 回答

  • 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

    升级到氮气后,我发现我的问题消失了 . 因此,Carbon发布中似乎存在一个错误 . 不知道什么时候修好了 .

相关问题