Fix for BAD-ACTION ONOS-4688 , BAD-MATCH ONOS-4755 and other flow-mod errors.
Change-Id: Icf1a4883da50354bcebdad4c1a9693285d4cf8b4
Showing
1 changed file
with
41 additions
and
11 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,31 +490,59 @@ public class OpenFlowRuleProvider extends AbstractProvider | ... | @@ -488,31 +490,59 @@ 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 | } |
493 | + handleErrorMsg(deviceId, msg); | ||
494 | + break; | ||
495 | + default: | ||
496 | + log.debug("Unhandled message type: {}", msg.getType()); | ||
497 | + } | ||
498 | + } | ||
491 | 499 | ||
500 | + private void handleErrorMsg(DeviceId deviceId, OFMessage msg) { | ||
492 | OFErrorMsg error = (OFErrorMsg) msg; | 501 | OFErrorMsg error = (OFErrorMsg) msg; |
493 | - if (error.getErrType() == OFErrorType.FLOW_MOD_FAILED) { | 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: | ||
494 | OFFlowModFailedErrorMsg fmFailed = (OFFlowModFailedErrorMsg) error; | 523 | OFFlowModFailedErrorMsg fmFailed = (OFFlowModFailedErrorMsg) error; |
495 | if (fmFailed.getData().getParsedMessage().isPresent()) { | 524 | if (fmFailed.getData().getParsedMessage().isPresent()) { |
496 | - OFMessage m = fmFailed.getData().getParsedMessage().get(); | 525 | + ofMessage = fmFailed.getData().getParsedMessage().get(); |
497 | - OFFlowMod fm = (OFFlowMod) m; | 526 | + } |
527 | + break; | ||
528 | + default: | ||
529 | + // Do nothing. | ||
530 | + return; | ||
531 | + } | ||
532 | + if (ofMessage != null) { | ||
498 | InternalCacheEntry entry = | 533 | InternalCacheEntry entry = |
499 | pendingBatches.getIfPresent(msg.getXid()); | 534 | pendingBatches.getIfPresent(msg.getXid()); |
500 | if (entry != null) { | 535 | if (entry != null) { |
501 | - entry.appendFailure(new FlowEntryBuilder(deviceId, fm, driverService).build()); | 536 | + OFFlowMod ofFlowMod = (OFFlowMod) ofMessage; |
537 | + entry.appendFailure(new FlowEntryBuilder(deviceId, ofFlowMod, driverService).build()); | ||
502 | } else { | 538 | } else { |
503 | log.error("No matching batch for this error: {}", error); | 539 | log.error("No matching batch for this error: {}", error); |
504 | } | 540 | } |
505 | } else { | 541 | } else { |
506 | - // FIXME: Potentially add flowtracking to avoid this message. | ||
507 | log.error("Flow installation failed but switch didn't" | 542 | log.error("Flow installation failed but switch didn't" |
508 | + " tell us which one."); | 543 | + " tell us which one."); |
509 | } | 544 | } |
510 | } | 545 | } |
511 | - break; | ||
512 | - default: | ||
513 | - log.debug("Unhandled message type: {}", msg.getType()); | ||
514 | - } | ||
515 | - } | ||
516 | 546 | ||
517 | @Override | 547 | @Override |
518 | public void receivedRoleReply(Dpid dpid, RoleState requested, | 548 | public void receivedRoleReply(Dpid dpid, RoleState requested, | ... | ... |
-
Please register or login to post a comment