lwip基于windows移植的资料整理

Winpcap:
1.
(1)Lwip在Windows上移植的关键
(2)Winpcap抓包原理
(3)通用应用编程接口libpcap

因为基于开发板的发送过程,开发板上有网卡硬件,而网卡硬件和处理器直接相连,一旦网卡检测到有数据包,则会产生一个中断,通知处理器,从而去网卡里面读包,然后再把包输入到tcp/ip内核(lwip协议栈)。
而windows操作系统屏蔽了网卡和处理器的一些细节,对应用程序来说是没法获得网卡的信息,硬件中断等,所以需要借助于windows下的Winpcap工具,通过它来抓取windows环境下的数据包(它提供了一些抓包的内核函数)。获得包之后再输入到lwip内核。

lwip基于windows移植的资料整理_第1张图片
上图中左边部分是lwip在windowsOS中,如果没有Winpcap抓包工具的发送流程,右边是有Winpcap抓包工具的发送流程,其中最重要的部件是NPF,它可以直接从网卡驱动程序中将数据包复制一份出来,复制之后将包输入给上层Wpcap.dll和packet.dll,他们是上层应用可以调用的API函数,这些API实现了应用程序编程接口Libpcap(wireshark就是调用该接口的函数实现包获取)。
Lwip作为一个应用程序,通过调用Libpacap接口下的API实现包的获取和发送。

2 windows下lwip的移植要点
(1) 移植说明:无操作系统模拟层
(2) 头文件移植:cc.h/perf.h/lwipopts.h
(3) 网卡驱动
pbuf结构
libpcap函数
(4) 一个任务
内核初始化
添加网卡管理结构
数据包处理与内核超时处理

RAW API
无操作系统模拟层的移植:lwip作为一个单独的进程,该进程中只有一个线程(单线程模型),lwip所有的代码运行在一个进程中,内核单线程读包,处理包,发送包。单线程通过回调的方式向内核注册调用某个函数(应用程序)。这种方式下,所有应用程序通过回调方式编程

SOCKET API

有操作系统模拟层:不再是单线程,在多线程环境下,lwip内核独占一个线程,网卡接收用一个线程,该线程从API中读网卡包,将读到的包放到lwip的一个队列上,lwip内核从队列中获取网卡包处理队列,同时应用程序也是在一个独立的线程中,APP的调用就是lwip发送一个消息,lwip内核则通过OS提供的信号量机制,邮箱机制通知APP有消息到达。
在这里插入图片描述

头文件移植说明:
sys_now : 返回系统当前时间
cc.h : 与处理器平台,编译器平台相关的定义,宏定义,包括:数据类型定义,自启方式,平台日志输出,参数格式定义

perf.h : 内核通过对某些参数进行测试的时候实现的宏
定义为null
lwipopts.h : 内核参数配置头文件:配置连接数,内核大小,若这些参数没有在该文件中定义则使用opt.h中的默认配置

网卡驱动移植:三个函数,一个重点
初始化函数:void low_level_init(struct netif * netif):初始化网卡

从网卡读取一个包:struct pbuf *low_level_input(struct netif * netif)

发送数据包:err_t low_level_output(struct netif * netif,struct pbuf *p)

Libpcap中与之对应的三个函数是:
初始化网卡:pcap_t *pcap_open_live(const cahr * device。。。。。。。
数据包接收函数:int pcap_dispatch(pcap_t * ,int 。。。。。。
发送函数:int pcap_sendpacket(pcap t *,const u_char *,int )

Pbuf结构体:
lwip基于windows移植的资料整理_第2张图片

一个任务:
内核初始化:
test.c文件中main()–main_loop()中
lwip_init():lwip内核初始化:也就是各个模块的初始化,包括:内存堆模块,内存池模块,网卡管理,ip模块,tcp模块。。。。。。
添加网卡:msvc_netif_init(void):实现将wincap的网卡驱动添加到内核中
数据包接收与超时处理:
test.c中,main()-main_loop():
sys_check_timeouts():检测超时,,,定时器
pcaif_poll(&netif):网卡数据的输入

你可能感兴趣的:(lwip基于windows移植的资料整理)