80211 TIM流量指示图 附C语言实现

news2024/10/6 2:21:07

TIM是什么?

TIM:Traffic Indication Map,流量指示图。
在80211协议节能模式中,AP会缓存下行数据,AP就是通过beacon帧中TIM来告知休眠中的STA有数据需要接收。
DTIM:Delivery Traffic Indication Map,是一种特殊的TIM,其除了缓存的单播信息,也同时指示AP缓存的组播信息。

TIM格式

TIM IE包含了四个域:DTIM Count, DTIM Period, Bitmap Control, and Partial Virtual
Bitmap。
在这里插入图片描述

Length:1byte,表示TIM的长度。
DTIM Count:1byte,表示下次DTIM之前还有多少个beacon帧(包括当前的beacon帧),如果DTIM Count为0表示当前的TIM就是DTIM。
DTIM Period:1byte,表示两个DTIM之间有多少个beacon帧。1表示所有的TIM都是DTIM。
Bitmap Control:1byte,bit0表示是否有组播/广播数据包缓存,1表示有组播/广播数据包缓存,0表示没有。bit1-7表示bitmap的偏移情况,即Partial Virtual Bitmap起始值是多少。
Partial virtual Bitmap:1-251byte,以Bitmap Control的起始值开始的bitmap。可以表示的范围0~2007。

TIM编码例子

第一个例子,AP没有缓存组播/广播的下行数据,只缓存了STA AID 2和AID 7的数据。其中Bitmap Control为0x00,Partial Virtual Bitmap为0x84。
在这里插入图片描述

运行结果:
在这里插入图片描述

第二个例子,AP缓存了组播/广播的下行数据,还缓存了STA AID 2, AID 7, AID 22和AID 24的数据。
在这里插入图片描述

运行结果:
在这里插入图片描述

第三个例子,AP缓存了组播/广播的下行数据,还缓存了STA AID 24的数据。
在这里插入图片描述
运行结果:
在这里插入图片描述

TIM C语言实现demo

#include <stdio.h>
#define ADD_TIM_BIT 0
#define REMOVE_TIM_BIT 1
#define TIM_ELEMENT_ID 5
#define TIM_BASE_SIZE 3 /* size of TIM fields */
#define AID_SIZE 2008 /* valid AIDs are 1 thru 2007 */
#define VBM_SIZE 251 /* size of VBM array = 2008/8 = 251 */
typedef unsigned char UINT8;
typedef unsigned short int UINT16;

struct _tim
{
	UINT8 Element_id;
	UINT8 IELength;
	UINT8 DtimCount;
	UINT8 DtimPeriod;
	UINT8 BitMapControl;
	UINT8 PartialVirtualBitMap[VBM_SIZE];
};

UINT8 virtualBitMap[VBM_SIZE];
UINT8 mcast_pending = 0;
UINT8 dtimCount = 0;
UINT8 dtimPeriod = 5;

void Build_TIM(struct _tim * Tim)
{
	UINT8 octetIndex;
	UINT8 offset = 0;
	UINT8 lengthOfPartialVirtualBitMap = 0;
	/* Find first nonzero octet in the virtual bit map */
	for (octetIndex = 0; ((virtualBitMap[octetIndex] == 0) && (octetIndex < VBM_SIZE)); octetIndex++)
		/* empty */;
	if (octetIndex < VBM_SIZE)
		/* Clear the lsb as it is reserved for the broadcast/ multicast indication bit */
		offset = octetIndex & 0xFE;
	/* Find last nonzero octet in the virtual bit map */
	for (octetIndex = (VBM_SIZE - 1); ((virtualBitMap[octetIndex] == 0) && (octetIndex > 0)); octetIndex--)
		/* empty */;
	lengthOfPartialVirtualBitMap = octetIndex - offset + 1;
	Tim->Element_id = TIM_ELEMENT_ID;
	Tim->IELength = lengthOfPartialVirtualBitMap + TIM_BASE_SIZE;
	Tim->DtimCount = dtimCount;
	Tim->DtimPeriod = dtimPeriod;
	Tim->BitMapControl = offset;
	/* Update broadcast/ multicast indication bit if necessary */
	if ((Tim->DtimCount == 0) && mcast_pending)
		Tim->BitMapControl |= 0x01;
	/* Copy the virtual bit map octets that are nonzero */
	/* Note: A NULL virtualBitMap will still add a single octet of zero */
	for (octetIndex = 0; octetIndex < lengthOfPartialVirtualBitMap; octetIndex++)
		Tim->PartialVirtualBitMap[octetIndex] = virtualBitMap[offset + octetIndex];
}

