package org.freertr.pack;

/**
 * eap over lan (ieee 802.1x) protocol packet
 *
 * @author matecsaba
 */
public class packEapOL {

    /**
     * create instance
     */
    public packEapOL() {
    }

    /**
     * ethertype of these packets
     */
    public final static int type = 0x888e;

    /**
     * size of header
     */
    public final static int size = 6;

    /**
     * eap packet
     */
    public final static int typData = 0;

    /**
     * start frame
     */
    public final static int typStart = 1;

    /**
     * logoff frame
     */
    public final static int typLogoff = 2;

    /**
     * key frame
     */
    public final static int typKey = 3;

    /**
     * encapsulated asf start frame
     */
    public final static int typEncap = 4;

    /**
     * protocol version
     */
    public int ver;

    /**
     * message type
     */
    public int typ;

    /**
     * convert type to string
     *
     * @param i type
     * @return string
     */
    public static String type2string(int i) {
        switch (i) {
            case typData:
                return "data";
            case typStart:
                return "start";
            case typLogoff:
                return "logoff";
            case typKey:
                return "key";
            case typEncap:
                return "encap";
            default:
                return "unknown=" + i;
        }
    }

    /**
     * parse one packet
     *
     * @param pck packet to read
     * @return false on success, true on error
     */
    public boolean parseHeader(packHolder pck) {
        if (pck.msbGetW(0) != type) {
            return true;
        }
        ver = pck.getByte(2); // version
        typ = pck.getByte(3); // type
        int len = pck.msbGetW(4); // body length
        pck.getSkip(size);
        if (len > pck.dataSize()) {
            return true;
        }
        pck.setDataSize(len);
        return false;
    }

    /**
     * create header
     *
     * @param pck packet to update
     */
    public void createHeader(packHolder pck) {
        pck.msbPutW(0, type);
        pck.putByte(2, ver); // version
        pck.putByte(3, typ); // type
        pck.msbPutW(4, pck.dataSize()); // body length
        pck.putSkip(size);
        pck.merge2beg();
        pck.ETHtrg.fromString("0180:c200:0003");
    }

    /**
     * create command packet
     *
     * @param pck packet to update
     * @param type packet to update
     */
    public void createCmd(packHolder pck, int type) {
        ver = 2;
        typ = type;
        createHeader(pck);
    }

    /**
     * create data packet
     *
     * @param pck packet to update
     */
    public void createData(packHolder pck) {
        createCmd(pck, typData);
    }

    /**
     * dump one packet
     *
     * @return string
     */
    public String dump() {
        return "ver=" + ver + " type=" + type2string(typ);
    }

}
