Linux下的wifi开发

Linux 无线扩展(Wireless Extensions, WEXT)是什么

Linux 无线扩展(Wireless Extensions,WEXT)是一套在 Linux 操作系统中使用的标准网络接口,用于与无线网络硬件交互。以下是关于它的详细介绍:

  1. 功能作用

    1. 配置无线网络:提供了一组接口和内核编程函数,使用户空间程序能够实现对无线网络设备的配置,如设置网络名称(ESSID)、频段、传输功率等参数。

    2. 监控无线网络状态:可以获取无线网络的相关状态信息,例如信号强度、连接状态、当前连接的网络等,帮助用户了解无线网络的具体情况。

    3. 管理网络安全:支持多种无线网络安全机制,包括设置 WEP、WPA、WPA2 等加密机制,以及管理接入控制列表(ACL),保障无线网络的安全性。

  2. 工作原理

    1. 应用层与驱动通信:应用层采用 ioctl 方式访问驱动,通过这种方式设置无线参数或者获取无线参数,从而配置无线驱动进行联网操作。

    2. 事件传递机制:无线驱动事件到应用层的传递采用 netlink socket 技术,这是一种 netlink route 消息技术,确保了驱动事件能够及时准确地通知到应用层。

  3. 发展历程

    1. 由开发者 Jean Tourrilhes(惠普实验室软件工程师)于 1997 年定义。

    2. 在 linux-2.6.18 版本之前,linux 内核代码中并没有提供无线驱动接口以及无线驱动协议栈,当时的无线驱动协议栈软件较多,如开源项目 hostap、madwifi、mac80211、ieee80211 协议栈以及无线芯片厂商自己实现的协议栈等,基本都使用 wext 接口,使其逐渐成为一套标准的接口。

    3. 在 linux-2.6.18 版本,wext 和 mac80211 协议栈并入内核,成为 linux kernel 的一部分。随着 802.11 协议的发展,wext 的 API 不断增加,其版本号也不断变化。

    4. 在 linux-2.6.25 之后,wext API 接口版本停止在 V22 就不再进行更新,逐渐被 nl80211 接口替代。

总之,Linux 无线扩展(Wireless Extensions,WEXT)为 Linux 系统下的无线网络管理提供了基础框架和工具,但随着技术的发展,它逐渐被更先进的接口所取代。

NL80211和Netlink都是Linux内核中与网络通信相关的机制,但它们在功能和用途上有所不同。

NL80211

定义:NL80211是Linux内核中用于无线局域网(WLAN)设备配置和管理的一套接口,它基于Netlink协议族实现,提供了一种从用户空间到内核空间的通信机制。

功能:NL80211允许用户空间的应用程序通过发送命令、获取信息等方式来配置和管理无线网络设备,如设置Wi-Fi的SSID、加密方式、信道等参数,以及查询当前连接状态、信号强度等信息。

特点:NL80211主要关注于无线网络的配置和管理,是Linux下新的无线驱动框架,旨在取代旧的cfg80211和基于ioctl的wext框架。

Netlink

定义:Netlink是Linux内核中的一种IPC(进程间通信)机制,它允许内核内部、内核与用户态应用之间甚至用户态应用之间进行通信。

功能:Netlink支持多种通信场景,包括路由表更新、网络设备状态通知、防火墙规则设置等。它允许用户空间程序通过socket API与内核中的Netlink服务进行通信,从而获取或设置网络相关的信息。

特点:Netlink是一种通用的通信机制,不仅限于无线网络领域。它具有异步通信的特点,消息保存在socket缓存队列中,发送消息只是将消息保存在接收者的socket接收队列中,不需要等待接收者收到消息。

关系

依赖关系:NL80211依赖于Netlink协议来实现用户空间与内核空间之间的通信。具体来说,NL80211使用Netlink套接字作为其通信通道,通过这个通道发送和接收与无线网络配置和管理相关的消息。

