OpenDaylight Sodium-SR4下L2switch添加2个及以上Action的问题求助
问题原因
你出现覆盖问题是因为没有将多个动作放入统一的Action列表进行批量设置,单独多次调用setAction()或单次仅设置单个Action的操作,都会导致后配置的内容覆盖前者。OpenDaylight的流表动作要求所有需要执行的动作按执行顺序封装到同一个动作列表中,再统一挂载到流表的指令集里。
正确实现步骤
- 按执行顺序分别构造你需要的所有Action实例,每个Action需要指定唯一的
order属性,数值越小越先执行,从0开始计数。比如你需要先配置队列、再转发到指定端口,就把队列Action的order设为0,端口输出Action的order设为1。 - 将构造完成的所有Action实例存入
List<Action>集合。 - 把Action集合封装到
ApplyActionsCase对象中,再将其作为单个Instruction加入到流表的Instructions列表里,最后统一给Flow对象设置该Instructions即可。
代码示例(对应你修改的FlowWriterServiceImpl位置)
// 1. 构造第一个动作:设置队列(按你的实际参数调整) Action setQueueAction = new ActionBuilder() .setOrder(0) .setAction(new SetQueueActionCaseBuilder() .setSetQueueAction(new SetQueueActionBuilder() .setQueueId(yourQueueId) .build()) .build()) .build(); // 2. 构造第二个动作:输出到指定端口 Action outputPortAction = new ActionBuilder() .setOrder(1) .setAction(new OutputActionCaseBuilder() .setOutputAction(new OutputActionBuilder() .setOutputNodeConnector(yourPortNo) .setMaxLength(0xffFFffFF) .build()) .build()) .build(); // 3. 把两个动作加入列表 List<Action> actionList = Arrays.asList(setQueueAction, outputPortAction); // 4. 封装为ApplyActions指令 Instruction applyActionsInstruction = new InstructionBuilder() .setOrder(0) .setInstruction(new ApplyActionsCaseBuilder() .setApplyActions(new ApplyActionsBuilder() .setAction(actionList) .build()) .build()) .build(); // 5. 把指令加入指令列表,设置给Flow List<Instruction> instructionList = Collections.singletonList(applyActionsInstruction); Instructions instructions = new InstructionsBuilder().setInstruction(instructionList).build(); // 最后把instructions设置到你要下发的Flow对象里即可
注意事项
- 不要单独拆分设置多个ApplyActions指令,多个同类型动作要放在同一个ApplyActions的Action列表里,按
order排序执行。 - 注意Action的执行顺序,队列配置需要在端口输出动作之前执行,否则队列配置不生效。
- 如果你用的是OF1.0版本,Action的构造类路径会有差异,调整对应实现类即可。
内容的提问来源于stack exchange,提问作者CobaltRed
相关产品推荐
相关产品推荐

