/*
 * Copyright 2016-present Open Networking Foundation
 *
 * 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;
    }
}
