内核pppoe接收发送数据包流程
2015-11-07 22:20
531 查看
http://blog.chinaunix.net/uid-22590270-id-3240990.html
内核pppoe接收发送数据包流程
数据结构
--------
struct asyncppp;
struct ppp;
struct channel;
ppp流程
-------
接收流程
(从伪终端从设备读出数据传到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_rcv_core()
sock_queue_rcv_skb() --> 加入到socket队列中,之后见socket流程。
发送流程
pppoe_sendmsg()
dev_queue_xmit()
这里就没什么好说的了
---------------------
关于PTY设备与pppoe的关系有机会我会找个应用层的pppoe来分析。
另外我之后会分析PF_PACKET的流程,让大家明白基于该机制的原理。
内核pppoe接收发送数据包流程
数据结构
--------
struct asyncppp;
struct ppp;
struct channel;
ppp流程
-------
接收流程
(从伪终端从设备读出数据传到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_rcv_core()
sock_queue_rcv_skb() --> 加入到socket队列中,之后见socket流程。
发送流程
pppoe_sendmsg()
dev_queue_xmit()
这里就没什么好说的了
---------------------
关于PTY设备与pppoe的关系有机会我会找个应用层的pppoe来分析。
另外我之后会分析PF_PACKET的流程,让大家明白基于该机制的原理。
相关文章推荐
- VS数据流向
- 典型环节的传递函数及其电路图-20151103
- 生活小思考
- [刷题丶数据结构]1.栈和队列
- JAVA使用DES加密算法加密解密
- 进程间的通信机制
- 看不懂
- Mybatis-解决字段名与实体类属性名不相同的冲突
- mysql 学习记录(二十五)--mysql日志
- 粒子群算法求解优化问题(c实现)
- android 在eclipse中把局部变量变成成员变量前自动加m
- Daily Scrum 11.7
- robotium 中获取相同类型的自控觉得获取方法(使用Android的ViewGroup控件的getChildAt(index)获取)
- 【用Script Editor创建复杂的对话框】
- 字符集和字符编码(Charset & Encoding)
- Springmvc返回json
- 《leetCode》:Reverse Nodes in k-Group
- log4j.properties 配置详解
- 孩子身高居然长这么快?