private OFMatchV3 buildOFMatchV3() { OFFactory of13Factory = OFFactories.getFactory(OFVersion.OF_13); OFOxms oxms = of13Factory.oxms(); OFOxmEthType ofOxmEthType = oxms.buildEthType().setValue(EthType.IPv4).build(); OFOxmIpv4Src ofOxmIpv4Src = oxms.buildIpv4Src().setValue(IPv4Address.of(multicastGroup.sourceIP)).build(); OFOxmIpProto ofOxmIpProto = oxms.buildIpProto().setValue(IpProtocol.UDP).build(); OFOxmIpv4Dst ofOxmIpv4Dst = oxms.buildIpv4Dst().setValue(IPv4Address.of(multicastGroup.groupIP)).build(); OFOxmList oxmList = OFOxmList.of(ofOxmEthType, ofOxmIpv4Src, ofOxmIpv4Dst, ofOxmIpProto); OFMatchV3 of13Match = of13Factory.buildMatchV3().setOxmList(oxmList).build(); return of13Match; }
private void populateTableTMac() throws IOException { // match for ip packets OFOxmEthType oxe = factory.oxms().ethType(EthType.IPv4); OFOxmList oxmListIp = OFOxmList.of(oxe); OFMatchV3 matchIp = factory.buildMatchV3() .setOxmList(oxmListIp).build(); OFInstruction gotoTblIp = factory.instructions().buildGotoTable() .setTableId(TableId.of(TABLE_IPV4_UNICAST)).build(); List<OFInstruction> instructionsIp = Collections.singletonList(gotoTblIp); OFMessage ipEntry = factory.buildFlowAdd() .setTableId(TableId.of(TABLE_TMAC)) .setMatch(matchIp) .setInstructions(instructionsIp) .setPriority(1000) // strict priority required lower than // multicastMac .setBufferId(OFBufferId.NO_BUFFER) .setIdleTimeout(0) .setHardTimeout(0) .setXid(getNextTransactionId()) .build(); // match for mpls packets OFOxmEthType oxmpls = factory.oxms().ethType(EthType.MPLS_UNICAST); OFOxmList oxmListMpls = OFOxmList.of(oxmpls); OFMatchV3 matchMpls = factory.buildMatchV3() .setOxmList(oxmListMpls).build(); OFInstruction gotoTblMpls = factory.instructions().buildGotoTable() .setTableId(TableId.of(TABLE_MPLS)).build(); List<OFInstruction> instructionsMpls = Collections.singletonList(gotoTblMpls); OFMessage mplsEntry = factory.buildFlowAdd() .setTableId(TableId.of(TABLE_TMAC)) .setMatch(matchMpls) .setInstructions(instructionsMpls) .setPriority(1001) // strict priority required lower than // multicastMac .setBufferId(OFBufferId.NO_BUFFER) .setIdleTimeout(0) .setHardTimeout(0) .setXid(getNextTransactionId()) .build(); // match for everything else to send to controller. Essentially // the table miss flow entry populateTableMissEntry(TABLE_TMAC, true, false, false, -1); log.debug("Adding termination-mac-rules in sw {}", getStringId()); List<OFMessage> msglist = new ArrayList<OFMessage>(2); msglist.add(ipEntry); msglist.add(mplsEntry); sendMsg(msglist); }
private void populateTableTMac() throws IOException { // match for router-mac and ip-packets OFOxmEthType oxe = factory.oxms().ethType(EthType.IPv4); OFOxmEthDst dmac = factory.oxms().ethDst(getRouterMacAddr()); OFOxmList oxmListIp = OFOxmList.of(dmac, oxe); OFMatchV3 matchIp = factory.buildMatchV3() .setOxmList(oxmListIp).build(); OFInstruction gotoTblIp = factory.instructions().buildGotoTable() .setTableId(TableId.of(ipv4UnicastTableId)).build(); List<OFInstruction> instructionsIp = Collections.singletonList(gotoTblIp); OFMessage ipEntry = factory.buildFlowAdd() .setTableId(TableId.of(tmacTableId)) .setMatch(matchIp) .setInstructions(instructionsIp) .setPriority(1000) // strict priority required lower than // multicastMac .setBufferId(OFBufferId.NO_BUFFER) .setIdleTimeout(0) .setHardTimeout(0) .setXid(getNextTransactionId()) .build(); // match for router-mac and mpls packets OFOxmEthType oxmpls = factory.oxms().ethType(EthType.MPLS_UNICAST); OFOxmList oxmListMpls = OFOxmList.of(dmac, oxmpls); OFMatchV3 matchMpls = factory.buildMatchV3() .setOxmList(oxmListMpls).build(); OFInstruction gotoTblMpls = factory.instructions().buildGotoTable() .setTableId(TableId.of(mplsTableId)).build(); List<OFInstruction> instructionsMpls = Collections.singletonList(gotoTblMpls); OFMessage mplsEntry = factory.buildFlowAdd() .setTableId(TableId.of(tmacTableId)) .setMatch(matchMpls) .setInstructions(instructionsMpls) .setPriority(1001) // strict priority required lower than // multicastMac .setBufferId(OFBufferId.NO_BUFFER) .setIdleTimeout(0) .setHardTimeout(0) .setXid(getNextTransactionId()) .build(); log.debug("Adding termination-mac-rules in sw {}", getStringId()); List<OFMessage> msglist = new ArrayList<OFMessage>(2); msglist.add(ipEntry); msglist.add(mplsEntry); write(msglist); }
protected List<?> getSwitchStatisticsForTable(long switchId, OFStatsType statType, String tableType) { IFloodlightProviderService floodlightProvider = (IFloodlightProviderService) getContext().getAttributes(). get(IFloodlightProviderService.class.getCanonicalName()); IOFSwitch sw = floodlightProvider.getSwitches().get(switchId); Future<List<OFStatsReply>> future; List<OFStatsReply> values = null; //getting tableId from CPqD driver TableId tableId; if (sw != null) { if ((tableId = ((OFSwitchImplSpringOpenTTP) sw).getTableId(tableType)) == null) { log.error("Invalid tableType {} " + tableType); return null; } OFStatsRequest<?> req = null; if (statType == OFStatsType.FLOW) { log.debug("Switch Flow Stats req for table {} sent to switch {}", tableType,sw.getStringId()); OFMatchV3 match = sw.getFactory().buildMatchV3() .setOxmList(OFOxmList.EMPTY).build(); req = sw.getFactory() .buildFlowStatsRequest() .setMatch(match) .setOutPort(OFPort.ANY) .setTableId(tableId) .setXid(sw.getNextTransactionId()).build(); List<OFFlowStatsEntryMod> flowStats = new ArrayList<OFFlowStatsEntryMod>(); try { future = sw.getStatistics(req); values = future.get(10, TimeUnit.SECONDS); for(OFStatsReply value : values){ for (OFFlowStatsEntry entry : ((OFFlowStatsReply)value).getEntries()) { OFFlowStatsEntryMod entryMod = new OFFlowStatsEntryMod(entry, sw); flowStats.add(entryMod); } } log.debug("Switch flow Stats Entries for table {} from switch {} are {}", tableType, sw.getStringId(), flowStats); } catch (Exception e) { log.error("Failure retrieving per table statistics from switch " + sw, e); } return flowStats; } } //should never get to this point log.error("Failure retrieving {} table statistics from switch {}",tableType, sw); return null; }