Fix for BAD-ACTION ONOS-4688 , BAD-MATCH ONOS-4755 and other flow-mod errors.
Change-Id: Icf1a4883da50354bcebdad4c1a9693285d4cf8b4
Showing
1 changed file
with
51 additions
and
21 deletions
| ... | @@ -61,7 +61,6 @@ import org.osgi.service.component.ComponentContext; | ... | @@ -61,7 +61,6 @@ import org.osgi.service.component.ComponentContext; |
| 61 | import org.projectfloodlight.openflow.protocol.OFBadRequestCode; | 61 | import org.projectfloodlight.openflow.protocol.OFBadRequestCode; |
| 62 | import org.projectfloodlight.openflow.protocol.OFBarrierRequest; | 62 | import org.projectfloodlight.openflow.protocol.OFBarrierRequest; |
| 63 | import org.projectfloodlight.openflow.protocol.OFErrorMsg; | 63 | import org.projectfloodlight.openflow.protocol.OFErrorMsg; |
| 64 | -import org.projectfloodlight.openflow.protocol.OFErrorType; | ||
| 65 | import org.projectfloodlight.openflow.protocol.OFFlowMod; | 64 | import org.projectfloodlight.openflow.protocol.OFFlowMod; |
| 66 | import org.projectfloodlight.openflow.protocol.OFFlowRemoved; | 65 | import org.projectfloodlight.openflow.protocol.OFFlowRemoved; |
| 67 | import org.projectfloodlight.openflow.protocol.OFFlowStatsReply; | 66 | import org.projectfloodlight.openflow.protocol.OFFlowStatsReply; |
| ... | @@ -71,6 +70,9 @@ import org.projectfloodlight.openflow.protocol.OFStatsReply; | ... | @@ -71,6 +70,9 @@ import org.projectfloodlight.openflow.protocol.OFStatsReply; |
| 71 | import org.projectfloodlight.openflow.protocol.OFStatsType; | 70 | import org.projectfloodlight.openflow.protocol.OFStatsType; |
| 72 | import org.projectfloodlight.openflow.protocol.OFTableStatsEntry; | 71 | import org.projectfloodlight.openflow.protocol.OFTableStatsEntry; |
| 73 | import org.projectfloodlight.openflow.protocol.OFTableStatsReply; | 72 | import org.projectfloodlight.openflow.protocol.OFTableStatsReply; |
| 73 | +import org.projectfloodlight.openflow.protocol.errormsg.OFBadActionErrorMsg; | ||
| 74 | +import org.projectfloodlight.openflow.protocol.errormsg.OFBadInstructionErrorMsg; | ||
| 75 | +import org.projectfloodlight.openflow.protocol.errormsg.OFBadMatchErrorMsg; | ||
| 74 | import org.projectfloodlight.openflow.protocol.errormsg.OFBadRequestErrorMsg; | 76 | import org.projectfloodlight.openflow.protocol.errormsg.OFBadRequestErrorMsg; |
| 75 | import org.projectfloodlight.openflow.protocol.errormsg.OFFlowModFailedErrorMsg; | 77 | import org.projectfloodlight.openflow.protocol.errormsg.OFFlowModFailedErrorMsg; |
| 76 | import org.slf4j.Logger; | 78 | import org.slf4j.Logger; |
| ... | @@ -488,32 +490,60 @@ public class OpenFlowRuleProvider extends AbstractProvider | ... | @@ -488,32 +490,60 @@ public class OpenFlowRuleProvider extends AbstractProvider |
| 488 | } else { | 490 | } else { |
| 489 | log.warn("Received error message {} from {}", msg, dpid); | 491 | log.warn("Received error message {} from {}", msg, dpid); |
| 490 | } | 492 | } |
| 491 | - | 493 | + handleErrorMsg(deviceId, msg); |
| 492 | - OFErrorMsg error = (OFErrorMsg) msg; | ||
| 493 | - if (error.getErrType() == OFErrorType.FLOW_MOD_FAILED) { | ||
| 494 | - OFFlowModFailedErrorMsg fmFailed = (OFFlowModFailedErrorMsg) error; | ||
| 495 | - if (fmFailed.getData().getParsedMessage().isPresent()) { | ||
| 496 | - OFMessage m = fmFailed.getData().getParsedMessage().get(); | ||
| 497 | - OFFlowMod fm = (OFFlowMod) m; | ||
| 498 | - InternalCacheEntry entry = | ||
| 499 | - pendingBatches.getIfPresent(msg.getXid()); | ||
| 500 | - if (entry != null) { | ||
| 501 | - entry.appendFailure(new FlowEntryBuilder(deviceId, fm, driverService).build()); | ||
| 502 | - } else { | ||
| 503 | - log.error("No matching batch for this error: {}", error); | ||
| 504 | - } | ||
| 505 | - } else { | ||
| 506 | - // FIXME: Potentially add flowtracking to avoid this message. | ||
| 507 | - log.error("Flow installation failed but switch didn't" | ||
| 508 | - + " tell us which one."); | ||
| 509 | - } | ||
| 510 | - } | ||
| 511 | break; | 494 | break; |
| 512 | default: | 495 | default: |
| 513 | log.debug("Unhandled message type: {}", msg.getType()); | 496 | log.debug("Unhandled message type: {}", msg.getType()); |
| 514 | } | 497 | } |
| 515 | } | 498 | } |
| 516 | 499 | ||
| 500 | + private void handleErrorMsg(DeviceId deviceId, OFMessage msg) { | ||
| 501 | + OFErrorMsg error = (OFErrorMsg) msg; | ||
| 502 | + OFMessage ofMessage = null; | ||
| 503 | + switch (error.getErrType()) { | ||
| 504 | + case BAD_ACTION: | ||
| 505 | + OFBadActionErrorMsg baErrorMsg = (OFBadActionErrorMsg) error; | ||
| 506 | + if (baErrorMsg.getData().getParsedMessage().isPresent()) { | ||
| 507 | + ofMessage = baErrorMsg.getData().getParsedMessage().get(); | ||
| 508 | + } | ||
| 509 | + break; | ||
| 510 | + case BAD_INSTRUCTION: | ||
| 511 | + OFBadInstructionErrorMsg biErrorMsg = (OFBadInstructionErrorMsg) error; | ||
| 512 | + if (biErrorMsg.getData().getParsedMessage().isPresent()) { | ||
| 513 | + ofMessage = biErrorMsg.getData().getParsedMessage().get(); | ||
| 514 | + } | ||
| 515 | + break; | ||
| 516 | + case BAD_MATCH: | ||
| 517 | + OFBadMatchErrorMsg bmErrorMsg = (OFBadMatchErrorMsg) error; | ||
| 518 | + if (bmErrorMsg.getData().getParsedMessage().isPresent()) { | ||
| 519 | + ofMessage = bmErrorMsg.getData().getParsedMessage().get(); | ||
| 520 | + } | ||
| 521 | + break; | ||
| 522 | + case FLOW_MOD_FAILED: | ||
| 523 | + OFFlowModFailedErrorMsg fmFailed = (OFFlowModFailedErrorMsg) error; | ||
| 524 | + if (fmFailed.getData().getParsedMessage().isPresent()) { | ||
| 525 | + ofMessage = fmFailed.getData().getParsedMessage().get(); | ||
| 526 | + } | ||
| 527 | + break; | ||
| 528 | + default: | ||
| 529 | + // Do nothing. | ||
| 530 | + return; | ||
| 531 | + } | ||
| 532 | + if (ofMessage != null) { | ||
| 533 | + InternalCacheEntry entry = | ||
| 534 | + pendingBatches.getIfPresent(msg.getXid()); | ||
| 535 | + if (entry != null) { | ||
| 536 | + OFFlowMod ofFlowMod = (OFFlowMod) ofMessage; | ||
| 537 | + entry.appendFailure(new FlowEntryBuilder(deviceId, ofFlowMod, driverService).build()); | ||
| 538 | + } else { | ||
| 539 | + log.error("No matching batch for this error: {}", error); | ||
| 540 | + } | ||
| 541 | + } else { | ||
| 542 | + log.error("Flow installation failed but switch didn't" | ||
| 543 | + + " tell us which one."); | ||
| 544 | + } | ||
| 545 | + } | ||
| 546 | + | ||
| 517 | @Override | 547 | @Override |
| 518 | public void receivedRoleReply(Dpid dpid, RoleState requested, | 548 | public void receivedRoleReply(Dpid dpid, RoleState requested, |
| 519 | RoleState response) { | 549 | RoleState response) { | ... | ... |
-
Please register or login to post a comment