PPP和GSM
作者:互联网
PPP(Point-to-Point)提供了一种标准的方法在点对点链接上传输多种协议数据包,它最常见的用途可能是拨号上网了,网络应用程序使用PPP程序作为和GSM模块之间的协议
PPP协议之下是以太网,串口等物理层,之上是IP层,发送数据时,IP数据包经过PPP打包之后在经过以太网或者串口进行发送,接受时数据通过PPP解包之后送给IP层,PPP协议不仅提供简单的数据链路层功能,还提供了鉴权(PAP/CHAP),数据压缩和解压,加密和机密功能,应用程序要求使用透明化,不关心这些细节。
pppd是一个后台服务程序,把策略性的内容从内核的PPP协议模块中移到了pppd中,pppd实现了所有的鉴权,压缩/解压,加密/解密等扩展功能的控制协议,pppd和内核PPP模块之间使用设备文件进行通信,设备文件名是/dev/ppp,通过read系统调用,pppd可以读取PPP协议处理模块的数据包,通过write调用,pppd模块可以把要发送的数据传递给PPP协议处理模块。在pppd里,每种协议的实现都在独立的C文件中。
Chat是pppd的一个辅助工具,用于和GSM模组建立会话,它的实现比较简单,想串口发送AT命令,建立GSM模块和主机的会话,以便让PPP协议可以在串口上传输数据包,
pppd在make_ppp_unit函数中,调用ioctrl(PPPIOCNEWUNIT)创建一个ppp0接口,内核的PPP协议模块在处理PPPIOCNEWUNIT时,会调用register_netdev接口注册一个网络设备,该网络的设备的传输函数为ppp_start_xmit,当应用程序发送数据时,根据IP地址和路由表找到ppp0接口,然后调用ppp_start_xmit发送数据,此时数据就到ppp协议模块了,具体调用为ppp_start_xmit->ppp_xmit_process->ppp_send_frame,ppp_send_frame根据设置,调用压缩加密等之后经过ppp_push调用pch->chan->ops->start_xmit发送数据包
pch->chan->ops->start_xmit是具体的发送方式,必然串口发送,则是ppp_asynctty_open中注册的ppp_async_send函数,ppp_async_send经过ppp_async_push函数调用tty->driver->write把数据发送串口
用户数据发送如下图所示:
pppd的控制协议数据发送如下图:
ppp_async.c在初始化(ppp_async_init)调用tty_register_ldisc向tty注册了处理函数,时当串口收到数据时会调用ppp_ldisc的ppp_asynctty_receive函数接收数据,ppp_asynctty_receive->ppp_async_input把数据buff转换成sk_buf,最终调用ppp_input函数让PPP协议处理模块处理该数据包,
在ppp_input函数中,数据被分成两路,一路是控制协议数据包交给pppd处理,另一类是用户数据包经过ppp_do_recv/ppp_receive_frame进行ppp处理之后再由netif_rx提交给上层协议处理,最后经socket传递到应用程序,
标签:调用,数据包,PPP,pppd,ppp,串口,GSM 来源: https://www.cnblogs.com/sudochen/p/15950372.html