///////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
/**
* Microsoft Research, Cambridge
* author: Yaron Weinsberg, Richard Black
*/
using System.Collections;
using System.Diagnostics;
using System;
using System.Compiler;
using Drivers.Net;
namespace NetStack.Common
{
public class NetPacket : SimpleBuffer
{
public const int DefaultSize = 1514;
private static uint lastId;
private uint id;
// an overlapped context
protected object overlapContext;
// a target/source adapter context
protected object adapterContext;
protected object mux;
// the following are only used for Qos extension
protected int refCount;
protected object sessionContext;
// some ctors
public NetPacket(byte[]! buffer, int index, int count)
: base(buffer, index, count)
{
id = lastId++;
}
public NetPacket(byte[]! buffer) : base(buffer)
{
id = lastId++;
}
public NetPacket(int capacity) : base(capacity)
{
id = lastId++;
}
public NetPacket() : base(DefaultSize)
{
id = lastId++;
}
public uint Id { get { return id; } }
public object SessionContext
{
get { return sessionContext; }
set { sessionContext = value; }
}
// get/set the context (IPHeader, cryptically enough!)
public object OverlapContext
{
get { return overlapContext; }
set { overlapContext=value; }
}
// get/set the context
public object AdapterContext
{
get { return adapterContext; }
set { adapterContext = value; }
}
// get/set the Multiplexer
public object Mux
{
get { return mux; }
set { mux = value; }
}
///
/// should only copy the data from position to count
///
public byte[] ToUser()
{
// Much to do here
byte[] toUser = new byte[Available];
Array.Copy(this.data, this.position, toUser, 0, Available);
return toUser;
}
public bool IsOneChunk
{
get { return true; }
}
///
/// Clips the remaining bytes (after the current position)
///
///
public void Clip(int remaining)
{
this.count = this.position + remaining + 1;
}
///
/// Clips the bytes outside the window
/// remaining counts the bytes after the headIndex
///
public void Clip(int headIndex,int remaining)
{
Debug.Assert(this.count > headIndex + remaining);
this.position = headIndex;
this.count = this.position + remaining + 1;
}
// reset the packet to the original clipping
public void Reset()
{
this.position = 0;
this.sessionContext = null;
this.overlapContext = null;
this.mux = null;
this.adapterContext = null;
}
public void Reset(int newLength)
{
Reset();
this.count = newLength;
}
public byte [] GetRawData()
{
return this.data;
}
public bool IsFree()
{
return (System.Threading.Interlocked.Equals(refCount, 0));
}
public int AddRef()
{
return (System.Threading.Interlocked.Increment(ref refCount));
}
public int ReleaseRef()
{
return (System.Threading.Interlocked.Decrement(ref refCount));
}
} // class NetPacket
} // namespace Drivers.Net