如何创建一个设置VLAN的流量?

我想做以下等效:如何创建一个设置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代码?我试着基于我能找到的一些例子,但没有流动出现,或者有时需要足够的调整,我可以让一部分流出现(我永远无法看到输出动作)。我正在使用碳(最新版本的碳)来开发我的产品。是否值得切换到夜间快照?

当我用opendaylight这样做时,我发现任何与vlan有关的操作都不会出现在我的流程中。流程中只出现goto。

=== UPDATE ===

我用下面的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设置只是不见了。

====结束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=[]]

我看不出有什么问题。

===结束时更新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年(?)。

这是固定在氮气中,我怎么能提交一个bug反对opendaylight?

回答:

试试这个:

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。

以上是 如何创建一个设置VLAN的流量? 的全部内容, 来源链接: utcz.com/qa/257494.html

回到顶部