public LinkedList<DataPacket> getPackets(Byte source) {
		
		byte rStack = source;
		LinkedList<DataPacket> res = new LinkedList<DataPacket>();
		
		this.lock.lock();
		
		HashMap<Byte, DataPacket> packets = new HashMap<Byte, DataPacket>();
		if (this.packets.containsKey(rStack))
			packets.putAll(this.packets.get(rStack));
		
		
		byte bRet = this.RET.get(rStack);
		byte temp = 0x00;
		LinkedList<DataPacket> tList = new LinkedList<DataPacket>();
		
		while(packets.containsKey(this.nextSEQ(bRet))) {
			
			bRet = this.nextSEQ(bRet);
			
			if (!packets.get(bRet).hasMore()) {
				
				// End of multi-packet data
				if (temp != (byte) 0x00) {
					temp = 0x00;

					tList.add(packets.get(bRet));
					
					Iterator<DataPacket> i = tList.iterator();
					while(i.hasNext()) {
						DataPacket dp = i.next();
						res.add(dp);
						this.packets.get(rStack).remove(dp.getSequenceNumber());
					}
					
					tList = new LinkedList<DataPacket>();
					
					continue;
				}
				
				// single packet data
				res.add(packets.get(bRet));
				this.packets.get(rStack).remove(bRet);
				
			// multi-packet data
			} else {
				
				if (temp == (byte) 0x00)
					temp = bRet;
				
				tList.add(packets.get(bRet));
				
			}
			
		}

		if (temp != (byte) 0x00) {
			bRet = this.prevSEQ(temp);
		}
		
		this.RET.put(rStack, bRet);
		
		this.lock.unlock();
		
		return res;
		
		
	}