- 论坛徽章:
- 2
|
Godbach 发表于 2014-01-06 15:10 ![]()
回复 1# jasonsungblog
查路由啊。
请教下 如下代码中的FIXME部分:
- 对一个RX来的skb,其skb->dev代表着:该skb从哪个dev接受到的。
- 对一个TX的skb来说,其skb->dev代表着:该skb将从哪个dev发送出去。
- 那么,skb->dev是什么时候赋值的呢? rx的路径很好理解,nic driver再
- netdev_alloc_skb时,就已经把相应的net_device指针赋值给skb->dev了。
- tx呢? 以udp为例:
- udp_sendmsg
- flowi4_init_output
- ip_route_output_flow
- ..
- ip_make_skb
- udp_send_skb
- ip_send_skb
- ip_local_out
- __ip_local_out
- 从ip_send_skb到__ip_local_out,不曾对skb->dev做修改,而__ip_local_out
- 中已经直接实用skb_dst(skb)->dev作为包的输出设备了。
- 这说明,skb->dev的赋值,是在调用ip_send_skb之前,就已经完成了。
- udp_sendmsg
- /* FIXME: sk->sk_bound_dev_if是什么? 依照我的理解,是在
- * udp_prot的connect方法,也就是ip4_datagram_connect
- * 中,设置的:
- * ip4_datagram_connect
- * ip_route_connect
- */
- ipc.oif = sk->sk_bound_dev_if
- flowi4_init_output(fl4, ipc.oif, sk->sk_mark, tos,
- RT_SCOPE_UNIVERSE, sk->sk_protocol,
- inet_sk_flowi_flags(sk)|FLOWI_FLAG_CAN_SLEEP,
- faddr, saddr, dport, inet->inet_sport);
- /* NOTE: 这里给flowi4_oif赋值了 */
- fl4->flowi4_oif = ipc.oif
- ip_route_output_flow
- __ip_route_output_key
- struct net_device *dev_out = NULL;
- ..
- /* NOTE: 如果fl4的flowi4_oif不是0,那么,这里就从
- * if idex寻找dev_out了 -- 而上面的
- * flowi4_init_output中,已经给flowi4_oif
- * 赋值过了。
- */
- if (fl4->flowi4_oif)
- dev_out = dev_get_by_index_rcu(net,
- fl4->flowi4_oif);
- make_route:(label)
- __mkroute_output
- rt_dst_alloc(dev_out, ...)
- dst_alloc
- dst->dev = dev;
复制代码 |
|