Chinaunix首页 | 论坛 | 博客
  • 博客访问: 389450
  • 博文数量: 62
  • 博客积分: 388
  • 博客等级: 一等列兵
  • 技术积分: 1032
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-03 20:18
文章分类

全部博文(62)

文章存档

2017年(5)

2016年(3)

2015年(3)

2014年(8)

2013年(15)

2012年(28)

分类: LINUX

2014-11-09 22:30:09

内核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的流程,让大家明白基于该机制的原理。
附注:
原理请参阅:<>
阅读(1243) | 评论(0) | 转发(0) |
0

上一篇:linux 内核网络钩子类型

下一篇:kernel socket

给主人留下些什么吧!~~