内核pppoe接收发送数据包流程
数据结构
--------
--------
struct asyncppp;
struct ppp;
struct channel;
ppp流程
-------
-------
接收流程
(从伪终端从设备读出数据传到TCP/IP到应用层)
(从伪终端从设备读出数据传到TCP/IP到应用层)
ppp_async.c注册tty设备,ppp_asynctty_receive为设备ops。
ppp_asynctty_receive() --> ppp_async.c
ppp_async_input()
process_input_packet() --> 插入队列,
ppp_async_process() --> 由软中断触发
ppp_input() --> ppp_generic.c
ppp_do_recv()
ppp_receive_frame()
ppp_receive_nonmp_frame()
netif_rx() --> 传递到了dev.c手中,传到TCP/IP。
发送流程
(从应用层发送到伪终端)
之前的就不述说了
ip_finish_output2()
dev_queue_xmit()
dev_hard_start_xmit()
ppp_start_xmit() --> ppp_generic.c,由ops的ndo_start_xmit传递。
skb_queue_tail()
ppp_xmit_process()
ppp_send_frame()
ppp_push()
pch->chan->ops->start_xmit() -->ppp_asynctty_open()时调用ppp_register_channel()来赋值
ppp_async_send()
ppp_async_push()
tty->ops->write()
至此到为终端设备,而之后pppoe应用层程序会从伪终端主设备读取数据通过socket发送给pppoe,接下来看pppoe流程。
pppoe流程
---------
(基于PF_PPPOX协议)
接收流程
netif_receive_skb()
__netif_receive_skb() --> 检索pppoe中dev_add_pack()添加的包
deliver_skb()
pt_prev->func() --> 执行pppoes_ptype中的func()
pppoe_rcv() --> session流程,发现阶段略
sk_receive_skb()
sk_backlog_rcv()
sk->sk_backlog_rcv() --> 在pppoe_create()中赋值,创建PF_PPPOX相关socket时调用(见socket流程)
(有些应用层pppoe直接用PF_PACKET来做,获取所有内核收到的的数据包的一份拷贝,也就是说直接略过了这个流程)
(有些应用层pppoe直接用PF_PACKET来做,获取所有内核收到的的数据包的一份拷贝,也就是说直接略过了这个流程)
pppoe_rcv_core()
sock_queue_rcv_skb() --> 加入到socket队列中,之后见socket流程。
发送流程
pppoe_sendmsg()
dev_queue_xmit()
这里就没什么好说的了
---------------------
关于PTY设备与pppoe的关系有机会我会找个应用层的pppoe来分析。
另外我之后会分析PF_PACKET的流程,让大家明白基于该机制的原理。
附注:
原理请参阅:<>