| /* |
| * Copyright 2016-present Open Networking Laboratory |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.onosproject.isis.io.util; |
| |
| import org.onlab.packet.Ip4Address; |
| import org.onlab.packet.MacAddress; |
| import org.onosproject.isis.controller.IsisInterface; |
| import org.onosproject.isis.controller.IsisNeighbor; |
| import org.onosproject.isis.controller.IsisNetworkType; |
| import org.onosproject.isis.controller.IsisPduType; |
| import org.onosproject.isis.io.isispacket.IsisHeader; |
| import org.onosproject.isis.io.isispacket.pdu.AttachedToOtherAreas; |
| import org.onosproject.isis.io.isispacket.pdu.LsPdu; |
| import org.onosproject.isis.io.isispacket.tlv.AreaAddressTlv; |
| import org.onosproject.isis.io.isispacket.tlv.HostNameTlv; |
| import org.onosproject.isis.io.isispacket.tlv.IpExtendedReachabilityTlv; |
| import org.onosproject.isis.io.isispacket.tlv.IpInterfaceAddressTlv; |
| import org.onosproject.isis.io.isispacket.tlv.IpInternalReachabilityTlv; |
| import org.onosproject.isis.io.isispacket.tlv.IsReachabilityTlv; |
| import org.onosproject.isis.io.isispacket.tlv.MetricOfInternalReachability; |
| import org.onosproject.isis.io.isispacket.tlv.MetricsOfReachability; |
| import org.onosproject.isis.io.isispacket.tlv.ProtocolSupportedTlv; |
| import org.onosproject.isis.io.isispacket.tlv.TlvHeader; |
| import org.onosproject.isis.io.isispacket.tlv.TlvType; |
| |
| import java.util.List; |
| |
| /** |
| * Representation of link state PDU generator. |
| */ |
| public class LspGenerator { |
| |
| public LsPdu getLsp(IsisInterface isisInterface, String lspId, IsisPduType isisPduType, |
| List<Ip4Address> allConfiguredInterfaceIps) { |
| IsisHeader header = getHeader(isisPduType); |
| LsPdu lsp = new LsPdu(header); |
| |
| lsp.setPduLength(0); |
| lsp.setRemainingLifeTime(IsisConstants.LSPMAXAGE); |
| lsp.setLspId(lspId); |
| lsp.setSequenceNumber(isisInterface.isisLsdb().lsSequenceNumber(isisPduType)); |
| lsp.setCheckSum(0); |
| if (isisPduType == IsisPduType.L1LSPDU) { |
| lsp.setTypeBlock((byte) 1); |
| lsp.setIntermediateSystemType((byte) 1); |
| } else if (isisPduType == IsisPduType.L2LSPDU) { |
| lsp.setTypeBlock((byte) 3); |
| lsp.setIntermediateSystemType((byte) 3); |
| } |
| lsp.setAttachedToOtherAreas(AttachedToOtherAreas.NONE); |
| lsp.setPartitionRepair(false); |
| lsp.setLspDbol(false); |
| |
| TlvHeader tlvHeader = new TlvHeader(); |
| tlvHeader.setTlvType(TlvType.AREAADDRESS.value()); |
| tlvHeader.setTlvLength(0); |
| AreaAddressTlv areaAddressTlv = new AreaAddressTlv(tlvHeader); |
| areaAddressTlv.addAddress(isisInterface.areaAddress()); |
| lsp.addTlv(areaAddressTlv); |
| |
| tlvHeader.setTlvType(TlvType.PROTOCOLSUPPORTED.value()); |
| tlvHeader.setTlvLength(0); |
| ProtocolSupportedTlv protocolSupportedTlv = new ProtocolSupportedTlv(tlvHeader); |
| protocolSupportedTlv.addProtocolSupported((byte) IsisConstants.PROTOCOLSUPPORTED); |
| lsp.addTlv(protocolSupportedTlv); |
| |
| tlvHeader.setTlvType(TlvType.IPINTERFACEADDRESS.value()); |
| tlvHeader.setTlvLength(0); |
| IpInterfaceAddressTlv ipInterfaceAddressTlv = new IpInterfaceAddressTlv(tlvHeader); |
| for (Ip4Address ipaddress : allConfiguredInterfaceIps) { |
| ipInterfaceAddressTlv.addInterfaceAddres(ipaddress); |
| } |
| lsp.addTlv(ipInterfaceAddressTlv); |
| |
| tlvHeader.setTlvType(TlvType.HOSTNAME.value()); |
| tlvHeader.setTlvLength(0); |
| HostNameTlv hostNameTlv = new HostNameTlv(tlvHeader); |
| hostNameTlv.setHostName(isisInterface.intermediateSystemName()); |
| lsp.addTlv(hostNameTlv); |
| |
| tlvHeader.setTlvType(TlvType.ISREACHABILITY.value()); |
| tlvHeader.setTlvLength(0); |
| IsReachabilityTlv isReachabilityTlv = new IsReachabilityTlv(tlvHeader); |
| isReachabilityTlv.setReserved(0); |
| MetricsOfReachability metricsOfReachability = new MetricsOfReachability(); |
| metricsOfReachability.setDefaultMetric((byte) 10); |
| metricsOfReachability.setDefaultIsInternal(true); |
| metricsOfReachability.setDelayMetric((byte) 10); |
| metricsOfReachability.setDelayIsInternal(true); |
| metricsOfReachability.setDelayMetricSupported(true); |
| metricsOfReachability.setExpenseMetric((byte) 10); |
| metricsOfReachability.setExpenseIsInternal(true); |
| metricsOfReachability.setExpenseMetricSupported(true); |
| metricsOfReachability.setErrorMetric((byte) 10); |
| metricsOfReachability.setErrorIsInternal(true); |
| metricsOfReachability.setErrorMetricSupported(true); |
| if (isisInterface.networkType() == IsisNetworkType.BROADCAST) { |
| if (isisPduType == IsisPduType.L1LSPDU) { |
| metricsOfReachability.setNeighborId(isisInterface.l1LanId()); |
| } else if (isisPduType == IsisPduType.L2LSPDU) { |
| metricsOfReachability.setNeighborId(isisInterface.l2LanId()); |
| } |
| } else if (isisInterface.networkType() == IsisNetworkType.P2P) { |
| MacAddress neighborMac = isisInterface.neighbors().iterator().next(); |
| IsisNeighbor neighbor = isisInterface.lookup(neighborMac); |
| metricsOfReachability.setNeighborId(neighbor.neighborSystemId() + ".00"); |
| } |
| |
| isReachabilityTlv.addMeticsOfReachability(metricsOfReachability); |
| lsp.addTlv(isReachabilityTlv); |
| |
| tlvHeader.setTlvType(TlvType.IPINTERNALREACHABILITY.value()); |
| tlvHeader.setTlvLength(0); |
| IpInternalReachabilityTlv ipInterReacTlv = new IpInternalReachabilityTlv(tlvHeader); |
| MetricOfInternalReachability metricOfIntRea = new MetricOfInternalReachability(); |
| metricOfIntRea.setDefaultMetric((byte) 10); |
| metricOfIntRea.setDefaultIsInternal(true); |
| metricOfIntRea.setDefaultDistributionDown(true); |
| metricOfIntRea.setDelayMetric((byte) 0); |
| metricOfIntRea.setDelayMetricSupported(false); |
| metricOfIntRea.setDelayIsInternal(true); |
| metricOfIntRea.setExpenseMetric((byte) 0); |
| metricOfIntRea.setExpenseMetricSupported(false); |
| metricOfIntRea.setExpenseIsInternal(true); |
| metricOfIntRea.setErrorMetric((byte) 0); |
| metricOfIntRea.setErrorMetricSupported(false); |
| metricOfIntRea.setExpenseIsInternal(true); |
| Ip4Address ip4Address = isisInterface.interfaceIpAddress(); |
| byte[] ipAddress = ip4Address.toOctets(); |
| // ipAddress[ipAddress.length - 1] = 0; |
| byte[] networkmass = isisInterface.networkMask(); |
| // metric calculation part |
| byte[] result = new byte[ipAddress.length]; |
| result[0] = (byte) (ipAddress[0] & networkmass[0]); |
| result[1] = (byte) (ipAddress[1] & networkmass[1]); |
| result[2] = (byte) (ipAddress[2] & networkmass[2]); |
| result[3] = (byte) (ipAddress[3] & networkmass[3]); |
| metricOfIntRea.setIpAddress(Ip4Address.valueOf(result)); |
| metricOfIntRea.setSubnetAddres(Ip4Address.valueOf(isisInterface.networkMask())); |
| ipInterReacTlv.addInternalReachabilityMetric(metricOfIntRea); |
| lsp.addTlv(ipInterReacTlv); |
| |
| tlvHeader.setTlvType(TlvType.IPEXTENDEDREACHABILITY.value()); |
| tlvHeader.setTlvLength(0); |
| IpExtendedReachabilityTlv extendedTlv = new IpExtendedReachabilityTlv(tlvHeader); |
| extendedTlv.setDown(false); |
| extendedTlv.setMetric(10); |
| extendedTlv.setPrefix("192.168.7"); |
| extendedTlv.setPrefixLength(24); |
| extendedTlv.setSubTlvLength((byte) 0); |
| extendedTlv.setSubTlvPresence(false); |
| lsp.addTlv(extendedTlv); |
| |
| return lsp; |
| } |
| |
| public IsisHeader getHeader(IsisPduType pduType) { |
| IsisHeader isisHeader = new IsisHeader(); |
| isisHeader.setIrpDiscriminator((byte) IsisConstants.IRPDISCRIMINATOR); |
| isisHeader.setPduHeaderLength((byte) IsisUtil.getPduHeaderLength(pduType.value())); |
| isisHeader.setVersion((byte) IsisConstants.ISISVERSION); |
| isisHeader.setIdLength((byte) IsisConstants.SYSTEMIDLENGTH); |
| isisHeader.setIsisPduType(pduType.value()); |
| isisHeader.setVersion2((byte) IsisConstants.ISISVERSION); |
| isisHeader.setReserved((byte) IsisConstants.RESERVED); |
| isisHeader.setMaximumAreaAddresses((byte) IsisConstants.MAXAREAADDRESS); |
| return isisHeader; |
| } |
| } |