读书频道 > 网站 > 网页设计 > 深入理解Android:Wi-Fi、NFC和GPS卷
3.3.5 802.11 MAC服务和帧
14-05-24    奋斗的小年轻
收藏    我要投稿   
本书是经典畅销书深入理解Android系列的新作,由资深Android系统专家邓凡平先生撰写。从通信专业知识和Android系统代码实现的角度,对Netd、Wi-Fi、NFC和GPS等模块的代码进行深入的剖析,旨在深刻揭示其实现原理立即去当当网订购

本节将向读者介绍802.11中MAC服务以及MAC帧方面的内容。首先来看MAC服务。

1. MAC服务定义[14]

根据3.3.1节所示,MAC层定义了一些Service用于为上层LLC提供服务。其中,802.11中定义的MAC提供三种服务,分别如下。

MA-UNITDATA.request:供LLC层发送数据。

MA-UNITDATA.indication:通知LLC层进行数据接收。

MA-UNITDATA-STATUS.indication:通知LLC层自己(即MAC层)的状态。

规范中这三种服务的定义和编程语言中的函数非常像。根据前文所述,服务在规范中被称为原语(primitive),每个服务有特定的参数(parameter)。另外,规范对每条原语都做了非常详细的解释,例如原语使用场景(从编程角度看就是介绍什么时候用这些API),MAC层如何处理这些原语(从编程角度看即描述应该如何实现这些API)。

(1)MA-UNITDATA.request服务

request用于发送数据,其定义如下所示。
MA-UNITDATA.request(
  source address  // 指定本次数据发送端的MAC地址
  destination address // 指定接收端的MAC地址。可以是组播或广播地址
  routing information // 路由信息。对于802.11来说,该值为null(表示该值没有作用)
  data   // MSDU,即上层需要发送的数据。对802.11来说,其大小不能超过2304字节
  priority   // priority和service class的解释见下文
  service class
  )

request原语中,除priority和service class参数外,其他都很容易理解。而priority和service class参数与QoS有关系。

priority的取值为0~15的整数。对于非QoS相关的操作,其取值为Contention和ContentionFree。802.11中,QoS设置了不同的用户优先级(User Priority,UP)。显然,UP高的数据将优先得到发送。Priority参数和QoS中的其他参数一起决定发送数据的优先级。

service class的取值也针对是否为QoS而有所不同。对于非QoS,取值可为ReorderableGroupAddressed或StrictlyOdered。这两个都和数据发送时是否重排(reorder)发送次序有关。非QoS情况下,STA发送数据时并不会主动去调整发送次序。而QoS情况下,很明显那些UP较高的数据见得到优先处理。但对于组播数据,发送者可以设置service class为ReorderableGroupAddressed进行次序调整。

对request原语来说,当LLC需要发送数据时,就会调用request。MAC层需要检查参数是否正确。如果不正确,将通过其他原语通知LLC层,否则将启动数据发送流程。

(2)MA-UNITDATA.indication服务

下面来看MAC层收到数据后用于通知LLC层的原语indication,其定义如下。
MA-UNITDATA.indication(
  source address // 代表数据源MAC地址。其值取值MAC帧中的SA(关于MAC帧格式详情见后文)
  destination address // 代表目标MAC地址,取自MAC帧中的DA,可以是组播地址
  routing information // 值为null
  data   // MAC帧数据
  reception status  // 表示接收状态,例如成功或失败。对802.11来说,该状态永远返回success
    // MAC层会丢弃那些错误的数据包
  priority   // 和request的取值略有不同,此处略过
  service class
)

802.11中,indication只有在MAC层收到格式完整、安全校验无误及没有其他错误的数据包时才会被调用以通知LLC层。

(3)MA-UNITDATA-STATUS.indication服务
STATUS.indication用于向LLC层返回对应request原语的处理情况。其原型如下。
MA-UNITDATA-STATUS.indication(
   // source和destination address和对应request的前两个参数一样
   source address
   destination address
   transmission status // 返回request的处理情况,详情见下文
   provided priority // 只有status返回成功,该参数才有意义。其值和调用request发送数据时的值一致
   provided service class // 只有status返回成功,该参数才有意义
  )

indication最关键的一个参数是transmission status,可以是以下值。

Successful:代表对应request发送数据成功。

Undeliverable:数据无法发送。其原因有数据超长(excessive data length)、在request时指定了routing information(non-null source routing)、不支持的priority和service class、没有BSS(no BSS available)、没有key进行加密(cannot encrypt with a null key)等。

提示 本节对应于规范的第5节“MAC service definition”。和前面内容相比,本节内容更贴近于代码实现,当然也就更符合程序员的“审美观”。

接下来介绍和MAC帧相关的内容。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站