L2以下の送信処理

カーネルレベルのtunnelingとかしてる場合にどんなパスを通るのか良く分からなかったんで、ちと読んでみた。

Ethernetの場合

ip_output -> ip_finish_output -> (パケットサイズがMTUを超える時のみ ip_fragment) -> ip_finish_output2 -> neigh_output -> n->output -> neigh_connected_output (dev_hard_header -> eth_header) -> dev_queue_xmit -> __dev_xmit_skb -> sch_direct_xmit -> dev_hard_start_xmit -> ops->ndo_start_xmit -> e1000_xmit_frame

L2TPの場合

ip_output -> ip_finish_output -> (パケットサイズがMTUを超える時のみ ip_fragment) -> ip_finish_output2 -> neigh_output -> neigh_hh_output -> dev_queue_xmit -> dev_hard_start_xmit -> ops->ndo_start_xmit -> l2tp_eth_dev_xmit -> l2tp_xmit_skb -> l2tp_xmit_core -> ip_queue_xmit -> ip_local_out -> __ip_local_out -> dst_output -> skb_dst(skb)->output ...


多分だけれども、neigh_outputからneigh_hh_output(n->outputへ行っちゃうとARPになっちゃうのでこの場合はneigh_hh_outputだと思う)、dev_queue_xmitからdev_hard_start_xmit(コメントにトンネリングとかはこっちって書いてある)、というパスを通る事によってtunnelingデバイスのハンドルが行われるのかな、という予想。