集成方式:在Linux内核中,NL80211作为Netlink的一个用户,注册了自己的Netlink协议族(通常是GENERICNETLINK_FAMILY),并实现了一组回调函数用于处理接收到的消息。当用户空间的应用程序通过NL80211接口发送请求时,这些请求会被封装成Netlink消息并通过socket发送到内核空间,内核空间的NL80211模块接收到消息后会根据请求的类型调用相应的处理函数来完成操作。

综上所述,NL80211是专门用于无线局域网设备配置和管理的用户空间接口,而Netlink则是实现这种通信的底层机制。两者紧密合作,共同完成了用户空间与内核空间之间关于无线网络配置和管理的信息交互。

 

wext和nl80211接口

Linux两种无线驱动接口 :wext和nl80211接口简介

Linux无线驱动接口有两种标准接口,wext(Wireless Extensions无线扩展接口)和nl80211接口。

在linux-2.6.18版本之前,linux内核代码中并没有提供无线驱动接口以及无线驱动协议栈。wext是由开发者Jean Tourrilhes (惠普实验室软件工程师)定义的一套供用户层软件访问无线驱动以及驱动事件通知用户层的接口。当时无线驱动的协议栈软件比较多,如开源项目hostap,madwifi,mac80211,ieee80211协议栈以及无线芯片厂商自己实现的协议栈,基本都使用wext接口。wext接口也逐渐成为一套标准的接口。在linux-2.6.18版本,wext和mac80211协议栈并入内核,成为linux kernel的一部分。wext接口随着802.11协议从802.11,802.11b,802.11a/g的发展,其API也不断增加,伴随着就是其wext的版本号不断变化。

wext的接口实现上,应用层采用ioctl方式访问驱动,设置无线参数或者获取无线参数,配置无线驱动进行联网操作。无线驱动事件到应用层的传递采用的netlink socket技术,一种netlink route消息技术。这也是很多其他类型的驱动标准的实现方法。但在linux-2.6.25(记得不是很清楚了,懒得确定了)之后,wext API接口版本停止在V22就不再进行更新了。而替代其的是nl80211接口。

nl80211接口其实在linux-2.6.18并入wext和mac80211协议栈的时候已经提供,但当时的功能还不完整,而且应用层的软件还是都使用WEXT接口,驱动基本不使用nl80211接口实现(除了基于mac80211协议栈的驱动)。 nl80211接口是由开发者Johannes Berg实现的,他也是cfg80211(无线协议栈配置接口,在无线驱动接口和mac80211之间的接口)和mac80211的维护者。无论是用户层访问驱动还是驱动事件通知应用层,nl80211接口都采用的netlink技术。

nl80211接口逐渐替代wext接口的原因主要是使用netlink技术在应用层和内核层数据交换上相比ioctl方式具有优势,而且很多其他之前使用ioctl的驱动也逐渐采用了netlink方式。再一个原因就是802.11协议的发展,随着802.11n协议以及P2P,WPS无线规范的加入,协议的很多功能可以在应用层实现,增加了很多应用层与驱动层间的API接口和事件。WEXT接口不方便功能扩展的缺点,nl80211可以完全支持wext的所有功能,又可以在不修改内核的情况下增加命令字和事件。无线驱动接口从wext发展到nl80211也就顺理成章。

目前linux内核中无线驱动的实现大部分基于mac80211协议栈,无线驱动接口也是可选的,可以使用任意一种,也可以同时使用。wpa_supplicant编译时,则根据无线驱动的接口使用情况,确定采用哪种配置接口。

nl80211除了确定应用层和驱动层的交互标准外,对802.11协议的实现功能划分产生影响。目前通常的802.11 SME功能(无线服务管理实体,即协议栈功能)在驱动或者芯片固件中实现,nl802.11的作者希望在应用层实现更多的协议功能。wpa_supplicant(包括hostapd)除了实现WPA认证,P2P,WPS的大部分功能外,它还实现了SME功能,在这种功能划分模式下,无线驱动基本上只需要实现配置硬件和数据收发功能。

linux系统下wpa_supplicant的Driver Event模块和Driver I/F模块(这两者实现是在一个文件,初始化在一个函数,划分成两个模块只是设计理解更清晰)的分析也分wext部分和nl80211部分。

关于netlink技术,可参考:

