当前位置: 技术问答>linux和unix
数据包从应用程序发向链路层过程中什么时候指定netdevice
来源: 互联网 发布时间:2016-06-27
本文导语: 最近小弟在学习linux内核协议栈,看代码的时候发现数据包从应用层发向链路层的过程比较复杂,如下: UDP发送是用的 udp_sendmsg() -> udp_push_pending_frames() -> ip_push_pending_frames...
最近小弟在学习linux内核协议栈,看代码的时候发现数据包从应用层发向链路层的过程比较复杂,如下:
UDP发送是用的 udp_sendmsg()
-> udp_push_pending_frames()
-> ip_push_pending_frames()
-> ip_local_out()
-> dst_output()
dst_output() 直接返回skb->dst->input(skb),
请教各位,
1. 这个skb->dst->input指针在哪里被初始化
2. 还有代码看下来发现没有地方设置netdevice, 那skb->dev到底是在哪里被设置的呢?
如蒙解答,不胜感激!
UDP发送是用的 udp_sendmsg()
-> udp_push_pending_frames()
-> ip_push_pending_frames()
-> ip_local_out()
-> dst_output()
dst_output() 直接返回skb->dst->input(skb),
请教各位,
1. 这个skb->dst->input指针在哪里被初始化
2. 还有代码看下来发现没有地方设置netdevice, 那skb->dev到底是在哪里被设置的呢?
如蒙解答,不胜感激!
|
楼主没搞错吧?dst_output() 直接返回skb->dst->input(skb),
我看的2.4和2.6都是返回skb->dst->output
1. 这个skb->dst->input指针在哪里被初始化
按照dst->output来看,一般来说,这个函数指针被初始化为:ip_output。也有些其它情况:
详情请参见:《understanding Linux network internals》35.5:Setting Functions for Reception and Transmission
2. 还有代码看下来发现没有地方设置netdevice, 那skb->dev到底是在哪里被设置的呢?
在net device的驱动中设置。如以太网设备,PPP等。
我看的2.4和2.6都是返回skb->dst->output
1. 这个skb->dst->input指针在哪里被初始化
按照dst->output来看,一般来说,这个函数指针被初始化为:ip_output。也有些其它情况:
详情请参见:《understanding Linux network internals》35.5:Setting Functions for Reception and Transmission
2. 还有代码看下来发现没有地方设置netdevice, 那skb->dev到底是在哪里被设置的呢?
在net device的驱动中设置。如以太网设备,PPP等。