void Update_VirtualBitMap(UINT16 station_id, UINT8 Action)
{
	UINT16 aid = station_id;
	UINT8 aid_octet;
	UINT8 aid_bit;
	if ((aid > 0) && (aid < AID_SIZE))
	{
		/* Get aid position in Virtual Bit Map. */
		aid_octet = (UINT8)(aid >> 3);
		aid_bit = (UINT8)(0x01 << (aid & 0x07));
		if (Action == REMOVE_TIM_BIT)
			virtualBitMap[aid_octet] &= ~aid_bit;
		else
			virtualBitMap[aid_octet] |= aid_bit;
	}
}

void main(void)
{
	struct _tim Tim;
	UINT8 ExampleCase;
	ExampleCase = 3;
	switch (ExampleCase)
	{
	case 1:
		mcast_pending = 0;
		Update_VirtualBitMap(2, ADD_TIM_BIT);
		Update_VirtualBitMap(7, ADD_TIM_BIT);
		break;
	case 2:
		mcast_pending = 1;
		Update_VirtualBitMap(2, ADD_TIM_BIT);
		Update_VirtualBitMap(7, ADD_TIM_BIT);
		Update_VirtualBitMap(22, ADD_TIM_BIT);
		Update_VirtualBitMap(24, ADD_TIM_BIT);
		break;
	case 3:
		mcast_pending = 1;
		Update_VirtualBitMap(24, ADD_TIM_BIT);
		break;
	case 4:
		mcast_pending = 0;
		Update_VirtualBitMap(3, ADD_TIM_BIT);
		Update_VirtualBitMap(37, ADD_TIM_BIT);
		Update_VirtualBitMap(43, ADD_TIM_BIT);
		break;
	case 5:
		mcast_pending = 0;
		Update_VirtualBitMap(35, ADD_TIM_BIT);
		break;
	case 6:
		mcast_pending = 0;
		Update_VirtualBitMap(43, ADD_TIM_BIT);
		break;
	case 7:
		mcast_pending = 0;
		Update_VirtualBitMap(35, ADD_TIM_BIT);
		Update_VirtualBitMap(35, REMOVE_TIM_BIT);
		break;
	case 8:
		mcast_pending = 1;
		Update_VirtualBitMap(13, ADD_TIM_BIT);
		Update_VirtualBitMap(43, ADD_TIM_BIT);
		Update_VirtualBitMap(63, ADD_TIM_BIT);
		Update_VirtualBitMap(73, ADD_TIM_BIT);
		break;
	case 9:
		mcast_pending = 1;
		Update_VirtualBitMap(2007, ADD_TIM_BIT);
		break;
	default:
		break;
	}
	Build_TIM(&Tim);
	printf("Element_id = %d.\n", Tim.Element_id);
	printf("IELength = %d.\n", Tim.IELength);
	printf("DtimCount = %d.\n", Tim.DtimCount);
	printf("DtimPeriod = %d.\n", Tim.DtimPeriod);
	printf("BitMapControl = 0x%02X\n", Tim.BitMapControl);
	if (Tim.IELength - TIM_BASE_SIZE > 0)
	{
		int octetIndex;
		for (octetIndex = 0; octetIndex < Tim.IELength - TIM_BASE_SIZE; octetIndex++)
			printf("PartialVirtualBitMap [%d] = 0x%02X\n", octetIndex, Tim.PartialVirtualBitMap
				[octetIndex]);
	}
}

