private synchronized void dropPacketFIFO(Packet pnp)
    {
        // If the queue is full, we have to drop a packet, giving priority to the control packets
        // Control packets will be those packets sent between the broker or the GIS.
        // Normal packets are those belonging to a gridlet.
        // Control packets can only be dropped when the wue is full of control packets

        increaseDroppedPktCounter(); // increase the counter of dropped packets

        // First: check if the new incoming packet is a control packet or not.

        // Check the source of the packet
        int src_outputPort = ((FnbNetPacket) pnp).getSrcID();

        boolean isFile = ((FnbNetPacket) pnp).isFile();

        String src_outputPort_str = GridSim.getEntityName(src_outputPort);
        // for example, src_outputPort_str = Output_SIM_0_User_0

        // Check the destination, as I'm not sure if it works like that
        int dst_inputPort = ((FnbNetPacket) pnp).getDestID();
        String dst_inputPort_str = GridSim.getEntityName(dst_inputPort);

        // if neither the src or the dest of the packet are in the whitelist, then drop the packet
        FnbWhiteList whiteList = FnbWhiteList.getInstance();
        if (!whiteList.checkList(dst_inputPort) &&
            !whiteList.checkList(src_outputPort))
        {

            /***********
            // This was the very first version of the Fnbs
            insertPacketIntoQueue(pnp);
            return true;
            ***********/

            if (makeRoomForPacket())
            {
                // If we have been able of dropping a data packet, then we have room for this control packet
                insertPacketIntoQueue(pnp);
            }
            else
            {
                System.out.println("\n" + super.get_name() +
                    ": 271 A control packet has been dropped.\n" +
                    "src_output: " + src_outputPort_str +
                    ". dst_inputPort: " + dst_inputPort_str +
                    "\nHENCE, SIMULATION FINISHED AT SIM. TIME " + GridSim.clock());

                //fw_write("MaxBufferSizeDuringSim, " + getMaxBufferSize() + "\n",
                //         this.get_name() + "_MaxBufferSize.csv");
                
                System.exit(1);
                // super.shutdownUserEntity();
                // super.terminateIOEntities();
            }
        }

        // If u want more info on the progress of sims, uncomment this.
        /********************
        System.out.println(super.get_name() + ": packet dropped. Src: " +
                           src_outputPort_str + ", Dst: " + dst_inputPort_str +
                           ". Pkt num: " + ((FnbNetPacket) pnp).getPacketNum());
        ********************/

        // In this case, we will have to remove the packet, and
        // also, we will have to tell the source of the packet what has happened.
        // The source of a packet is the user/resource which sent it.
        // So, in order to contact the entity, we do it through its output port.
        // This is done through an event, not through the network

        int entity;
        if (src_outputPort_str.indexOf("User") != -1)
        {
            // if the src of the packet is an user, tell him what has happened

            // NOTE: this is a HACK job. "Output_" has 7 chars. So,
            // the idea is to get only the entity name by removing
            // "Output_" word in the outName string.
            String src_str = src_outputPort_str.substring(7);
            // for example, src_str = SIM_0_User_0

            entity = GridSim.getEntityId(src_str);
        }
        else
        {
            // If the destination of the packet is the user, tell the user
            entity = GridSim.getEntityId(dst_inputPort_str);
        }

        int pktID = ((FnbNetPacket) pnp).getID();

        // String input_src_str = "Input_" + src_str;
        // for example, input_src_str = Input_SIM_0_User_0
        // int input_src = GridSim.getEntityId(input_src_str);

        int glID;
        if (pnp instanceof InfoPacket)
        {
            glID = 99999;
        }
        else
        {
            // check the user and the gl this packet belongs to
            glID = ((FnbNetPacket) pnp).getObjectID();
            //filename = ((FnbNetPacket) pnp).getFileName();
        }

        //super.send(src_outputPort, GridSimTags.SCHEDULE_NOW,
        super.sim_schedule(src_outputPort, GridSimTags.SCHEDULE_NOW,
                   GridSimTags.FNB_PACKET_DROPPED,
                   new FnbDroppedUserObject(entity, glID, isFile));
        // We tell the output entity of the sender of this packet
        // that the packet has been dropped.

        pnp = null; // remove the packet.
    }