Chinaunix首页 | 论坛 | 博客
  • 博客访问: 416276
  • 博文数量: 82
  • 博客积分: 2600
  • 博客等级: 少校
  • 技术积分: 961
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-08 21:44
文章分类
文章存档

2013年(2)

2012年(56)

2010年(24)

我的朋友

分类: LINUX

2012-06-12 22:01:38

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

上一篇:linux ppp pppoe

下一篇:kernel socket

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

khls272015-07-10 17:29:17

\"至此到为终端设备,而之后pppoe应用层程序会从伪终端主设备读取数据通过socket发送给pppoe,接下来看pppoe流程\"

用户态pppoe从ppp绑定的串口设备中读出数据后,采用raw socket直接发送出去了;博主提到的socket发送给pppoe(内核)没有衔接上吧? 这个差异是版本不一样有差异(我看的是2.6.31),还是博主这里没搞清楚,还是我理解有问题?