以ping包发送过程分析ipsec执行(草稿)

来源:互联网 发布:中华网络传奇一条龙 编辑:程序博客网 时间:2024/06/05 16:49

ping包发送过程分析:

1、安全路径查找和创建

ping_sendmsg ------> ip_route_output_flow----->xfrm_lookup这里面会查找安全路由,或者是根据源、目的IP地址找到SPD项,再找到SAD项后创建安全路由,安全路由最终会把数据包导到ah4_output\esp4_output做相应的填充ah\esp填充

2、执行安全路径
ping_sendmsg ------> ping_push_pending_frames ------->ip_push_pending_frames-------->ip_finish_skb-------->__ip_make_skb
                |------------->ip_send_skb---------->ip_local_out------------>skb->dst->output(skb)dst_output()函数就是调用路由项的输出函数, 对于安全路由, 该函数是xfrm4_output()函数, 对于普通路由, 是ip_output()函数


xfrm4_output{x->outer_mode->afinfo->output_finish,这里执行的就是xfrm4_output_finish}----->xfrm4_output_finish----->xfrm_output------->xfrm_output2------>xfrm_output_resume------->xfrm_output_one,在这个函数里面执put行的x->outer_mode->output(x, skb)中output就是ah_output或者esp_output来填充ah\esp相关字段到skb


xfrm_output_resume--------->skb_dst(skb)->ops->local_out(skb)这里执行的是struct dst_ops xfrm4_dst_ops的ops->local_out,也就是__ip_local_out函数,这时候执行的是ip_output----->ip_finish_output---->ip_finish_output2------>__ipv4_neigh_lookup_noref查找邻居子系统的缓存表,也就是arp缓存表找IP对应的mac地址,如果找不到就发arp广播后创建arp邻居


ip_finish_output2--------->__neigh_create(&arp_tbl,.....)中创建的arp邻居,也就是执行struct neigh_table arp_tbl的成员函数arp_constructor来创建,这个arp邻居中两个重要的成员neigh->ops = &arp_direct_ops;neigh->output = neigh_direct_output;见arp_constructor()函数

ip_finish_output2--------->dst_neigh_output(){n->output(n, skb)}------>neigh_direct_output()------>dev_queue_xmit(skb)


0 0
原创粉丝点击