Committed by
Thomas Vachuska
ONOS-2740,ONOS-2741,from ONOS-3032 - to ONOS 3071 , OSPF Protocol Implementation
Change-Id: I8955ca10bf966c7b3917a3f3a41037abce87f1c5
Showing
4 changed files
with
205 additions
and
0 deletions
This diff is collapsed. Click to expand it.
protocols/ospf/ctl/src/main/java/org/onosproject/ospf/controller/lsdb/LsaQueueConsumer.java
0 → 100755
| 1 | +/* | ||
| 2 | + * Copyright 2016 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.ospf.controller.lsdb; | ||
| 17 | + | ||
| 18 | +import org.jboss.netty.channel.Channel; | ||
| 19 | +import org.onosproject.ospf.controller.LsaWrapper; | ||
| 20 | +import org.onosproject.ospf.controller.OspfArea; | ||
| 21 | +import org.onosproject.ospf.controller.OspfInterface; | ||
| 22 | +import org.onosproject.ospf.controller.OspfLsaType; | ||
| 23 | +import org.onosproject.ospf.controller.area.OspfAreaImpl; | ||
| 24 | +import org.onosproject.ospf.controller.area.OspfInterfaceImpl; | ||
| 25 | +import org.onosproject.ospf.protocol.lsa.LsaHeader; | ||
| 26 | +import org.onosproject.ospf.protocol.lsa.types.NetworkLsa; | ||
| 27 | +import org.onosproject.ospf.protocol.lsa.types.RouterLsa; | ||
| 28 | +import org.onosproject.ospf.protocol.util.ChecksumCalculator; | ||
| 29 | +import org.onosproject.ospf.protocol.util.OspfInterfaceState; | ||
| 30 | +import org.onosproject.ospf.protocol.util.OspfParameters; | ||
| 31 | +import org.onosproject.ospf.protocol.util.OspfUtil; | ||
| 32 | +import org.slf4j.Logger; | ||
| 33 | +import org.slf4j.LoggerFactory; | ||
| 34 | + | ||
| 35 | +import java.util.concurrent.BlockingQueue; | ||
| 36 | + | ||
| 37 | +/** | ||
| 38 | + * Consumes LSA from the Queue and processes it. | ||
| 39 | + * Its a producer consumer implementation using Blocking queue. | ||
| 40 | + */ | ||
| 41 | +public class LsaQueueConsumer implements Runnable { | ||
| 42 | + private static final Logger log = LoggerFactory.getLogger(LsaQueueConsumer.class); | ||
| 43 | + private BlockingQueue queue = null; | ||
| 44 | + private Channel channel; | ||
| 45 | + private OspfArea ospfArea; | ||
| 46 | + | ||
| 47 | + /** | ||
| 48 | + * Creates an instance of LSA queue consumer. | ||
| 49 | + * | ||
| 50 | + * @param queue queue instance | ||
| 51 | + * @param channel netty channel instance | ||
| 52 | + * @param ospfArea OSPF area instance | ||
| 53 | + */ | ||
| 54 | + public LsaQueueConsumer(BlockingQueue queue, Channel channel, OspfArea ospfArea) { | ||
| 55 | + this.queue = queue; | ||
| 56 | + this.channel = channel; | ||
| 57 | + this.ospfArea = ospfArea; | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + /** | ||
| 61 | + * Threads run method. | ||
| 62 | + */ | ||
| 63 | + public void run() { | ||
| 64 | + log.debug("LSAQueueConsumer:run...!!!"); | ||
| 65 | + try { | ||
| 66 | + while (true) { | ||
| 67 | + if (!queue.isEmpty()) { | ||
| 68 | + LsaWrapper wrapper = (LsaWrapper) queue.take(); | ||
| 69 | + String lsaProcessing = wrapper.lsaProcessing(); | ||
| 70 | + switch (lsaProcessing) { | ||
| 71 | + case OspfParameters.VERIFYCHECKSUM: | ||
| 72 | + log.debug("LSAQueueConsumer: Message - " + OspfParameters.VERIFYCHECKSUM + " consumed."); | ||
| 73 | + processVerifyChecksum(wrapper); | ||
| 74 | + break; | ||
| 75 | + case OspfParameters.REFRESHLSA: | ||
| 76 | + log.debug("LSAQueueConsumer: Message - " + OspfParameters.REFRESHLSA + " consumed."); | ||
| 77 | + processRefreshLsa(wrapper); | ||
| 78 | + break; | ||
| 79 | + case OspfParameters.MAXAGELSA: | ||
| 80 | + log.debug("LSAQueueConsumer: Message - " + OspfParameters.MAXAGELSA + " consumed."); | ||
| 81 | + processMaxAgeLsa(wrapper); | ||
| 82 | + break; | ||
| 83 | + default: | ||
| 84 | + log.debug("Unknown command to process the LSA in queue ...!!!"); | ||
| 85 | + break; | ||
| 86 | + } | ||
| 87 | + } | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + } catch (Exception e) { | ||
| 91 | + log.debug("Error::LSAQueueConsumer::{}", e.getMessage()); | ||
| 92 | + } | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + /** | ||
| 96 | + * Processes verify checksum - checkAges. | ||
| 97 | + * | ||
| 98 | + * @param wrapper LSA wrapper instance | ||
| 99 | + */ | ||
| 100 | + private void processVerifyChecksum(LsaWrapper wrapper) throws Exception { | ||
| 101 | + ChecksumCalculator checkSum = new ChecksumCalculator(); | ||
| 102 | + if (!checkSum.isValidLsaCheckSum(wrapper.ospfLsa(), ((LsaWrapperImpl) wrapper).lsaHeader().lsType(), | ||
| 103 | + OspfUtil.LSAPACKET_CHECKSUM_POS1, | ||
| 104 | + OspfUtil.LSAPACKET_CHECKSUM_POS2)) { | ||
| 105 | + log.debug("LSAQueueConsumer::Checksum mismatch. Received LSA packet type {} ", | ||
| 106 | + ((LsaWrapperImpl) wrapper).lsaHeader().lsType()); | ||
| 107 | + | ||
| 108 | + //Checksum Invalid | ||
| 109 | + //RFC 2328 Restart the Router. | ||
| 110 | + //Currently we are not restarting. We are not handling this case. | ||
| 111 | + } | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + /** | ||
| 115 | + * Process refresh LSA. | ||
| 116 | + * | ||
| 117 | + * @param wrapper LSA wrapper instance | ||
| 118 | + */ | ||
| 119 | + private void processRefreshLsa(LsaWrapper wrapper) throws Exception { | ||
| 120 | + if (wrapper.isSelfOriginated()) { //self originated | ||
| 121 | + //set the destination | ||
| 122 | + OspfInterface ospfInterface = wrapper.ospfInterface(); | ||
| 123 | + if (ospfInterface != null) { | ||
| 124 | + LsaHeader header = ((LsaWrapperImpl) wrapper).lsaHeader(); | ||
| 125 | + header.setAge(wrapper.currentAge()); | ||
| 126 | + if (((OspfInterfaceImpl) ospfInterface).state() == OspfInterfaceState.DR) { | ||
| 127 | + if (header.lsType() == OspfLsaType.ROUTER.value()) { | ||
| 128 | + RouterLsa routerLsa = ((OspfAreaImpl) ospfArea).buildRouterLsa(ospfInterface); | ||
| 129 | + ((OspfAreaImpl) ospfArea).addLsa(routerLsa, true, ospfInterface); | ||
| 130 | + ((OspfAreaImpl) ospfArea).addToOtherNeighborLsaTxList(routerLsa); | ||
| 131 | + } else if (header.lsType() == OspfLsaType.NETWORK.value()) { | ||
| 132 | + if (ospfInterface.listOfNeighbors().size() > 0) { | ||
| 133 | + NetworkLsa networkLsa = ((OspfAreaImpl) ospfArea).buildNetworkLsa( | ||
| 134 | + ospfInterface.ipAddress(), ospfInterface.ipNetworkMask()); | ||
| 135 | + ospfArea.addLsa(networkLsa, true, ospfInterface); | ||
| 136 | + ((OspfAreaImpl) ospfArea).addToOtherNeighborLsaTxList(networkLsa); | ||
| 137 | + } | ||
| 138 | + } | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + if (((OspfInterfaceImpl) ospfInterface).state() == OspfInterfaceState.BDR || | ||
| 142 | + ((OspfInterfaceImpl) ospfInterface).state() == OspfInterfaceState.POINT2POINT || | ||
| 143 | + ((OspfInterfaceImpl) ospfInterface).state() == OspfInterfaceState.DROTHER) { | ||
| 144 | + ospfArea.refreshArea(ospfInterface); | ||
| 145 | + } | ||
| 146 | + log.debug("LSAQueueConsumer: processRefreshLsa - Flooded SelfOriginated LSA {}", | ||
| 147 | + ((LsaWrapperImpl) wrapper).lsaHeader()); | ||
| 148 | + } | ||
| 149 | + } | ||
| 150 | + } | ||
| 151 | + | ||
| 152 | + /** | ||
| 153 | + * Process max age LSA. | ||
| 154 | + * | ||
| 155 | + * @param wrapper LSA wrapper instance | ||
| 156 | + */ | ||
| 157 | + private void processMaxAgeLsa(LsaWrapper wrapper) { | ||
| 158 | + //set the destination | ||
| 159 | + OspfInterface ospfInterface = wrapper.ospfInterface(); | ||
| 160 | + if (ospfInterface != null) { | ||
| 161 | + LsaHeader header = (LsaHeader) wrapper.ospfLsa().lsaHeader(); | ||
| 162 | + header.setAge(OspfParameters.MAXAGE); | ||
| 163 | + ((LsaWrapperImpl) wrapper).lsaHeader().setAge(OspfParameters.MAXAGE); | ||
| 164 | + if (((OspfInterfaceImpl) ospfInterface).state() == OspfInterfaceState.DR || | ||
| 165 | + ((OspfInterfaceImpl) ospfInterface).state() == OspfInterfaceState.POINT2POINT) { | ||
| 166 | + //remove from db | ||
| 167 | + ((OspfAreaImpl) ospfArea).addToOtherNeighborLsaTxList(((LsaWrapperImpl) wrapper).lsaHeader()); | ||
| 168 | + ((OspfAreaImpl) ospfArea).deleteLsa(((LsaWrapperImpl) wrapper).lsaHeader()); | ||
| 169 | + } else { | ||
| 170 | + ((OspfAreaImpl) ospfArea).deleteLsa(((LsaWrapperImpl) wrapper).lsaHeader()); | ||
| 171 | + } | ||
| 172 | + log.debug("LSAQueueConsumer: processMaxAgeLsa - Flooded SelfOriginated-Max Age LSA {}", | ||
| 173 | + ((LsaWrapperImpl) wrapper).lsaHeader()); | ||
| 174 | + } | ||
| 175 | + } | ||
| 176 | + | ||
| 177 | + /** | ||
| 178 | + * Sets the channel. | ||
| 179 | + * | ||
| 180 | + * @param channel channel instance | ||
| 181 | + */ | ||
| 182 | + public void setChannel(Channel channel) { | ||
| 183 | + this.channel = channel; | ||
| 184 | + } | ||
| 185 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
This diff is collapsed. Click to expand it.
| 1 | +/* | ||
| 2 | + * Copyright 2016 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +/** | ||
| 18 | + * Implementation of the OSPF controller. | ||
| 19 | + */ | ||
| 20 | +package org.onosproject.ospf.controller; | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
-
Please register or login to post a comment