netlink原理及应用-优快云博客

netlink是一种基于网络的通信机制,允许内核内部、内核与用户态应用之间甚至用户态应用之间进行通信;netlink的主要作用是内核与用户态之间通信;它的思想是,基于BSD的socket使用网络框架在内核和用户态之间进行通信;

为什么要有netlink
内核中有其他一些方法可以实现用户空间和内核通信,如procfs、sysfs和ioctrl等;netlink相比于这些方法,有以下优势:

  • 任何一方都不需要轮询;如果通过文件通信,用户态应用需要不断检查是否有新消息到达;
  • netlink使用简单,它是基于socket的,可以使用socket api;
  • 只需要在netlink协议族中新增加一个协议;使用netlink的内核部分可以采用模块的方式实现,之后使用socket api进行通信;
  • 内核可以直接向用户层发送信息,而无需用户层事先请求;
  • netlink支持单播、组播;内核模块可以把消息发送到一个多播组。

无线网卡的工作模式

1.

无线网卡的四种工作模式 一般有四种工作模式,即 Managed,Master,Ad-hoc,Monitor

  • 1.1   Managed 模式 该模式用于你的无线客户端直接与无线接入点(Access Point,即AP)进行接入连接。在这个模式中,我们可以进行无线接入internet上网,无线网卡的驱动程序依赖无线AP管理整个通信过程。
  • 1.2   Master 模式 一些无线网卡支持Master模式。这个模式允许无线网卡使用特制的驱动程序和软件工作,作为其他设备的无线AP。它主要使用于无线接入点AP提供无线接入服务以及路由功能。比如无线路由器就是工作在Master模式下了,对于普通的pc机来说,如果有合适的硬件它也可以变成一台无线AP。
  • 1.3   Ad hoc模式 当你的网络由互相直连的设备组成时,就使用这个模式。在这个模式中,各设备之间采用对等网络的方式进行连接,无线通信双方共同承担无线AP的职责。
  • 1.4   Monitor 模式 Monitor模式主要用于监控无线网络内部的流量,用于检查网络和排错。要使Wireshark捕获无线数据包,你的无线网卡和配套驱动程序必须支持监听模式(也叫RFMON模式)。

2.

WIFI的具体模式 Linux系统下关于WIFI的配置,其具体的模式主要有以下这几种:STA模式、AccessPoint模式、Monitor模式、Ad-hoc(IBSS)模式、WDS模式、Mesh模式。

  • 2.1   第一种:STA模式 任何一种无线网卡都可以运行在此模式下,这种模式也可以称为默认模式。在此模式下,无线网卡发送连接与认证消息给热点,热点接收到后完成认证后,发回成功认证消息,此网卡接入无线网络。这种模式下,wifi工作于从模式
  • 2.2   第二种:AccessPoint模式 在一个无线网络环境中,无线热点是作为一个主设备,工作于主模式(Master mode)。通过管理控制可控制的STA,从而组成无线网络,也有相应的安全控制策略。由AP形成的网络,由AP的MAC地址唯一识别。热点完成创建后,会由热点创建一个被别的设备可识别的名称,称为SSID。在Linux下,要使用AP模式,必须使系统支持hostapd。
  • 2.3   第三种:Monitor模式 这种模式下,所有的数据包无过滤地传输到主机,此模式下主要查看网络中出了那些故障。在支持MAC80211的一般设备中,工作于Monitor模式下,可以有效地对整个网络进行监控,在此模式下,可以实现数据包的注入,在用户模式下,想要在应用程序中部署MLME(Media Access Control (MAC) Sublayer Management Entity)非常有用。
  • 2.4   第四种:Ad-hoc(IBSS)模式 Ad-hoc又称为独立基本业务集,用以创建一个无线网络,此网络中不需要热点(AP),此网络中的每个节点的地位都是对等的,此模式用以连接几个不能通过基站进行通信的电脑。ad-hoc模式就和以前的直连双绞线概念一样,是P2P的连接,所以也就无法与其它网络沟通了。一般无线终端设备像PMP、PSP、DMA等用的就是ad-hoc模式。 在家庭无线局域网的组建,大家都知道最简单的莫过于两台安装有无线网卡的计算机实施无线互联,其中一台计算机连接Internet就可以共享带宽。Ad-Hoc结构是一种省去了无线AP而搭建起的对等网络结构,只要安装了无线网卡的计算机彼此之间即可实现无线互联;其原理是网络中的一台电脑主机建立点对点连接相当于虚拟AP,而其它电脑就可以直接通过这个点对点连接进行网络互联与共享。 由于省去了无线AP,Ad-Hoc无线局域网的网络架设过程十分简单,不过一般的无线网卡在室内环境下传输距离通常为40m左右,当超过此有效传输距离,就不能实现彼此之间的通讯;因此该种模式非常适合一些简单甚至是临时性的无线互联需求。
  • 2.5   第五种:WDS模式 WDS全名为无线分布式系统。以往在无线应用领域中它都是帮助无线基站与无线基站之间进行联系通讯的系统。WDS的功能是充当无线网络的中继器,通过在无线路由器上开启WDS功能,让其可以延伸扩展无线信号,从而覆盖更广更大的范围。WDS可以让无线AP或者无线路由器之间通过无线进行桥接(中继),而在中继的过程中并不影响其无线设备覆盖效果的功能。这样我们就可以用两个无线设备,让其之间建立WDS信任和通讯关系,从而将无线网络覆盖范围扩展到原来的一倍以上,大大方便了我们无线上网。
  • 2.6   第六种:mesh模式 Mesh接口使设备之间动态建立路由,从而实现通信。无线Mesh网络中,任何无线设备节点都可以同时作为AP和路由器,网络中的每个节点都可以发送和接收信号,每个节点都可以与一个或者多个对等节点进行直接通信。这种结构的最大好处在于:如果最近的AP由于流量过大而导致拥塞的话,那么数据可以自动重新路由到一个通信流量较小的

