对于L5来说,recvfrom系统调用sys_recvfrom在/net/socket.c中,通过prepare_to_wait_exclusive等待skb的到来,从而唤醒它。
接收流程图
协议栈模块其实是块大头,研究不深入,就简要概括了。
----------------------------------纠结的分割线--------------------------------
六、进一步(路由模块):
还有一个很重要的模块就是内核路由子系统,它应该是工作在L3层。发送报文时会在L3层打好IP头前,路由到具体的网络设备,然后才进入L2填充以太网头。
路由的工作是通过函数ip_route_input()(/net/ipv4/route.c)实现的,对于进来的包可能的路由有这些:
属于本地的数据(即是需要传递给TCP,UDP,IGMP这些上层协议的) ;
需要要转发的数据包(网关或者NAT服务器之类的);
不可能路由的数据包(地址信息有误);
当路由发现是本地数据时,rth->u.dst.input = ip_local_deliver,返回后就可以在skb->dst->input(skb)中进入ip_local_deliver,找到对应的interface设备。如我们的eht0.y vlan虚拟设备,进入vlan处理流程。