나는 다음에 해당하고 싶지 :설정된 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 자바 코드에서이 작업을 수행 할 수 있습니다? 내가 찾을 수있는 몇 가지 예를 기반으로 시도했지만 아무런 흐름이 나타나지 않았거나 때로는 충분한 조정을 통해 흐름의 일부를 표시 할 수있었습니다 (나는 출력 작업을 볼 수 없었습니다). 나는 탄소 개발 (탄소의 최신 버전)을 사용하여 개발하고 있습니다. 야간 스냅 샷으로 전환 할 가치가 있습니까?
opendaylight로이 작업을 수행 할 때 vlan과 관련이있는 작업이 내 흐름에 나타나지 않습니다. 흐름에 goto 만 나타납니다.
내가 설정하고 VLAN 태그를 만들려면 다음 자바 코드를 사용(아래 대답에 의해 제안) ===
=== UPDATE :
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 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를 제거하면 config 데이터 저장소에서 푸시 흐름을 볼 수 있습니다. 내가 고토를 넣으면 고토 만 나타난다.
==== 최종 업데이트 2 ====
내가 opendaylight soutbound에서 VLAN 흐름에 대한 이슈 트래커에 문제가 파손되고 있지만 2014 년에 수정 된 것으로 나타납니다 볼 (?).
질소로 고정 되었습니까? 그리고 opendaylight에 대한 버그를 신고하려면 어떻게해야합니까?
안타깝게도 작동하지 않았습니다. 내 테이블은 여전히 있습니다 : cookie = 0x523f476a, 기간 = 0.012s, 테이블 = 2, n_packets = 0, n_bytes = 0, hard_timeout = 30000, 우선 순위 = 35, metadata = 0x523f476a actions = goto_table : 3. – LostInTheFrequencyDomain
위의 업데이트를 참조하십시오. 어떤 도움을 주셔서 감사합니다. – LostInTheFrequencyDomain
setField가 VlanMatchBuilder()와 같은 이유는 무엇입니까? 나는 프로그래밍 모델에 대해 혼란 스럽다. – LostInTheFrequencyDomain