/* * 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.pim.impl; import org.onlab.packet.Ethernet; import org.onlab.packet.IPacket; import org.onlab.packet.IPv4; import org.onlab.packet.Ip4Address; import org.onlab.packet.MacAddress; import org.onlab.packet.PIM; public class PimPacket { // Ethernet header private Ethernet ethHeader = new Ethernet(); // IP header private IPv4 ipHeader = new IPv4(); // PIM Header private PIM pimHeader = new PIM(); // The pim type private byte pimType; // PIM MAC address private MacAddress pimDestinationMac = MacAddress.valueOf("01:00:5E:00:00:0d"); /** * Create a PIM packet for a given PIM type. * * The resulting packet will have Ethernet and IPv4 headers with all defaults filled in. * The final packet will require a PIM header that corresponds to the PIM type set as * a payload. * * Additionally the source MAC and IPv4 address will need to be filled in for the * packet to be ready to serialize in most cases. * * @param type PIM.TYPE_XXXX where XXX is the PIM message type */ public PimPacket(byte type) { pimType = type; initDefaults(); } /** * Fill in defaults for the Ethernet, IPv4 and PIM headers, then associate each * of these headers as payload and parent accordingly. */ public void initDefaults() { // Prepopulate dst MACAddress and Ethernet Types. The Source MAC needs to be filled in. ethHeader.setDestinationMACAddress(pimDestinationMac); ethHeader.setEtherType(Ethernet.TYPE_IPV4); // Prepopulate the IP Type and Dest address. The Source IP address needs to be filled in. ipHeader.setDestinationAddress(PIM.PIM_ADDRESS.getIp4Address().toInt()); ipHeader.setTtl((byte) 1); ipHeader.setProtocol(IPv4.PROTOCOL_PIM); // Establish the order between Ethernet and IP headers ethHeader.setPayload(ipHeader); ipHeader.setParent(ethHeader); // Prepopulate the PIM packet pimHeader.setPIMType(pimType); // Establish the order between IP and PIM headers ipHeader.setPayload(pimHeader); pimHeader.setParent(ipHeader); } /** * Set the source MAC address. * * @param src source MAC address */ public void setSrcMacAddr(MacAddress src) { ethHeader.setSourceMACAddress(src); } /** * Set the source IPv4 address. * * @param ipSrcAddress the source IPv4 address */ public void setSrcIpAddress(Ip4Address ipSrcAddress) { ipHeader.setSourceAddress(ipSrcAddress.toInt()); } /** * Set the PIM payload. * * @param payload the PIM payload */ public void setPimPayload(IPacket payload) { pimHeader.setPayload(payload); payload.setParent(pimHeader); } /** * Get the ethernet header. * * @return the Ethernet header */ public Ethernet getEthernet() { return ethHeader; } /** * Get the IPv4 header. * * @return the IPv4 header */ public IPv4 getIpv4() { return ipHeader; } }