参考

802.11-2007.pdf Annex L

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

css引入其它字体

1、下载需要的字体&#xff0c;放到下图的文件夹中。 2、把下载的字体文件放到项目的font目录下 3、在css中加入下面的代码 font-face {font-family: "思源黑体";src: url("../font/SourceHanSansCN-Normal.ttf"); } * { font-family: "思源黑体&quo…

【计算机网络】Cookie、Session和上传文件重点知识汇总

目录 1.Cookie基础知识&#xff1a; 2.Session基础知识&#xff1a; 3.相关API&#xff1a; 3.1.HttpServletRequest类&#xff1a; 3.2.HttpServletResponse类&#xff1a; 3.3.HttpSession类&#xff1a; 3.4.Cookie类&#xff1a; 3.5.模拟实现登录页面 4.上传文件…

伸展树原理介绍

一 点睛 伸展树&#xff0c;也叫作分裂树&#xff0c;是一种二叉搜索树&#xff0c;可以在 O (logn ) 内完成插入、查找和删除操作。在任意数据结构的生命周期内执行不同操作的概率往往极不均衡&#xff0c;而且各操作之间有极强的相关性&#xff0c;在整体上多呈现极强的规律…

【LeetCode】882. 细分图中的可到达节点

题目描述 给你一个无向图&#xff08;原始图&#xff09;&#xff0c;图中有 n 个节点&#xff0c;编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链&#xff0c;每条边之间的新节点数各不相同。 图用由边组成的二维数组 edges 表示&#xff0c;其中 edges[i] [ui…

ESG,TO B长期主义里的「新战役」

中国企业最好的方式是从初始阶段就植入ESG基因&#xff0c;使它逐渐从隐形变成显性基因。长期坚持此类发展导向&#xff0c;对后续发展ESG战略&#xff0c;提升ESG合规能力也将成为一种积累和准备。 作者|三七 编辑|皮爷 出品|产业家 20世纪初期&#xff0c;伦敦得到一个延…

MyBaits-Plus中@TableField和@TableId用法

目录 前言 一、TableField(value "表字段") 二、TableField(select false) 三、TableField(exist false) 四、TableId(type IdType.AUTO)补充 总结 前言 接着前两篇mybatis-plus的知识点 Mybatis-Plus知识点[MyBatisMyBatis-Plus的基础运用]_心态还需努力呀…

论文阅读: Disentangled lmage Colorization via Global Anchors

Disentangled lmage Colorization via Global Anchors发表于SIGGRAPH ASIA 2022&#xff0c;是一篇基于深度学习的图像彩色化的工作&#xff0c;简单介绍一下。之前曾分享过一篇彩色化的经典论文&#xff1a;经典论文回顾: Colorization using Optimization。 作者认为图像彩色…

【数据库】索引

MySQL索引 1、B树索引 是InnoDB引擎默认的索引 B树结构 B树是平衡树&#xff0c;即所有叶子节点都在同一层的多叉树 每个节点中key和指针交替排列&#xff0c;两个key之间的指针指向的是大于等于左边key且小于等于右边key的节点 叶子节点顺次连接&#xff0c;所以沿着B树的叶…

ADAU1860调试心得(5)ADC-DAC直通程序

硬件、驱动全部都搞好了&#xff0c;我觉得调试记录的话&#xff0c;就从最简单的开始&#xff0c;先做一个直通的例程。先把这个板子弄出声来&#xff0c;会用sigmastudio&#xff0c;会做ADAU开发的兄弟们应该很熟悉&#xff0c;同样的配方&#xff0c;同样的味道&#xff0c…

Nginx--单向链表分析

1.基本数据结构 1.1结点 struct ngx_list_part_s {void *elts;ngx_uint_t nelts;ngx_list_part_t *next; };结构成员分析 void* elts :数组元素指针 ngx_uint_t :数组里面的元素数量 ngx_list_part_t*…

