博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助
隐藏
yexin218.cublog.cn
VirtualWiFi缓冲区数据组织
关于VirtualWiFi,我就不想再多说了,一个虚拟化的网络技术。可以实现单张网卡同时多个网络连接。如下图:
其实呢,根据IEEE802.11协议,一种wifi网卡只能连接或者关联一个网络。所谓的虚拟化的技术也不能违背这个协议,所以它的实现方法是高速的再多个网络切换,就像CPU调度一样为每一个thread分配服务时间,VirtualWiFi就是这个工作原理。所以上图显示的connection1是激活状态的(active),connnection2就是未激活(passive).只有active的网络才能发送和接受数据,如果passive的网络比如connection2想发送数据,哪么它的数据就会被缓冲起来直到下个时间段,conneciton2被激活(activeated)才能发送缓冲期的数据。本章简单介绍VirtualWiFi中数据在缓冲区是如何组织的。其实不是很难的数据结构,至少一个link queue.先来看看这个link queue的结构定义:
 

typedef struct _QUEUE_ENTRY
{
    struct _QUEUE_ENTRY *Next;
} QUEUE_ENTRY, *PQUEUE_ENTRY;

typedef struct _QUEUE_HEADER
{
    PQUEUE_ENTRY Head;
    PQUEUE_ENTRY Tail;
} QUEUE_HEADER, *PQUEUE_HEADER;

这个link queue有一个Queue_Header.它包含head,tail两个指针,分别指向头尾。link queue里面的还有一个next指针指向下个entry.所以在结构初始化的时候,head和tail两个指针都赋值为NULL.

#define InitializeQueueHeader(QueueHeader) \
    { \
        (QueueHeader)->Head = (QueueHeader)->Tail = NULL; \
    }

所以插入动作也很简单,看源码:

#define InsertTailQueue(QueueHeader, QueueEntry) \
    { \
        ((PQUEUE_ENTRY)QueueEntry)->Next = NULL; \
        if ((QueueHeader)->Tail) \
            (QueueHeader)->Tail->Next = (PQUEUE_ENTRY)(QueueEntry); \
        else \
            (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry); \
        (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry); \
    }

用结构图来显示工作原理最适合不过了;

那么同样,当connection2激活的时候,需要发送缓冲期的数据的时候,是从entry1开始逐个发送的。源代码:

#define RemoveHeadQueue(QueueHeader) \
    (QueueHeader)->Head; \
    { \
        PQUEUE_ENTRY pNext; \
        ASSERT((QueueHeader)->Head); \
        pNext = (QueueHeader)->Head->Next; \
        (QueueHeader)->Head = pNext; \
        if (pNext == NULL) \
            (QueueHeader)->Tail = NULL; \
    }

用图表来表示更为清楚了然:

很简单吧。不过数据结构对整个程序的开发很重要。而毕业设计所涉及的也就是这些数据的处理。好了,数据处理就先到这里。

-----------------------------------

 TAG VirtualWiFi 数据组织
发表于: 2008-05-12,修改于: 2008-05-12 17:25,已浏览236次,有评论0条 推荐 投诉

给我留言
版权所有 ChinaUnix.net 页面生成时间:0.02278