ip_output.c <-- 流出网关的ip处理 ip_output, ip流出的处理主体函数,处理的方式类似 包流入的处理,先是, a. 先判断要不要进行 ipfw的处理,是的话,跳转 d 处理 b. 嗯,要判断是不是来自 4层,看看是否要处理一下 IP 头 c. 看看路由表,这个包该何去何从? 不要忘了多播哟! 当然了,如果是 IP的广播包,也要处理的。 例如 PPPOE 会发送 IP的广播包 d. 又开始 ipfw 和 ipfilter的处理了 e. 对于 loopback的包,怎么能放出去呢,丢掉它 f. ip包 DF了吗,包太大又不让分拆的话,只好对不 起了,丢弃它。否则拆分它,形成成mbuf簇,每个 簇由多个链构成。ip_fragment做的就是这件事 包转发几乎涉及不到包重组。 g. 到此,终于可以通过 if_ouput-- ether_output 将包传送到了二层 ---------------------------------------------------------------------- 在三层上,是各种安全处理的最佳地点,这时候,原始的包该处理的都处理,剩下的 就是怎么根据 IP完成各种各样的规则处理了。在这一层,数据包可以被还原为一个 发送方的 IP包,并能够进一步解包成tcp/udp,形成会话甚至应用。 由于分层的结构,采用 SMP对包作进一步处理时,并不会对下层造成很大的影响(mbuf 处理不及时,造成mbuf耗尽等等)
4. 二层--ether_output if_ethersubr.c <-- ether_output: a. 需要判断路由? 那就看看,不合适的话就丢弃这个包 b. 看看 arp表,有目的地址的MAC? 没有就去要一个回 来,没要来? 那就返回吧,出不去了。 c. 添加 ether_header d. 什么,目标地址是自己,if_simloop 这个包 e. 看看 netgraph要处理吗? f. 将包转给 ether_output_frame继续处理
<-- ether_output_frame a. 网桥要处理吗? b. ipfw 还要处理一下? c. 都处理完了吧,那就把包送到网卡的输出队列中吧, 等候网卡驱动处理了