英文Assignment写作引用格式怎么分析?

英文Assignment写作中我们常常使用不同作家和研究员的观点&#xff0c;论证来支持自己的想法。引用他们原文的时候我们必须使用具体引用格式。不同学校对引用格式都有不同的要求。事实上&#xff0c;有很多不同的引用格式&#xff0c;大约有超过200种引用格式。例如我们耳熟能详…

一文读懂!异常检测全攻略!从统计方法到机器学习

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 数据分析实战系列&#xff1a;https://www.showmeai.tech/tutorials/40 &#x1f4d8; 机器学习实战系列&#xff1a;https://www.showmeai.tech/tutorials/41 &#x1f4d8; 本文地址&#xff1a;https://showmea…

Day12--优化分类页面的效果

1.提出一个问题&#xff0c;当你点击一级分类的时候&#xff0c;在三级分类中滚动自己的进度条。切换到之后的另一级分类再看看其三级分类时不是再最顶部。 我的操作&#xff1a; 1》在cate.vue中&#xff1a; *************************************************************…

大数据必看:大厂十年架构师职业生涯实战经验总结,《大规模分布式系统架构与设计实战》

前言 这段时间一直在读一本书《大规模分布式系统架构与设计实战》&#xff0c;这是淘宝千峰老师的作品&#xff0c;是从程序员到首席架构师十多年职业生涯的实战经验总结。 这本书其实是围绕着Fourinone在讲分布式&#xff0c;并非分布式理论&#xff0c;所以只适用于想研究F…

【allegro 17.4软件操作保姆级教程五】布线前准备之过孔、差分对、布线集合添加

目录 1.1 过孔添加与设置 1.2 添加差分对 1.3 添加布线集合 1.1 过孔添加与设置 布线换层时需要由过孔贯穿&#xff0c;而软件本身是没有过孔可以直接调用的&#xff0c;所以需要手动添加和设置。一般我们使用的都是通孔&#xff0c;盲孔和埋孔成本高&#xff0c;一般不使用。…

PG::Photography

nmap -Pn -p- -T4 --min-rate1000 192.168.171.76 nmap -Pn -p 22,80,139,445,8000 -sCV 192.168.171.76 查看8000端口的内容 CMS的关键字“Built with Koken” 存在的漏洞需要认证 https://www.exploit-db.com/exploits/48706 在端口枚举时&#xff0c;该靶机有smb服务&am…

MyBatis-Plus之DML编程控制

1. id生成策略控制 前面我们在新增的时候留了一个问题&#xff0c;就是新增成功后&#xff0c;主键ID是一个很长串的内容&#xff0c;我们更想要的是按照数据库表字段进行自增长&#xff0c;在解决这个问题之前&#xff0c;我们先来分析下ID该如何选择&#xff1a; 不同的表应…

vscode一键生成佛祖保佑永无bug

工欲善其事&#xff0c;必先利其器 今天给大家分享一个vscode注释插件-koroFileHeader&#xff0c;可以快速给我们的文件和函数添加注释&#xff0c;快来看看吧 安装 打开vscode拓展&#xff0c;搜索“koroFileHeader”&#xff0c;安装&#xff0c;重新启动一下 使用 快捷键 生…

【配置nacos】使用application.yml配置文件来配置spring-cloud-starter-alibaba-nacos-config

1.首先修改pom.xml文件&#xff0c;引入spring-cloud-starter-alibaba-nacos-config依赖 <!--Nacos配置管理--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><…

Java#26(常见算法: 排序算法)

目录 一.冒泡排序 相邻元素之间两两比较,大的放右边,小的放左边 二.选择排序 从0索引开始,拿着每一个索引上的元素和后面的元素依次标胶,小的放在前面,大的放在后面 三.插入排序 假如0到n索引的数据遵循从小到大排序,就可以将0-n看做有序的,则n1到最大索引都是无序的 四…