udhcpd和udhcpc

我们常用到udhcpc,对udhcpd并不熟悉,其实udhcpd是工作在server端的DHCP服务,udhcpc则是工作在client端的DHCP服务。

udhcpd和udhcpc都是UDHCP(MicrO DHCP)的一部分,UDHCP是一个轻量级的DHCP客户端/服务器实现,旨在用于嵌入式系统和小型网络设备。

  • udhcpd是UDHCP的服务器端,用于为设备分配!P地址和其他网络配置信息。它可以配置为为设备提供静态!P地址或动态分配!P地址udhcpd可以在Linux系统上运行,例如嵌入式Linux设备。
  • udhcpc是UDHCP的客户端,用于从DHCP服务器获取IP地址和其他网络配置信息。它可以在启动时自动获取IP地址,并在网络配置更改时更新。udhcpc也可以在Linux系统上运行,例如嵌入式Linux设备。

总之,udhcpd和udhcpc都是UDHCP的组成部分,用于在嵌入式系统和小型网络设备中提供轻量级的DHCP客户端/服务器实现

Linux的udhcpd和dsnmasg是什么?

udhcod和dnsmasa都是Linux操作系统中的DHCP服务器软件。其中,udhcpd是一个非常简单的DHCP服务器软件,它能够为局域网上的设备分配!P地址和其他必要的网络配置信息,而dnsmaso则是一个更加强大和灵活的DHCP服务器软件,它不仅支持DHCP功能,还可以提供DNS解析、TFTP服务器和BOOTP服务器等功能。

udhcpd.conf

udhcpd.conf是一个用于配置Linux系统上的udhcpd软件的配置文件。udhcpd是一个用于实现DHCP服务器的软件,可以将一台Linux系统配置为一个DHCP服务器,以便其他设备可以获取到该服务器分配的IP地址、子网掩码、网关等参数。在udhcpd.con文件中,可以设置DHCP服务器的IP地址、子网掩码、网关、DNS服务器、租期等参数。此外,还可以设置!P地址池范围、静态!P地址分配、MAC地址绑定等高级功能。通过编辑udhcpd.conf文件,可以轻松地配置Linux系统上的DHCP服务器,为网络设备提供自动化的IP地址分配服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值