private OFAction getDestAction(int portnum) { OFAction setDA = null; MacAddress dAddr = null; if (getId() == 0x1 && portnum == 6) { // connected to switch 2 dAddr = MacAddress.of("00:00:02:02:02:80"); } if (getId() == 0x2) { if (portnum == 1) { // connected to sw 1 dAddr = MacAddress.of("00:00:01:01:01:80"); } else if (portnum == 2) { // connected to sw 3 dAddr = MacAddress.of("00:00:07:07:07:80"); } } if (getId() == 0x3) { if (portnum == 2) { // connected to switch 2 dAddr = MacAddress.of("00:00:02:02:02:80"); } } if (dAddr != null) { OFOxmEthDst dstAddr = factory.oxms().ethDst(dAddr); setDA = factory.actions().buildSetField() .setField(dstAddr).build(); } return setDA; }
@Override protected OFOxmList getIPEntryMatchList(OFFactory ofFactory, Match match) { /* For Dell Switches, the IP entry match list shall * also include destination mac matching rule */ Ipv4Match ipm = (Ipv4Match) match; IPv4Net ipdst = ipm.getDestination(); OFOxmEthType ethTypeIp = ofFactory.oxms() .ethType(EthType.IPv4); OFOxmEthDst dmac = ofFactory.oxms().ethDst(getRouterMacAddr()); OFOxmIpv4DstMasked ipPrefix = ofFactory.oxms() .ipv4DstMasked( IPv4Address.of(ipdst.address().value()), IPv4Address.ofCidrMaskLength(ipdst.prefixLen()) ); OFOxmList oxmList = OFOxmList.of(ethTypeIp, dmac, ipPrefix); return oxmList; }
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); }