/*
 * Copyright 2015 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;
    }
}
